日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性CCD——从原理到跑路,适用于Arduino的底层驱动分析

發(fā)布時(shí)間:2023/12/8 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性CCD——从原理到跑路,适用于Arduino的底层驱动分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一. 原理及功能

CCD是一種電荷耦合器件,他可以將接收到的光信號轉(zhuǎn)換為電荷量存儲并通過耦合的方式將信號傳輸給MCU(微處理器)。CCD一般用于攝像頭之中,可以在X軸Y軸兩個(gè)方向同時(shí)檢測。而像掃描儀,一次智能檢測一條線上光強(qiáng)的方式,就稱之為線性CCD。

上一段是來自百度對CCD的解釋的概述。如果讀者讀到這里還是不明白線性CCD究竟是一個(gè)什么樣的東西,沒有關(guān)系。相信讀者看到這篇文章的時(shí)候,多少因該接觸過一些單片機(jī)編程和常用的模塊了。CCD的功能和灰度模塊很類似,如果讀者也沒用過灰度模塊,沒事,下面我將簡單講解原理。灰度模塊之中,其實(shí)最主要的部分是一個(gè)光敏三極管,當(dāng)基集有光照射時(shí),那么集電極與發(fā)射極會導(dǎo)通,產(chǎn)生一個(gè)電流,那當(dāng)電流流過電阻時(shí),就會在電阻兩端產(chǎn)生一個(gè)電壓,電流越大,在電阻上的壓降就越大。因此根據(jù)此原理,即可通過電壓的大小判斷當(dāng)前光亮的大小(檢測物體反射回的光亮)。一上設(shè)計(jì)到數(shù)電的一些專業(yè)知識,如果讀者不懂無需理會,只要知道功能即可即檢測物體返回的光亮輸出一個(gè)對應(yīng)的電壓。根據(jù)白色返回光的大部分波段,黑色材質(zhì)吸收光的大部分波段的物理現(xiàn)象來看,即被檢測物體顏色越淺,輸出電壓值越高,反之電壓越小。綜上所述就是白色輸出高電平,黑色輸出低電平。

而線性CCD的線性與之類似但不是同一個(gè)檢測原理。讀者可以將線性CCD理解為一個(gè)內(nèi)部集成了128個(gè)灰度模塊的傳感器,一個(gè)灰度模塊對應(yīng)一個(gè)檢測點(diǎn),那么線性CCD就是在一條直線上均勻分布了128個(gè)檢測點(diǎn)而已。

圖1.1 線性CCD內(nèi)部傳感部件–TSL1401CL

以上是線性CCD的工作原理,那么接下來就是對其功能和應(yīng)用場合的一個(gè)簡要論述。

在生活中,其最主要的應(yīng)用就是掃描機(jī),用于復(fù)印或者將紙質(zhì)文字圖片變成電子文件保存。而在工業(yè)中,常將其用于對待加工零件位置的檢測。比如說貼片機(jī),為了準(zhǔn)確夾取芯片,必須準(zhǔn)確的分別正反以及位置,那么通過兩個(gè)垂直的線性CCD在X軸和Y軸兩個(gè)方向同時(shí)檢測,就可以獲取準(zhǔn)確的位置參數(shù)和外輪廓特征即大小。

二. 時(shí)序圖分析

相信讀者因該都接觸過電腦,對驅(qū)動這個(gè)詞因該不會太過陌生。那么何為驅(qū)動呢?不知到讀者在編程的時(shí)候,有沒有想過一些語句,為什么能實(shí)現(xiàn)該功能,這條語句在單片機(jī)內(nèi)部究竟是怎么運(yùn)行的呢?比如說最簡單的引腳初始化語句,在Arduino里是pinMode()語句,51或者32里面是GPIO_Init()之類的語句。可能剛開始學(xué)的時(shí)候就單純的記住這句話可以用來初始化引腳,讓引腳可以讀取或者輸出電平。但是細(xì)想之后就會發(fā)現(xiàn),無論是單片機(jī)還是電腦里的CPU,內(nèi)部的數(shù)據(jù)都是在寄存器里,而寄存器只能存儲0和1.那么,究竟這條語句是如何將我們熟悉的C語言命令轉(zhuǎn)換為機(jī)器可讀的單片機(jī)指令的呢?這就是底層的驅(qū)動程序。

