基于5529开发板的ADC实验,数据转换误差问题

2019-07-15 16:28发布

测1.616V 电压,结果大部分集中在1.6333-1.6068V之间。还有少量数据偏差较大,问:为什么会有这么大的偏差,问题来至哪里?如何改善?

#include <msp430F5529.h>
#define   Num_of_Results   8

volatile unsigned int results[Num_of_Results];
                                            // Needs to be global in this
                                            // example. Otherwise, the
                                            // compiler removes it because it
                                            // is not used for anything.

int main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  P6SEL |= 0x01;                            // Enable A/D channel A0
  ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC; // Turn on ADC12, set sampling time
                                            // set multiple sample conversion
  ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2;       // Use sampling timer, set mode
  ADC12IE = 0x01;                           // Enable ADC12IFG.0
  ADC12CTL0 |= ADC12ENC;                    // Enable conversions

    while(1)
  {
    ADC12CTL0 |= ADC12SC;                   // Start convn - software trigger

    __bis_SR_register(LPM4_bits + GIE);     // Enter LPM4, Enable interrupts
    __no_operation();                       // For debugger   
  }
}



#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
#else
#error Compiler not supported!
#endif
{
  static unsigned char index = 0;

  switch(__even_in_range(ADC12IV,34))
  {
  case  0: break;                           // Vector  0:  No interrupt
  case  2: break;                           // Vector  2:  ADC overflow
  case  4: break;                           // Vector  4:  ADC timing overflow
  case  6:                                  // Vector  6:  ADC12IFG0
    results[index] = ADC12MEM0;             // Move results
    index++;                                // Increment results index, modulo; Set Breakpoint1 here

    if (index == 8)
    {
      index = 0;
    }
  case  8: break;                           // Vector  8:  ADC12IFG1
  case 10: break;                           // Vector 10:  ADC12IFG2
  case 12: break;                           // Vector 12:  ADC12IFG3
  case 14: break;                           // Vector 14:  ADC12IFG4
  case 16: break;                           // Vector 16:  ADC12IFG5
  case 18: break;                           // Vector 18:  ADC12IFG6
  case 20: break;                           // Vector 20:  ADC12IFG7
  case 22: break;                           // Vector 22:  ADC12IFG8
  case 24: break;                           // Vector 24:  ADC12IFG9
  case 26: break;                           // Vector 26:  ADC12IFG10
  case 28: break;                           // Vector 28:  ADC12IFG11
  case 30: break;                           // Vector 30:  ADC12IFG12
  case 32: break;                           // Vector 32:  ADC12IFG13
  case 34: break;                           // Vector 34:  ADC12IFG14
  default: break;
  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
Ann_tmmu
1楼-- · 2019-07-15 17:52
一般只测交流小信号,没有测过直流电压,所以不好评论。但是,根据你提供的现象,貌似AD转换出现了一定的漂移(约30个mV),应该从抑制硬件漂移的角度去思考问题,而跟软件程序应该没什么关系。漂移可能来自多方面:信号源的不稳定、外部的噪声、硬件电路的设计不当都可能导致你说的这种情况。 最佳答案
家有军火
2楼-- · 2019-07-15 18:22
 精彩回答 2  元偷偷看……
Crystal6927
3楼-- · 2019-07-15 19:10
但是这种误差在多少范围内被认为是可以的呢
dingyong11
4楼-- · 2019-07-15 22:56
学习学习。。。
SuperVigorous
5楼-- · 2019-07-16 03:25
 精彩回答 2  元偷偷看……
Crystal6927
6楼-- · 2019-07-16 05:47
SuperVigorous 发表于 2015-8-15 13:07
单片机的地跟测量电压的低端尽可能近

已经将单片机的地和测量电压的地共地了

一周热门 更多>