专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

用于STC单片机内置10位AD转换的代码+【软件滤波】

作者:佚名   来源:本站原创   点击数:  更新时间:2012年07月30日   【字体:

上面这段GetADCResult()是原来的AD采集,没什么变化,看看就行了
GetResult()这个是软件滤波的,10位AD的之前弄滤波总出错,今天刚弄好。
关键在于(unsigned long)(),不加这个就总出错!计算过程中溢出,感觉好像是计算时自动降位了
 

ulong GetADCResult(uchar ch)
{
ulong AD_result;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
AD_result=ADC_RES*4+ADC_RESL; 

    return   AD_result;             //Return ADC result 10bit
}
ulong GetResult(uchar ch)  //滤波段
{
ulong AD_result=0,AD_result1=0;
ulong AD_max,AD_min,AD_temp;
char AD_i,AD_o;

for(AD_i=0;AD_i<4;AD_i++)
{
AD_min=AD_max=GetADCResult(ch);
AD_result=0;
for(AD_o=0;AD_o<8;AD_o++)
{
AD_temp=GetADCResult(ch);
if(AD_temp<AD_min){AD_result =(unsigned long)(AD_result + (unsigned long)AD_min); AD_min=AD_temp;}
  else
   if(AD_temp>AD_max){AD_result =(unsigned long)(AD_result + (unsigned long)AD_max); AD_max=AD_temp;}
      else 
    AD_result =(unsigned long)(AD_result + (unsigned long)AD_temp);
  }
AD_result=(unsigned long)(AD_result/8);

AD_result1=AD_result1+ (unsigned long)(AD_result); 
}
AD_result1=(unsigned long)(AD_result1/4);

return   AD_result;             //Return ADC result 10bit
}

方法是基于:去除最大最小值后平均。共采样了33次去掉9个后的结果平均值,我自己做电压表,速度足够!如果嫌慢的话可以把AD_i<4中的这个4改小点或者把这个循环去掉。

关闭窗口

相关文章