智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 784|回复: 2
打印 上一主题 下一主题

蓝宙线性ccd怎么开始工作?

[复制链接]

4

主题

9

帖子

0

精华

高级会员

Rank: 4

积分
590
威望
343
贡献
135
兑换币
205
注册时间
2015-10-12
在线时间
56 小时
跳转到指定楼层
1#
发表于 2016-3-22 19:34:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
15贡献
新手,最近用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多。

一直搞不明白,求大神指导。。。

回复

使用道具 举报

141

主题

8906

帖子

6

精华

杰出人士

蓝宙电子科技有限公司

Rank: 12Rank: 12Rank: 12

积分
18725
QQ
威望
5859
贡献
5686
兑换币
3557
注册时间
2008-8-1
在线时间
3590 小时
2#
发表于 2016-3-23 13:36:24 | 只看该作者
CCD启动程序是CCD控制中的一部分很重要的程序,这个程序中对时间要求很严格,我们的程序多半是32位单片机写的,通常有超频,1us的时间在51单片机上远远是不一样的。因此用示波器调试一下这个控制时间是很重要的。
回复

使用道具 举报

4

主题

9

帖子

0

精华

高级会员

Rank: 4

积分
590
威望
343
贡献
135
兑换币
205
注册时间
2015-10-12
在线时间
56 小时
3#
 楼主| 发表于 2016-3-23 22:07:11 | 只看该作者
bydes 发表于 2016-3-23 13:36
CCD启动程序是CCD控制中的一部分很重要的程序,这个程序中对时间要求很严格,我们的程序多半是32位单片机写 ...

这个程序应该算好了,由于没有上位机软件没得看图像,只能通过lcd返回的十位数值来调这里我发现了一个问题:有时候那个ccd返回的ad值一直是940多,需要用手去转一转,戳一戳ccd才会恢复正常。
这种事情是这个ccd出问题了还是程序的问题?你们以前有没有遇到这样的问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-20 17:22 , Processed in 0.076732 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表