线性CCD——从原理到跑路,适用于Arduino的底层驱动分析
线性CCD——从原理到跑路,适⽤于Arduino的底层驱动分析手机移动充值卡
⼀. 原理及功能
CCD是⼀种电荷耦合器件,他可以将接收到的光信号转换为电荷量存储并通过耦合的⽅式将信号传输给MCU(微处理器)。CCD⼀般⽤于摄像头之中,可以在X轴Y轴两个⽅向同时检测。⽽像扫描仪,⼀次智能检测⼀条线上光强的⽅式,就称之为线性CCD。
上⼀段是来⾃百度对CCD的解释的概述。如果读者读到这⾥还是不明⽩线性CCD究竟是⼀个什么样的东西,没有关系。相信读者看到这篇⽂章的时候,多少因该接触过⼀些单⽚机编程和常⽤的模块了。CCD的功能和灰度模块很类似,如果读者也没⽤过灰度模块,没事,下⾯我将简单讲解原理。灰度模块之中,其实最主要的部分是⼀个光敏三极管,当基集有光照射时,那么集电极与发射极会导通,产⽣⼀个电流,那当电流流过电阻时,就会在电阻两端产⽣⼀个电压,电流越⼤,在电阻上的压降就越⼤。因此根据此原理,即可通过电压的⼤⼩判断当前光亮的⼤⼩(检测物体反射回的光亮)。⼀上设计到数电的⼀些专业知识,如果读者不懂⽆需理会,只要知道功能即可即检测物体返回的光亮输出⼀个对应的电压。根据⽩⾊返回光的⼤部分波段,⿊⾊材质吸收光的⼤部分波段的物理现象来看,即被检测物体颜⾊越浅,输出电压值越⾼,反之电压越⼩。综上所述就是⽩⾊输出⾼电平,⿊⾊输出低电平。
⽽线性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的缩写,作⽤和字⾯意思⼀样是为芯⽚提供⼀个时钟信号,让其根据这个时间速度⼯作。可能读者看到这⾥有点模糊,笔者刚开始学的时候看到这些解释也很不理解,但是没关系,你很幸运,拿到了笔者谢的开发笔记,哈哈。笔者在这⾥举⼀个例⼦。加⼊你在上课,⽼师要求你每听到⼀个英⽂单词时就记录下来,那么⽼师讲的英⽂单词就是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个元素的数组。可能读到这⾥读者会有⼀个疑问,那就是,为什么是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);
养殖鸡技术}
同样四条代码开始对外输出数据。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。