打印
[PIC®/AVR®/dsPIC®产品]

PIC18F66K80 AD采样问题

[复制链接]
2438|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuyanlbg|  楼主 | 2017-4-8 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初次使用PIC18F66K80这款单片机,写入一个AD采样程序。输入电压范围为2.5~5V时,亮灯LED灯。输入电压范围在0~2.5V时关闭LED灯。但测试发现,只有输入电压在0.5~0.7V时LED灯才关闭,0~0.5V及0.7V~5V时LED灯均被点亮。(0~0.5V时AD采样结果竟为负数)。单片机晶振为16M,采用4倍频。请高手指点。程序如下:
void AD_Init()
{
     TRISAbits.TRISA0  =  1;       //RA0为输入
     ANCON0  =  0X01;             //RA0为模拟引脚
     ANCON1  =  0X00;
     ADCON1  =  0X00;            //参考电压选择AVDD和AVSS,模拟反向通道选择AVSS
     ADCON2  =  0XB4;           //数据右对齐,AD采集时间为16TAD,AD转换时钟选择为FOSC/4
     ADCON0  =  0X01;           //开启AD转换
     delay(1000);
}
unsigned int AD_GetValue()
{
     unsigned int AD_date;
     AD_Init();
     ADCON0bits.GO_DONE  =  1;                                   //AD转换
     while(ADCON0bits.GO_DONE);
     AD_date  =  (((ADRESH&0X0F)<<8)|ADRESL);
     if(AD_date >= 0X03FF)
        bLED_LOOP = 0;              //LED灯点亮
     else
        bLED_LOOP = 1;
     return AD_date;
}
沙发
狼烟客| | 2017-4-13 20:30 | 只看该作者
AD_date  =  (((ADRESH&0X0F)<<8)|ADRESL);
这句是不是该改成这样?
AD_date  = (((uint16_t)(ADRESH&0x0F)<< << 8) | ADRESL);

使用特权

评论回复
板凳
e_hailang| | 2017-4-14 12:17 | 只看该作者
AD转换时钟选择为FOSC/4换成AD转换时钟选择为FOSC/16试一试吧

使用特权

评论回复
评论
liuyanlbg 2017-4-17 16:50 回复TA
还真是这个转换时钟的问题,设置成FOSC/16也不行,要设置成FOSC/64才可以。另外,那个2.5V的中间值应该是0X07FF,写错了。 
地板
basker123| | 2017-4-14 18:26 | 只看该作者
设置参考源修改下!内部电压你不能确定大小是多少!采集出来的值肯定不准确!

使用特权

评论回复
5
石婷婷| | 2017-6-20 11:32 | 只看该作者
你好,请问解决了吗

使用特权

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

本版积分规则

37

主题

59

帖子

0

粉丝