PIC16F616的AD转换后结果不对啊?????

2020-02-08 09:10发布

本帖最后由 hmg6681 于 2012-6-16 15:37 编辑

程序:

uint vAD_get()
{
         uint ADval;
         uint ADvalf;
         asm("clrwdt");
       
         C1ON=0;
         TRISA2=1;  //定义RA0、RA2为输入
         ANS2=1;        //定义RA0、RA2为模拟输入口
         ADRESL=0;
         ADRESH=0;
         ADCON1=0x40;        //选择AD采样频率Fosc/4
         ADCON0=0x89;        //右对齐、参考电压=VDD、模拟通道AN2、使能AD采样
           delay(20,12);    //延时210us
         GO=1;                //启动AD
         while(GO);                //等待ADGO位0,表示转换已经完成
         /////////ADRESH=ADRESH;
         //////////ADRESL=ADRESL;
         ADval=ADRESH;        //读出高两位
         ADval=(ADval<<8)|ADRESL;   //把高两位和低八位合成一个数据
       
         ADvalf=(ADval/1023)*5*11;   //转化为实际值
         ADval=ADvalf*1000;         //取三位小数,电压单位由V变为mV
        return(ADval);
       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
millwood0
1楼-- · 2020-02-09 01:04
ADvalf=(ADval/1023)*5*11; 像这样的算法行吗????


what do you think?
eduhf_123
2楼-- · 2020-02-09 06:42
ADvalf=(ADval/1023)*5*11;
首先这里应该使用1024而不是1023。
其次,这里必然出现问题,因为两个整型数据做除法运算,结果依然是整型——你想想,这个除法会得到什么样的结果?
eduhf_123
3楼-- · 2020-02-09 07:12
 精彩回答 2  元偷偷看……
eduhf_123
4楼-- · 2020-02-09 09:39
另外,考虑到:
ADval*55/1024
=ADval*(64-8-1)/1024
所以可以使用如下的方法来避免16位的乘除法运算:
  1. ADvalf = 0;
  2. ADvalf += ADval<<6;
  3. ADvalf -= ADval<<3;
  4. ADvalf -= ADval;
  5. ADvalf += 512;
  6. ADvalf >>= 10;
复制代码
hmg6681
5楼-- · 2020-02-09 13:05
谢谢eduhf_123 ,我试试
hmg6681
6楼-- · 2020-02-09 18:57
现在好像AD采样出来的数值就是不对的。。。。。。我是直接用AD采样的数值驱动LED灯,10位采样的值取出其中五位来驱动LED,这样就能看出AD采样的值与我实际算出来的值是否一致了

一周热门 更多>