单片机的AD转换是10位的,如何实现12位精度?

教程与解决方案问答分类: 工业生产类单片机的AD转换是10位的,如何实现12位精度?
0
fanghua 提问于 4月 以前

10位AD转换,到12位AD转换;

1 个回答
0
fang 回答于 4月 以前

当用热电阻测量温度时,如果测量范围 0~400.0℃,使用的单片机AD转换是10位的,那么测量精度为:400.0/1023 ≈ 0.4℃,也就是说温度的变化是按0.4℃跳变的,如果要测量精度为0.1℃ ,就要采用12位AD转换的单片机(400.0/4096 ≈ 0.1℃);有没有办法使用10位AD转换的单片机,而测量精度为0.1℃(相当于12位)?
下面办法可以做到;
我们采用过采样的方法,连续采样32次,并将ADC求和,再右移3位即可;由于信号总是在波动的,32次的采样求和,将波动的趋势基本统计在内,所以除8后,可以反映出0.1℃的变化;
STC单片机AD转换精度不高,转换数值波动大,按下面操作可以调高精度;
一是硬件,手册提到要在AD管脚到地上增加一个47P电容,用来稳定电压提高抗干扰。我的经验是不加这个电容,电压有一点波动有利于使用过采样方法提高转换精度。我的电路可以使用过采样实现12位转换精度;
二是AD转换时要先切换通道,延时一下再AD转换,AD转换时临时关闭中断可以使转换更稳定。
第三、使用过采样方法提高精度,硬件是10位,过采样可以达到12位。

附上程序
unsigned int AD_get(unsigned char channel)                //AD转换
{
EA=0; //关总中断,避免显示影响转换
ADC_CONTR=0xc8|channel;    //开启AD转换1100 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
while((ADC_CONTR&0x10)==0);    //等待转换完成
EA=1; //开总中断
ADC_CONTR&=0xe7;      //关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)
}
//——————————————————————————
u16 AD_work(unsigned char channel)                                //AD过采样
{
u16 AD_val=0;     //定义处理后的数值AD_val
unsigned char i;
ADC_CONTR |=channel;    //预转换通道使AD电压稳定。 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
for(i=0;i<32;i++)
{
ADC_RES=0;   //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
AD_val+=AD_get(channel); //转换32次总和(提高精度)
}
AD_val/=8;           //数值扩大到4倍,过采样到12位。
return AD_val;
}

转换结果:ad1是温度1的AD过采样转换数值,wd1是温度1数值,ad2是温度2的AD过采样转换数值。wd2是温度2数值,每秒转换一次。通过串口用串口助手显示的数据:
ad1= 1451; wd1= 141.17du;  ad2= 1401;wd2= 136.8du;

ad1= 1462; wd1= 142.6du;   ad2= 1390;wd2= 135.7du;
 
 
 

你的回答

9 + 1 =