线性CCD——从原理到跑路,适用于Arduino的底层驱动分析
一. 原理及功能
CCD是一種電荷耦合器件,他可以將接收到的光信號轉換為電荷量存儲并通過耦合的方式將信號傳輸給MCU(微處理器)。CCD一般用于攝像頭之中,可以在X軸Y軸兩個方向同時檢測。而像掃描儀,一次智能檢測一條線上光強的方式,就稱之為線性CCD。
上一段是來自百度對CCD的解釋的概述。如果讀者讀到這里還是不明白線性CCD究竟是一個什么樣的東西,沒有關系。相信讀者看到這篇文章的時候,多少因該接觸過一些單片機編程和常用的模塊了。CCD的功能和灰度模塊很類似,如果讀者也沒用過灰度模塊,沒事,下面我將簡單講解原理?;叶饶K之中,其實最主要的部分是一個光敏三極管,當基集有光照射時,那么集電極與發射極會導通,產生一個電流,那當電流流過電阻時,就會在電阻兩端產生一個電壓,電流越大,在電阻上的壓降就越大。因此根據此原理,即可通過電壓的大小判斷當前光亮的大小(檢測物體反射回的光亮)。一上設計到數電的一些專業知識,如果讀者不懂無需理會,只要知道功能即可即檢測物體返回的光亮輸出一個對應的電壓。根據白色返回光的大部分波段,黑色材質吸收光的大部分波段的物理現象來看,即被檢測物體顏色越淺,輸出電壓值越高,反之電壓越小。綜上所述就是白色輸出高電平,黑色輸出低電平。
而線性CCD的線性與之類似但不是同一個檢測原理。讀者可以將線性CCD理解為一個內部集成了128個灰度模塊的傳感器,一個灰度模塊對應一個檢測點,那么線性CCD就是在一條直線上均勻分布了128個檢測點而已。
圖1.1 線性CCD內部傳感部件–TSL1401CL
以上是線性CCD的工作原理,那么接下來就是對其功能和應用場合的一個簡要論述。
在生活中,其最主要的應用就是掃描機,用于復印或者將紙質文字圖片變成電子文件保存。而在工業中,常將其用于對待加工零件位置的檢測。比如說貼片機,為了準確夾取芯片,必須準確的分別正反以及位置,那么通過兩個垂直的線性CCD在X軸和Y軸兩個方向同時檢測,就可以獲取準確的位置參數和外輪廓特征即大小。
二. 時序圖分析
相信讀者因該都接觸過電腦,對驅動這個詞因該不會太過陌生。那么何為驅動呢?不知到讀者在編程的時候,有沒有想過一些語句,為什么能實現該功能,這條語句在單片機內部究竟是怎么運行的呢?比如說最簡單的引腳初始化語句,在Arduino里是pinMode()語句,51或者32里面是GPIO_Init()之類的語句??赡軇傞_始學的時候就單純的記住這句話可以用來初始化引腳,讓引腳可以讀取或者輸出電平。但是細想之后就會發現,無論是單片機還是電腦里的CPU,內部的數據都是在寄存器里,而寄存器只能存儲0和1.那么,究竟這條語句是如何將我們熟悉的C語言命令轉換為機器可讀的單片機指令的呢?這就是底層的驅動程序。
那么相應的,線性CCD也有自己驅動方式,只有為引腳在適當的時刻加上合適的電壓才能正確的輸出我們想要的檢測值出來,這是我們編寫線性CCD驅動的基礎。
再將之前呢,首先呢筆者要給各位讀者灌輸一個概念:我們是做項目開發的而不是研發(注意開發和研發的區別),因此我們是使用別人的產品去開發出新的東西出來。因此我們無需太多了解所用產品的內部原理和加工參數細節,就算想知道也沒地方找,因為那都是人家公司的核心資料,發布出來公司就倒閉了不是?我們只要根據廠家提供的Datesheet(可以理解為產品說明書吧),知道每個引腳的作用和功能即可,學會如何操作即可。
那下面我們進入正題,分析時序圖!
時序圖分析是數電中一大重點,其實數電這么課最重要的不是那些編碼器、譯碼器,最重要的就是分析時序圖的本領,希望讀者可以真的學會如何學習大學里的知識。
圖2.1 時序圖
圖2.1是模塊的時序圖,TSL1401CL一共有八個引腳,出去兩個沒用的空引腳外,還有一個VCC和兩個GND引腳用于供電,剩下三個引腳就是最關鍵的控制引腳CLK、SI、AO。這里解釋以下CLK引腳的功能,因為幾乎所有的地方都會見到這個單詞,根據字面意思理解,它是引文時鐘Clock的縮寫,作用和字面意思一樣是為芯片提供一個時鐘信號,讓其根據這個時間速度工作??赡茏x者看到這里有點模糊,筆者剛開始學的時候看到這些解釋也很不理解,但是沒關系,你很幸運,拿到了筆者謝的開發筆記,哈哈。筆者在這里舉一個例子。加入你在上課,老師要求你每聽到一個英文單詞時就記錄下來,那么老師講的英文單詞就是CLK的電平的一次上升和下降(假設老師說單詞的時候是高電平,那么說完之后安靜的那段時間就是低電平),你去記錄單詞就相當于芯片去執行一條命令或者操作。那老師說單詞的速度越快,相應的來說你工作的速度就越快。不知讀者讀完這句話后是否明白了呢。
下面我們對時序圖展開分析。我們看到CLK時鐘一直是一條規律的脈沖信號,而SI引腳只出現了一個短暫的脈沖,那么此時讀者就需要注意了,因為這個特別的高電平脈沖肯定有著什么特別的作用。我們再看AO引腳,當SI出現了高電平脈沖后,相應的AO引腳就開始不斷對外輸出電壓信號,可以看到,一直連續輸出了128個時鐘周期,那么對應的就是128個檢測點的時鐘信號。需要注意的是SI高電平出現的時間,看圖發現,SI高電平出現的主要部分都集中在了CLK信號的低電平時間,那么當CLK信號再一次出現高電平并且SI仍為高電平時,AO就開始對外發送信號,所以,掌握時間節點很重要。
單片機或者開發環境下的線性CCD的驅動程序編寫。
下面就對代碼逐條分析。
首先需要在說一點,線性CCD是根據光照的一個儲能元件,他會根據光照強度的不同電容器儲存電荷的速度不一樣,但是由于電容大小非常小,也就是說不管速度相差多大,在很短的時間內所有的電容器都會被充滿,速度可能比我們眨一下眼睛還要快,因此我們在使用時,需要做的第一步就是先把電容器中的電荷全部釋放出來,也就是先讀取一邊當前各個監測點的電壓值,但是數據不保存,讀取后全部扔掉即可,就是我們所說的丟包,只不過這是我人為的而已。
先看前三條代碼:
int exp_time = 5000;
int piexl[129];
int i = 0;
首先定義一個變量exp_time,該變量用來存儲曝光的時間,后面會用到。接著我們定義了一個129個元素的數組??赡茏x到這里讀者會有一個疑問,那就是,為什么是129個而不是128個,不是說只有128個檢測點嗎,多出來的一個是存放什么的呢?多出來的一個肯定不是用來放著好玩的啦,它的作用是存放結束位。為了方便調試,開發者們編寫了一個上位機軟件,可以將輸出的值轉化成灰度圖顯示給讀者看。但是計算機如何知道哪里是數據的開頭,哪里是結尾呢,就看最后一個結束位,其值為FF。當檢測到這個值時上位機就認為一個數組被讀取到了。變量i是為for循環工作用的,不必多理會。
再看接下來的四條代碼:
digitalWrite(CCD_SI,HIGH); //SI拉高電平
digitalWrite(CCD_CLK,HIGH); //時鐘高電平
digitalWrite(CCD_SI,LOW); //SI低電平
digitalWrite(CCD_CLK,LOW); //時鐘低電平
這四條代碼就很關鍵,這四條代碼模擬的就是時序圖中的時鐘脈沖和SI信號,具體筆者就不再細講,讀者可以自行參考上文。不過需要注意的是,這四條代碼就是讓CCD開始輸出信號的關鍵,因此需要讀者仔細理解體會其中意思。
下面是將CCD中已經積累的電荷釋放掉。
for(i=0;i<128;i++)
{
digitalWrite(CCD_CLK,HIGH);digitalWrite(CCD_CLK,LOW);} //從這里完成電壓的釋放
通過一個for循環,不斷模擬CLK時鐘信號,讓CCD中存儲的電壓值全部釋放出來,以防干擾到后續檢測,重新存儲電壓值。
下面才真正的將檢測信號輸出并存儲到數組之中。
digitalWrite(CCD_SI,HIGH);
digitalWrite(CCD_CLK,HIGH);
digitalWrite(CCD_SI,LOW);
digitalWrite(CCD_CLK,LOW);
for(i=0;i<128;i++)
{
digitalWrite(CCD_CLK,HIGH);piexl[i]=analogRead(A0);digitalWrite(CCD_CLK,LOW);}
同樣四條代碼開始對外輸出數據。
接著下面的for循環是模擬CLK時鐘信號。請讀者注意和上方for循環的不同,這里的for循環里多了一條數組賦值語句,這里才將輸出的值存儲到數組之中,用以調用。
代碼例程下載:鏈接:https://pan.baidu.com/s/1QBpWVemWZ2lzCGboJ2ExMw
提取碼:6ca5
總結
以上是生活随笔為你收集整理的线性CCD——从原理到跑路,适用于Arduino的底层驱动分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: beyond compare 4官方中文
- 下一篇: unity 输入框弹出输入法_国产输入法