<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/video_transmission" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
首先能夠使用MCU讀取攝像頭數據並不是什么高端和困難的事情!
攝像頭如何采集的圖像,MCU如何讀取的圖像數據
1.攝像頭都是集成了感光片和感光片采集芯片的.
感光片就是有很多采集點
如果說一個攝像頭是 240*320的
就是說橫着有240個采集點,豎着有320個采集點,共76800個采集點
2.以OV7670為例
假設使用單片機控制感光采集芯片采集240*320個像素點,模式輸出是RGB422
3.3V和GNG -- 攝像頭供電
-------------------------------------------------------------------------
SDA和SCL為IIC配置攝像頭的引腳
可以設置攝像頭具體橫豎采集的像素點個數
可以設置采集模式,列如:RGB 422(就是說一個像素點用 8位數據表示 ,前面4位代表紅色,中間2位代表藍色,最后2位代表綠色)
列如: 采集的數據是 0xF0 (1111 0000) 就是純綠色
采集的數據是 0x00 (0000 1100) 就是純藍色
采集的數據是 0x00 (0000 1000) 就是不怎么藍的顏色
有可能有人會問這顏色識別的有點不好呀,分辨率有點低.其實有RGB565,但是呢為了方便敘述,咱先按照RGB422來講解.
-------------------------------------------------------------------------
VS (VSYNC) ----攝像頭工作的時候,這個引腳來一個高脈沖說明攝像頭開始采集一副圖像了(采集240*320個像素點)
注意哈,一般咱們把開始采集一副圖像就做開始采集一幀圖像
一般攝像頭采集是從左到右 從上到下采集,當然也可以使用IIC發送命令給感光片采集芯片控制它采集的模式
-------------------------------------------------------------------------
HS (HREF) ---- 當這個引腳變為高電平,說明攝像頭正在輸出某一行像素點
假設是剛開始采集,那么這個引腳第一次變為高電平,說明攝像頭正在輸出第一行的像素點(從左到右 240個)
第一行的像素點采集完了,就會變為低電平,然后開始采集第二行,這個引腳又會主動變為高電平
然后就是這樣子循環.
-------------------------------------------------------------------------
PLK ---- 當這個引腳變為高電平,說明攝像頭正在輸出一個像素點的數據
假設是剛開始采集,那么這個引腳第一次變為來一個高脈沖,說明攝像頭正在輸出第一行的第一個像素點的數據
-------------------------------------------------------------------------
D0 - D7引腳 ---- 這個是輸出實際像素點采集的數據的引腳
配合上面的 PLK引腳,當PLK引腳來一個高脈沖以后,讀取D0 - D7引腳的值
便可獲取采集的像素點的數據.假設是剛開始采集采集的數據是 1111 0000 (0xF0)
就說明采集的第一行的第一個像素點的數據是 0xF0 純綠色
3.最后總結
假設是 240*320
VS (VSYNC) , HS (HREF) 和 PLK 引腳都接到單片機的中斷引腳上
D0 - D7 接到單片機的隨意8個引腳上
當檢測到 VS (VSYNC) 來了一個高脈沖說明開始采集一幀圖像了
然后檢測 HS (HREF) 引腳變為了高電平
說明開始采集一行圖像了,然后只要PLK引腳來一個高脈沖,說明攝像頭輸出了
一個像素點的數據,然后單片機讀取 D0 - D7 就獲取了數據了
然后通過 PLK 和 D0 - D7就可以獲取第一行的 240個數據
第一行輸出完成 HS (HREF) 引腳變為了低電平
開始輸出第二行的時候 HS (HREF) 引腳變為了高電平
然后只要PLK引腳來一個高脈沖,說明攝像頭輸出了
一個像素點的數據,然后單片機讀取 D0 - D7 就獲取了數據了
然后通過 PLK 和 D0 - D7就可以獲取第二行的 240個數據
然后就是循環采集320行數據.
4.難在哪里呢?
從上面的介紹可以看出好像挺簡單的
那難在哪里呢?
1.難點1
大部分人的基礎知識不夠,就是說連基本的IIC通信,中斷采集都不會
注意哈,我說的是會!!!
列如我問下: 等待芯片應答具體是啥?
發送非應答具體是啥??
2.難點2
攝像頭輸出的頻率實在是太快了
真的是太快了!!!!一般的單片機達不到這種速度
咱們只看 PCLK 的輸出速度哈
下圖中大概是 PCLK的高電平時間 大概是8ns
整個周期才16ns .....這是普通單片機做不到的
一般情況下就是72M主頻的STM32F103 執行中斷的時間也是約1us
即使是關閉所有的其它外設,中斷時間也只能達到 400ns
5,速度達不到的單片機可以選擇帶FIFO芯片的攝像頭模組
FIFO的作用是啥?
FIFO芯片是和攝像頭的感光芯片直接通信,然后把圖像緩存到FIFO芯片里面.
單片機讀取數據的時候是和FIFO芯片通信, 單片機還是需要連接VSYNC引腳
發現該引腳有個下降沿之后,給FIFO_RCK引腳持續的脈沖,數據就從D0-D7輸出了.
注意一個事情:當VSYNC來了下降沿之后一般需要延時一會再去讀取, 就是等圖像數據確實已經存儲到了FIFO.
一般單片機的主頻趕不上攝像頭采集圖像的速度,所以一直給脈沖讀取數據就可以,但是你這個需要自己測試哈
如果單片機的主頻特別快.....你可以再去檢測下HREF引腳, 然后也許需要加點延時以后再去讀取.
補充
1.關於模擬攝像頭
模擬攝像頭就是采集到數據以后變為模擬信號輸出在一根線上,具體可百度PAL