打印

PIC 18F4620做AD转换,得到的数与实际有偏差?

[复制链接]
2363|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanbing17|  楼主 | 2010-10-24 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hanbing17 于 2010-10-24 13:42 编辑

我使用AN0 做模拟输入 ,参考电压使用单片机内部电压,接到RC0 和RC1  ,在程序里分别置0 和1
AN0 做模拟输入使用稳压电源 ,Ad后的数据通过液晶1602显示 ,但是采集到通过液晶显示的数据总是和实际的相差一点
比如实际3.4V 显示的话可能是4, 而且不停的跳动 不停的刷新液晶屏 光标不停的闪动,我是用中断写的 麻烦请教大家指点一下 谢谢了! 还有是不是采集时候延时时间太短了?看了手册上说的采集时间还没看明白怎样计算 麻烦大家了  单片机16M晶振
void main()
{
delay(); //调用延时子程序
TRISB=0x00; //定义RA口为输出
TRISD=0x00; //定义RC口为输出
TRISC=0x00; //定义RC口为输出
ad_init();
//ADCON1=0x37; //设置RA口全部为普通数字IO口  并选AN2 AN3 为参考电压
PORTCbits.RC0=0;
PORTCbits.RC1=1;
delay();
lcd_init();
writename();
INTCONbits.GIE=1;     //总中断允许
ADCON0bits.GO=1;  //启动A/D转换
while(1); //while死循环
}
AD初始化
void ad_init()
{
   ADRES=0;
   TRISAbits.TRISA0=0;
   ADCON0=0b00000101;// RA1/AN1做为选定转换通道,此时为关闭状态,但AD已经使能
                     //GO/DONE=0 , ADON=1
   ADCON1=0b00110111;//所选AN3 AN2为参考电压(RA2/AN2/VREF-/CVREF和RA3/AN3/VREF+ 参考电压)
   ADCON2=0b10011110;//右对齐 64分频
   PIE1bits.ADIE=1;//允许A/D外围中断;
   INTCONbits.GIE=1;//允许global中断
   INTCONbits.PEIE=1;//允许外围中断
   ADIF=0;//初始时中断flag为0
}
中断程序
void chk_isr(void)
{
   
    unsigned int adval;
    float advalf;
    unsigned char a1,a2,a3,a4;
    delay(); //调用延时子程序
    ADIF=0;
    adval=ADRESH;//00000000 00000011
    adval=adval<<8|ADRESL;//00000011 11111111
    advalf=adval/1023.0*5.0;//==2.3843
    adval=advalf*1000;
    a1=adval/1000+'0';
    a2=adval%1000/100+'0';
    a3=adval%100/10+'0';
    a4=adval%10+'0';
    PORTD=0XC0;             //设置第2行显示地址
    enable();
    write(a1);
    write(a2);
    write(a3);
    write(a4);
    delay();
    ADCON0bits.GO=1;    //启动下一次A/D转换
}
延时:
void delay()
{
   int i;
   for(i=0;i<5000;i++);
}
沙发
hanbing17|  楼主 | 2010-10-25 09:14 | 只看该作者
谁能帮个忙啊。。。。。。。。。。。

使用特权

评论回复
板凳
Mary_luo| | 2010-10-26 18:25 | 只看该作者
楼主可以考虑用18F46K20,比4620便宜很多。

使用特权

评论回复
地板
兰天白云| | 2010-10-27 19:28 | 只看该作者
1:启动A/D转换前要有足够的采样时间
2:信号输入端的电阻要小,如果比较大,请继续增加采样时间
3:如果还搞不清楚,就把采样时间改为1秒试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

13

帖子

2

粉丝