This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5659:ADC12值不准确

Guru**** 2577385 points
Other Parts Discussed in Thread: MSP430F5659

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/608396/msp430f5659-adc12-value-is-not-accurate

器件型号:MSP430F5659

您好,

我正在使用 MSP430F5659部件,在我的项目中,我将 ADC 用于外部电压监控。 我使用的是 ADC12、请检查以下 ADC 配置。

1)我已配置 ADC 12位分辨率,ADC 源时钟为 SMCLK (8MHz 并除以8),因此我使用了1MHz 时钟。

2) 2)我正在使用通道序列模式读取一组 ADC ,并且根据我在 TI 论坛中读取的内容,我正在使用外部电阻器100K 欧姆。 我计算出的 ADC 采样保持时间(tsample >(Rs + 2k Ω) x 9.011 x 40pF + 800ns)为64个周期。  

3) 但我的 ADC 值不准确。 例如,我得到的值为1478 mv,但我的输入电压为1600 mv。

如何使其更准确,请尽快回复。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ganesh、

    感谢您发布此问题。 我认为问题存在于您的基准电压设置中。 您输入信号(直流、正弦波等)的条件是什么? 此外、如果您可以将代码附加到此线程、我可以更好地为您提供帮助。

    此致、
    特拉维斯黑
    应用工程师
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Travis,  

    在这里,我只使用直流连续信号,在 ADC 配置下进行 Plz 检查

    /* ADC 初始化*/

    bool adcInit()

    bool RetVal =成功;

    //在初始化 ADC12_A 之前确保 ENC 位被清零
    ADC12CTL0 &=~ADC12ENC;
    ADC12CTL0 &=~(ADC12ON|ADC12OVIe|ADC12SC);
    ADC12IE = 0x0000;//复位所有中断使能
    ADC12IFG = 0x0000;//复位所有中断标志

    //设置 ADC12_A 控制1
    ADC12CTL1 |= ADC12SHS_0|ADC12SSEL_3|ADC12DIV_7;
    //设置 ADC12_A 控制2.
    ADC12CTL2 |= ADC12RES_2;//默认分辨率为12位
    ADC12CTL2 &=~ADC12PDIV;
    REFCTL0 = 0x0000;

    返回(RetVal);

    /* ADC 启用*/
    void adcEnable()

    ADC12CTL0 |= ADC12ON;

    /* ADC 采样计时器*/

    void adcSetSampleTimer()

    ADC12CTL1 |= ADC12SHP;
    ADC12CTL0 &=~(ADC12SHT0_15 + ADC12SHT1_15 + ADC12MSC);
    ADC12CTL0 |= ADC12SHT1_4 | ADC12SHT0_4 | ADC12MSC;

    /* ADC 内存配置*/

    空 adcConfigureMemory (adc_t adc_channel、uint8_t endOfSq)

    ADC12CTL0 &=~ADC12ENC;
    if (!(ADC12CTL0 & ADC12ENC)){
    volatile uint8_t * memoryBuffer =&ADC12MCTL0;
    DebugOutNum ((short)(memoryBuffer + ADC_channel)、16);
    debug_put 字符串("\r\n");
    *(memoryBuffer + ADC_channel)|=(ADC12INCH_0 + ADC_channel)| ADC12SREF_1 |(endOfSq << 7);
    ADC12CTL0 |= ADC12REFON | ADC12REF2_5V;

    /* ADC 中断*/

    空 ADC_INTERRUPT (uint8_t 中断、bool 启用)

    if (启用)
    ADC12IE |=中断;
    其他
    ADC12IE &=μ~中断;

    /* ADC 中断标志*/

    void adcInterruptFlag (uint8_t interflag、bool set)

    if (设置)
    ADC12IFG |=交叉标志;
    其他
    ADC12IFG &=~μ F 交叉标志;

    /* ADC 开始转换*/


    void adcStartConversion (uint8_t ConvertionMode)

    ADC12CTL0 &=~ADC12ENC;
    ADC12CTL1 &=~Ω(ADC12CSTARTADD_15 + ADC12CONSEQ_3);
    ADC12CTL1 |=((ADC12_A_MEMORY_0 <<12)|转换模式);
    //ADC12CTL1 |= ADC12CSTARTADD_0 |转换模式;
    ADC12CTL0 |= ADC12ENC + ADC12SC;


    /* ADC 停止转换*/
    void adcStop()

    ADC12CTL0 &=~(ADC12ENC + ADC12SC);

    空 VoltageMonitorInit()

    adcInit();
    adcEnable();
    adcSetSampleTimer();

    adcConfigureMemory (VCC_LDO_3V3、NOTENDOFSEQ);
    adcConfigureMemory (VCC_3V6、NOTENDOFSEQ);
    adcConfigureMemory (VCC_5V0、NOTENDOFSEQ);
    adcConfigureMemory (VCC_12V0、ENDOFSEQ);

    ADC_INTERRUPT (ADC12IE5、ENABLE);
    adcInterruptFlag (ADC12IFG5、CLEAR);

    void main()

    无符号长整型电压= 0;
    disable_watchdog();
    SetupClock();/*设置时钟8MHZ*/

    debug_console();/*设置调试 UART */
    Debug_Put_string ("Debug UART \r\n");

    GpioInit();

    VoltageMonitorInit();
    debug_put 字符串("IMX UART init\r\n");

    timer();
    while (1){
    if (adcFlag = enable){
    Debug_Put_string ("Loop \r\n");
    for (int i = 0;i < 4;i++){
    adcres[i]=(adcres[i]/10);

    电压=((adcres[i]*2500L)>>12);

    电压=电压*2;
    Debug_out_INT ((uint16_t)电压、16);
    debug_put 字符串("\r\n");

    memset (adcres、0、adc_MAX);
    adcFlag =禁用;


    /* ADC 中断处理程序*/  

    #pragma vector=ADC12_vector
    _interrupt void ADC12ISR (void)

    switch (__evo_in_range (ADC12IV、34))

    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    情况6:中断;//Vector 6:ADC12IFG0
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    案例16:  
    if (adcFlag = disable){
    adcres[0]+= adcReadvalue (ADC12MEM2);
    adcres[1]+= adcReadvalue (ADC12MEM3);
    adcres[2]+= adcReadvalue (ADC12MEM4);
    adcres[3]+= adcReadvalue (ADC12MEM5);
    adcStop();
    adcCount++;
    if (adcCount = 9){
    adcCount = 0;
    adcFlag =启用;


    中断;

    情况18:中断;//Vector 18:ADC12IFG6

    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;

    注:我已使用时钟 SMCLK 和 ADC 时钟同时配置了 ADC。 但结果是一样的、Plz Check 和 Tell Me ASAP。 通过使用1ms 计时器、我调用 adcStartConversion API 来启动通道 ADC 的序列。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ganesh、

    您输入的 ADC12MEMx 值是多少、它们在取平均值/转换之前是否正确? 您尝试获取平均10个值、但 ISR 在退出前仅循环9次。 然后、将结果除以10、从而得到错误的结果。 您应该检查 ISR 内部是否存在(adcCount = 10)。

    此致、
    特拉维斯黑
    应用工程师
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Travis、

    感谢您的回复。 是的,这是我的愚蠢错误。 希望其他配置正确... 很好