智能车制作
标题:
蓝宙线性ccd怎么开始工作?
[打印本页]
作者:
environment
时间:
2016-3-22 19:34
标题:
蓝宙线性ccd怎么开始工作?
新手,最近用51做小车入手,由于没有上位机,自己又不会,只能通过串口显示二值化后的128位数值观察了,但是ccd好似没开始工作,我按那个时序图写的,ccd的启动程序如下:
/*ccd启动程序*/
void startccd()
{
unsigned char i;
SI=1;
Delay1us(1);
CLK=1;
Delay1us(1);
SI=0;
Delay1us(1);
CLK=0;
for(i=0;i<127;i++)
{
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
CLK=0;
}
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
CLK=0;
Delay1us(1);
Delay1us(1);
}
/*ccd采样程序*/
void ICapture(float *IData)
{
unsigned char i;
SI=1;
Delay1us(1);
CLK=1;
Delay1us(1);
SI=0;
Delay1us(1);
for(i=0;i<200;i++)
Delay1us(1);
*IData=AdChange();
IData++;
CLK=0;
for(i=0;i<127;i++)
{
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
*IData=AdChange();
IData++;
CLK=0;
}
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
CLK=0;
}
AdChange()程序如下:
unsigned int AD_finished=0,x;
float f;
unsigned char r,display[5]="bbbbb";
x=0;
r='0';
f=0.00;
ADC_CONTR = 0x40; //70时钟周期转换一次
ADC_CONTR |= 0x02; //选择 A/D 当前通道
_nop_();
_nop_();
ADC_CONTR|= 0x20; //180个周期转换一次
_nop_();
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
_nop_();
_nop_();
_nop_();
_nop_(); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //关闭AD转换,ADC_FLAG清0
x=ADC_RES*4+ADC_RESL;
然后我通过lcd观察到x的值不会变,接上ccd就是900多,拔掉就是400多,ad精度是10位的,也就是说实际电压是4V多和2V多。
一直搞不明白,求大神指导。。。
作者:
bydes
时间:
2016-3-23 13:36
CCD启动程序是CCD控制中的一部分很重要的程序,这个程序中对时间要求很严格,我们的程序多半是32位单片机写的,通常有超频,1us的时间在51单片机上远远是不一样的。因此用示波器调试一下这个控制时间是很重要的。
作者:
environment
时间:
2016-3-23 22:07
bydes 发表于 2016-3-23 13:36
CCD启动程序是CCD控制中的一部分很重要的程序,这个程序中对时间要求很严格,我们的程序多半是32位单片机写 ...
这个程序应该算好了,由于没有上位机软件没得看图像,只能通过lcd返回的十位数值来调这里我发现了一个问题:有时候那个ccd返回的ad值一直是940多,需要用手去转一转,戳一戳ccd才会恢复正常。
这种事情是这个ccd出问题了还是程序的问题?你们以前有没有遇到这样的问题?
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2