NUC140之ADC

来源:互联网 发布:农村淘宝客服电话 编辑:程序博客网 时间:2024/05/16 18:12

NUC140的ADC比较简单,只需要设定好时钟和采样模式就OK了

下面先看初始化程序

void ADC_initialize (void)
{
 DrvADC_Open (ADC_SINGLE_END,  //Single模式
     ADC_SINGLE_CYCLE_OP, //单周期扫描模式
     0xf3,     //设置要转换的口为ADC0,1,4,5,6,7 /1111 0011
     EXTERNAL_12MHZ,     //使用外部12M时钟为时钟源
     0x9          //ADCClock = 12M/(9+1)
    );
 delay (100);                     //延迟使时钟稳定  
}

初始化很简单,在此我们就不再累述,根据引脚的接法,用到哪一路AD就使能哪一路即可。

下面看数据的处理

void ADC_temperature_28V (void)
{
 int32_t temperature_ADC_value;           //温度ADC转换值

 temperature_ADC_value = get_ADC_value(1);                 //读取温度值,对应ADC1
/*******************************************************************************************************************
*温度的算法:(1)由于ADC为12位精度,故为2的12次方=4096,所以采样的数先除以4096,但要保留小数位,由于被除数是整型,  *
*     所以加点进行浮点运算;                      *
*    (2)由于参考电压为5.26V,所以要再乘以5.26;                     *
*    (3)由于温度传感器0.01V对应1℃,所以再乘以100;                    *             
*    (4)由于采样到的数据是经过运放放大了2.8倍,所以再除以2.8;              *
*            (5)最后加0.5是为了防止小数位大于0.5而被舍去;                                       *
*  备注:如仍有不明白的,请参考数据手册478页                    *
********************************************************************************************************************/
 temperature_ADC_value = ((temperature_ADC_value / 4096.) * (5.26) * 100) / 2.8 + 0.5; //进行转换
 temperature_value = (uint8_t)temperature_ADC_value; 

}

在这里简单说明一下:

由于是12位精度的AD,参考电压5.26V,用库函数得到的是一个12位的数据,

如果获取的数据为0XFFF表示对应采到模拟电压为5.26V,

如果获取的数据为0X0表示采到的模拟电压为0V,中间的以此类推。

但是一般AD要注意数字滤波,网上有文档介绍,我记得有篇叫十种AD滤波的方法,

我用的是中值法,程序如下

/**************************************************
 *函数名: ADC_average                *
 *功能: ADC转换值取中间值函数                 *
 *出口参数:中间值          *
 *入口参数:转换值数组地址        *
 *************************************************/
static int32_t ADC_average (int32_t *ADC_value)  //加static表示仅本文件内部用
{
 int32_t value[9] = {0};
 uint8_t i,j,k;
 int32_t value_max;
 for (i=0; i<9; i++)
 {
  value[i] = *ADC_value++;                    //获取将要转换的值
 }
 
 //冒泡法从小到大排列
 for (j=0; j<9; j++)                    //一共要比较9次
 {
  for (k=0; k<9-j; k++)      //第一次过后最大的值放在了最高的位置
  {           //就不用再比较最大的那个元素了
   if(k != 8)        //防止k为8时,value[8]与value[9]的比较,因为后者已经超出了数组的范围
   {
    if (value[k] > value[k+1])      //所以每次比较完下一次少比较一次
    {
     value_max = value[k];   //将较大的值保存起来
     value[k] = value[k+1];   //较小的值赋给低位元素
     value[k+1] = value_max;   //较大的值赋给高位元素
    }
   }
  }
 }
 return (value[4]);
}

 

/**************************************************
 *函数名: get_ADC_value                *
 *功能: ADC获取对应通道转换值函数             *
 *出口参数:9次A/D后得到的中值       *
 *入口参数:ADC通道号码          *
 *************************************************/

static int32_t get_ADC_value(uint8_t ADC_channel_number)
{
 uint8_t i;
    int32_t ADC_calibration[9]={0};                                   //ADC求中间值数据储存数组
 for (i=0; i<9; i++)                      //读取9次的值
 {
  DrvADC_StartConvert();                    //启动ADC转换
  while(!DrvADC_IsConversionDone())                 //等待ADC转换完成
  {
  }
  ADC_calibration[i] = DrvADC_GetConversionData(ADC_channel_number); //读取对应ADC通道的值
  DrvADC_StopConvert();                                           //停止转换
 }
 return (ADC_average(ADC_calibration));                 //将取到的值求取中间值后返回
}

前面的那个函数为中值法滤波,后面的则是ADC启动转换函数,注意:一定要等待ADC转换完成后再获取转换的数值,

否则得到的数据可能会不准确。

到此ADC介绍结束

 

原创粉丝点击