那么相應(yīng)的,線性CCD也有自己驅(qū)動方式,只有為引腳在適當(dāng)?shù)臅r(shí)刻加上合適的電壓才能正確的輸出我們想要的檢測值出來,這是我們編寫線性CCD驅(qū)動的基礎(chǔ)。

再將之前呢,首先呢筆者要給各位讀者灌輸一個(gè)概念:我們是做項(xiàng)目開發(fā)的而不是研發(fā)(注意開發(fā)和研發(fā)的區(qū)別),因此我們是使用別人的產(chǎn)品去開發(fā)出新的東西出來。因此我們無需太多了解所用產(chǎn)品的內(nèi)部原理和加工參數(shù)細(xì)節(jié),就算想知道也沒地方找,因?yàn)槟嵌际侨思夜镜暮诵馁Y料,發(fā)布出來公司就倒閉了不是?我們只要根據(jù)廠家提供的Datesheet(可以理解為產(chǎn)品說明書吧),知道每個(gè)引腳的作用和功能即可,學(xué)會如何操作即可。

那下面我們進(jìn)入正題,分析時(shí)序圖!

時(shí)序圖分析是數(shù)電中一大重點(diǎn),其實(shí)數(shù)電這么課最重要的不是那些編碼器、譯碼器,最重要的就是分析時(shí)序圖的本領(lǐng),希望讀者可以真的學(xué)會如何學(xué)習(xí)大學(xué)里的知識。

圖2.1 時(shí)序圖

圖2.1是模塊的時(shí)序圖,TSL1401CL一共有八個(gè)引腳,出去兩個(gè)沒用的空引腳外,還有一個(gè)VCC和兩個(gè)GND引腳用于供電,剩下三個(gè)引腳就是最關(guān)鍵的控制引腳CLK、SI、AO。這里解釋以下CLK引腳的功能,因?yàn)閹缀跛械牡胤蕉紩姷竭@個(gè)單詞,根據(jù)字面意思理解,它是引文時(shí)鐘Clock的縮寫,作用和字面意思一樣是為芯片提供一個(gè)時(shí)鐘信號,讓其根據(jù)這個(gè)時(shí)間速度工作。可能讀者看到這里有點(diǎn)模糊,筆者剛開始學(xué)的時(shí)候看到這些解釋也很不理解,但是沒關(guān)系,你很幸運(yùn),拿到了筆者謝的開發(fā)筆記,哈哈。筆者在這里舉一個(gè)例子。加入你在上課,老師要求你每聽到一個(gè)英文單詞時(shí)就記錄下來,那么老師講的英文單詞就是CLK的電平的一次上升和下降(假設(shè)老師說單詞的時(shí)候是高電平,那么說完之后安靜的那段時(shí)間就是低電平),你去記錄單詞就相當(dāng)于芯片去執(zhí)行一條命令或者操作。那老師說單詞的速度越快,相應(yīng)的來說你工作的速度就越快。不知讀者讀完這句話后是否明白了呢。

下面我們對時(shí)序圖展開分析。我們看到CLK時(shí)鐘一直是一條規(guī)律的脈沖信號,而SI引腳只出現(xiàn)了一個(gè)短暫的脈沖,那么此時(shí)讀者就需要注意了,因?yàn)檫@個(gè)特別的高電平脈沖肯定有著什么特別的作用。我們再看AO引腳,當(dāng)SI出現(xiàn)了高電平脈沖后,相應(yīng)的AO引腳就開始不斷對外輸出電壓信號,可以看到,一直連續(xù)輸出了128個(gè)時(shí)鐘周期,那么對應(yīng)的就是128個(gè)檢測點(diǎn)的時(shí)鐘信號。需要注意的是SI高電平出現(xiàn)的時(shí)間,看圖發(fā)現(xiàn),SI高電平出現(xiàn)的主要部分都集中在了CLK信號的低電平時(shí)間,那么當(dāng)CLK信號再一次出現(xiàn)高電平并且SI仍為高電平時(shí),AO就開始對外發(fā)送信號,所以,掌握時(shí)間節(jié)點(diǎn)很重要。

