这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » AD的困扰--AD采集的数据转换后比模拟量值偏小

共6条 1/1 1 跳转至

AD的困扰--AD采集的数据转换后比模拟量值偏小

菜鸟
2013-04-08 15:44:10     打赏
   最近用msp430f2013的SD16采集0.08v到0.4v的电压值,但是AD转换后的数据比模拟值要偏小,而且随着信号的增大,偏差越来越大。量程范围内,最大偏差10mv。各位大侠请指点下小弟,感激不尽。



关键词: MSP430F2013 SD16    

菜鸟
2013-04-08 15:46:26     打赏
2楼

自己顶,以下贴出,采样函数及中断函数:

    unsigned int ADC16_Sample(char ADC,unsigned int AverageNum)
{
  //unsigned long int ADC_SumU=0;//无符号模式的累加值
  signed long int ADC_SumS=0;//有符号模式的累加值 
  unsigned int *SD16CCTL;    //ADCx控制寄存器选择指针
  int i;
  SD16CCTL=(unsigned int *)&SD16CCTL0;//指针指向ADC0控制寄存器
  *SD16CCTL |=SD16IE;              //打开选中的ADC的中断
  _EINT();                         //开总中断
  P1OUT &= ~CS;
  ADC16_VrefOn();
  *SD16CCTL |= SD16SC;             //向选中的ADC发出"开始采样"命令 
  for(i=0;i<AverageNum;i++)        //循环连续采样
  {
    for(unsigned int j=0;j<10000;j++);
     while(ADC_Flag==0) LPM0;           //等待一次采样结束
     ADC_Flag=0;
     ADC_SumS+=(int)ADC_Result[ADC]; //按有符号模式累加
  }                                    //采样次数达到
  ADC16_VrefOff(); 
  P1OUT |= CS;
  *SD16CCTL &=~ SD16SC;                //向选中的ADC发出"停止采样"命令
  *SD16CCTL &=~ SD16IE;                //关闭相应ADC的中断 
  return(ADC_SumS>>4); //有符号数据格式平均值/AverageNum
}

 

#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
  switch (SD16IV)                           //判断中断类型
  {
  case 2:                                   // SD16MEM Overflow
    break;
  case 4:                                   // ADC0 采样结束
    ADC_Result[0]=SD16MEM0+187;
    if(SD16MEM0>0X7FFF)
    {
      Num_Flag=1;
    }
    else
    {
      Num_Flag=0;
    }
    break;           // 保存ADC0采样结果
  }
 ADC_Flag=1;                                //ADC中断已执行标志                        
 __low_power_mode_off_on_exit();            //唤醒CPU
}

 


菜鸟
2013-04-08 20:21:00     打赏
3楼

 “ADC16_VrefOn();  ”是开参考电压吗?是否需要增加延时

10000个数累加会不会溢出?

while(ADC_Flag==0) LPM0;           //等待一次采样结束”  是改变工作模式吗?

用过一次430,现在忘了,仅供参考!


菜鸟
2013-04-09 11:01:07     打赏
4楼

ADC16_VrefOn();   这个是开启内部1.2v基准电压;

while(ADC_Flag==0) LPM0;  这个是转换完成后进去沉睡状态。 

 

void ADC16_VrefOn()
{
  SD16CTL |=  (SD16REFON);  //开启内部基准源,开启输出缓冲器
  SD16INCTL0 |= SD16INTDLY_0;
}

void ADC16_VrefOff()
{
  SD16CTL &=~(SD16REFON);  //关闭内部基准源,关闭输出缓冲器
}

 

 

去掉for循环延时及模式转换后,故障依旧。  测试AD输入端电压,与转换后电压相比;转换后的电压明显偏低。不知道什么原因导致的。请各位大侠指教一下。

 


高工
2013-04-09 13:36:29     打赏
5楼
没有用过430,但是感觉楼主的ADC配置很简单啊,里面有没有PGA、零偏和温度补偿之类的需要配置呢?

高工
2013-04-10 15:36:40     打赏
6楼
造成AD的误差是有很多原因的,第一你要确定你的测试电源是不是正确的。第二,你板子上的电源稳不稳定。还有你要看看430的AD的转换精度。最后可以进行软件AD的校准!

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]