智能车制作

标题: 蓝宙线性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