[求助] PIC 16f877 中关于10位AD转换问题

springmorn   2007-11-30 08:58 楼主
很奇怪,我转换出来的数字线性度很差,有一直上扬的趋势,我只用到了AD0,时钟是Fosc/32,单片机晶振4M, 为什么我得到的转换结果差这么多,直接加1V电压,转换的结果将近1.5V左右,请问是我哪里没用好?当我用其它Fosc/8时,转换结果更差?搞不明白??

回复评论 (8)

我再在是20ms采一次样,采样等待时间2ms
点赞  2007-11-30 08:59
我再在是20ms采一次样,采样等待时间2ms

一般不会轻易怀疑AD的问题,因为从行业上看PIC的片子信誉还是非常高的,呵呵,我以前用过的也不成问题

你用的是时间来使用AD,这可能就出一个问题,你的时间是不是足够长?

如果时间不够,那你的转换可能没有结束,所以,得到的值不正确

你从新写一个小程序,先验证一下你AD的使用方式正确与否

再一个可以看看数据手册,AD的性能能不能满足您的这个速率

如果不行,那只能用片外AD
点赞  2007-11-30 09:16
我看一手册, 我现在用的是4M, 选择Fosc/32转换频率,那么TAD时间为8us ,转换一次10位,12TAD=96us可以完成,我20ms采样一次应该没问题呀,应该不是时间的问题
点赞  2007-11-30 10:33
好像你现在的问题还不到性能上

而是你的使用上就有问题

嘿嘿

你先看看把AD用正确吧

AD使用一般这几个点:
一:参考源
二:AD基本配置(像位数,工作方式,AD值的存储方式啥的)
三:开始ADC
四:读出值,换算

一二三,可能问题都不大

看是不是换算的时候的问题,比如说10位的,那个前两位有没有放置正确?

或是多读了其它寄存器的值

都有可能
点赞  2007-11-30 11:23
unsigned short ConvertAnalog(char ChannelNo)
{
    switch(ChannelNo)
    {
     case 0:
        ADCON0&=0xc7;
     break;
     case 1:
        ADCON0|=0x08 ;
     break;
     case 2:
     break;
     case 3:
     break;
     case 4:
     break;
   default:
    break;

    }
    ADON=1;
    DelayUs(50);
    ADGO=1;
    while(ADGO);
    return((unsigned short)((ADRESH&0x03)<<8)|ADRESL);//右对齐

}

还有就是我没用VREF+,和VREF-功能,用的是VDD,和VSS,当这个VDD不是5V,或有些偏差时,是不是会对结果有影响?



点赞  2007-11-30 11:29
ADRESH&0x03 < <8

有点感觉这个不太安全

听说过有直接用VDD做参考源功能部件开启后被拉下来不准的,嘿嘿

最后还是外置一个参考电压吧

呵呵

点赞  2007-11-30 11:48
VREF+,和VREF- 我已作其它用途,没办法了
点赞  2007-11-30 12:59
4M是用Fosc/8才对吧,还有参考电压选的对不
点赞  2014-10-4 20:59
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复