單片機(jī)或者開發(fā)環(huán)境下的線性CCD的驅(qū)動程序編寫。

下面就對代碼逐條分析。

首先需要在說一點(diǎn),線性CCD是根據(jù)光照的一個(gè)儲能元件,他會根據(jù)光照強(qiáng)度的不同電容器儲存電荷的速度不一樣,但是由于電容大小非常小,也就是說不管速度相差多大,在很短的時(shí)間內(nèi)所有的電容器都會被充滿,速度可能比我們眨一下眼睛還要快,因此我們在使用時(shí),需要做的第一步就是先把電容器中的電荷全部釋放出來,也就是先讀取一邊當(dāng)前各個(gè)監(jiān)測點(diǎn)的電壓值,但是數(shù)據(jù)不保存,讀取后全部扔掉即可,就是我們所說的丟包,只不過這是我人為的而已。

先看前三條代碼:

int exp_time = 5000;

int piexl[129];

int i = 0;

首先定義一個(gè)變量exp_time,該變量用來存儲曝光的時(shí)間,后面會用到。接著我們定義了一個(gè)129個(gè)元素的數(shù)組。可能讀到這里讀者會有一個(gè)疑問,那就是,為什么是129個(gè)而不是128個(gè),不是說只有128個(gè)檢測點(diǎn)嗎,多出來的一個(gè)是存放什么的呢?多出來的一個(gè)肯定不是用來放著好玩的啦,它的作用是存放結(jié)束位。為了方便調(diào)試,開發(fā)者們編寫了一個(gè)上位機(jī)軟件,可以將輸出的值轉(zhuǎn)化成灰度圖顯示給讀者看。但是計(jì)算機(jī)如何知道哪里是數(shù)據(jù)的開頭,哪里是結(jié)尾呢,就看最后一個(gè)結(jié)束位,其值為FF。當(dāng)檢測到這個(gè)值時(shí)上位機(jī)就認(rèn)為一個(gè)數(shù)組被讀取到了。變量i是為for循環(huán)工作用的,不必多理會。

再看接下來的四條代碼:

digitalWrite(CCD_SI,HIGH); //SI拉高電平

digitalWrite(CCD_CLK,HIGH); //時(shí)鐘高電平

digitalWrite(CCD_SI,LOW); //SI低電平

digitalWrite(CCD_CLK,LOW); //時(shí)鐘低電平

這四條代碼就很關(guān)鍵,這四條代碼模擬的就是時(shí)序圖中的時(shí)鐘脈沖和SI信號,具體筆者就不再細(xì)講,讀者可以自行參考上文。不過需要注意的是,這四條代碼就是讓CCD開始輸出信號的關(guān)鍵,因此需要讀者仔細(xì)理解體會其中意思。

下面是將CCD中已經(jīng)積累的電荷釋放掉。

for(i=0;i<128;i++)

{

digitalWrite(CCD_CLK,HIGH);digitalWrite(CCD_CLK,LOW);

} //從這里完成電壓的釋放

通過一個(gè)for循環(huán),不斷模擬CLK時(shí)鐘信號,讓CCD中存儲的電壓值全部釋放出來,以防干擾到后續(xù)檢測,重新存儲電壓值。

下面才真正的將檢測信號輸出并存儲到數(shù)組之中。

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);

}

同樣四條代碼開始對外輸出數(shù)據(jù)。

接著下面的for循環(huán)是模擬CLK時(shí)鐘信號。請讀者注意和上方for循環(huán)的不同,這里的for循環(huán)里多了一條數(shù)組賦值語句,這里才將輸出的值存儲到數(shù)組之中,用以調(diào)用。
代碼例程下載:鏈接:https://pan.baidu.com/s/1QBpWVemWZ2lzCGboJ2ExMw
提取碼:6ca5

總結(jié)

以上是生活随笔為你收集整理的线性CCD——从原理到跑路,适用于Arduino的底层驱动分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。