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.

[参考译文] MSP-EXP430FR5969:尝试运行 msp430fr59xx_ADC12_11.c 代码进行 ADC 测试、但读数低于预期

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1297392/msp-exp430fr5969-trying-to-run-msp430fr59xx_adc12_11-c-code-for-adc-test-but-readings-are-lower-than-expected

器件型号:MSP-EXP430FR5969

您好!

我正在使用下面显示的提供的 msp430fr59xx_ADC12_11.c 代码。 我获得的读数低于预期值。 该代码显示其在注释部分使用的是 AVCC、但在代码中它看起来像 VREF+= Vref、但我不知道他们打开基准的位置、因此我不确定这里的基准是什么。 有人能帮忙吗?

以下是我的读数:

1.65V 输入=> 0xD69

1.0V 输入=> 0x807

0.5V 输入=> 0x403

这似乎是在跟踪2V 基准电压、但我似乎看不到此设置的位置。 我确实运行了 TI 提供的其他代码、看起来输出读取总是低于提供的模拟输入。

#包含

int main (空)
{
 WDTCTL = WDTPW | WDTHOLD;                //停止 WDT

 //将 GPIO 配置为最低功耗状态
 P1OUT = 0;                               //所有 P1.x 复位
 P1DIR = 0xFF;                            //所有 P1.x 输出
 P2OUT = 0;                               //所有 P2.x 复位
 P2DIR = 0xFF;                            //所有 P2.x 输出
 P3OUT = 0;                               //所有 P3.x 复位
 P3DIR = 0xFF;                            //所有 P3.x 输出
 P4OUT = 0;                               //所有 P4.x 复位
 P4DIR = 0xFF;                            //所有 P4.x 输出
 PJOUT = 0;                               //所有 PJ.x 复位
 PJDIR = 0xFFFF;                          //所有 PJ.x 输出

 //设置 XT1
 PJSEL0 = BIT4 | BIT5;                    //对于 XT1

 P1SEL0 |= BIT2;                          //为 ADC 功能配置 P1.2/A2
 P1SEL1 |= BIT2;                          //

 //禁用 GPIO 上电默认高阻抗模式以激活
 //先前配置的端口设置
 PM5CTL0 &=~μ A LOCKLPM5;

 //时钟系统设置
 CSCTL0_H = CSKEY >> 8;                   //解锁 CS 寄存器
 CSCTL1 = DCOFSEL_0;                      //将 DCO 设置为1MHz
 CSCTL2 = SELM__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
 CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;    //设置所有分频器
 CSCTL4 &=~LFXTOFF;

 正确
 {
   CSCTL5 &=~LFXTOFFG;                   //清除 XT1故障标志
   SFRIFG1 &=~OFIFG;
 }while (SFRIFG1和 OFIFG);               //测试振荡器故障标志

 ADC12CTL0 = ADC12SHT0_0 | ADC12ON;       //采样时间、S&H = 4、ADC12开启
 //使用 TA0.1触发,重复单通道
 ADC12CTL1 = ADC12SHP | ADC12SHS_1 | ADC12CONSEQ_2;
 // A2输入选择;VREF+= Vref
 ADC12MCTL0 = ADC12INCH_2 | ADC12VRSEL_1 | ADC12EOS;

 ADC12IER0 |= ADC12IE0;                   //启用 ADC 中断
 ADC12CTL0 |= ADC12ENC | ADC12SC;         //开始采样/转换

 //配置 Timer0_A3以定期触发 ADC12
 TA0CCR0 = 2048-1;                        // PWM 周期
 TA0CCTL1 = OUTMOD_3;                     // TACCR1设置/复位
 TA0CCR1 = 2047;                          // TACCR1 PWM 占空比
 TA0CTL = TASSEL__ACLK | MC__UP;          // ACLK、向上计数模式
 __ bis_SR_register (LPM3_bits | GIE);      //输入 LPM3、启用中断

 返回0;


// ADC12中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_vector
__interrupt void ADC12ISR (void)
#Elif 已定义(_ GNU _)
void __attribute_((interrupt (ADC12_vector))) ADC12ISR (void)
#else
#错误编译器不受支持!
#endif
{
 switch (__even_in_range (ADC12IV、ADC12IV_ADC12RDYIFG))
 {
   情况 ADC12IV_NONE:       break;       //矢量 0: 无中断
   案例 ADC12IV_ADC12OVIFG: break;       // Vector 2: ADC12MEMx 溢出
   情况 ADC12IV_ADC12TOVIFG:break;       // Vector 4: 转换时间溢出
   情况 ADC12IV_ADC12HIIFG: break;       // Vector 6: ADC12BHI
   案例 ADC12IV_ADC12LOIFG: break;       //矢量 8: ADC12BLO
   情况 ADC12IV_ADC12INIFG: break;       // Vector 10: ADC12BIN
   情况 ADC12IV_ADC12IFG0:                //矢量12: ADC12MEM0中断
     如果(ADC12MEM0 >= 0x7ff)              // ADC12MEM0 = A1 > 0.5AVcc?
       P1OUT |= BIT0;                     // P1.0=1
     否则
       P1OUT &=~BIT0;                    // P1.0 = 0
     中断;
   情况 ADC12IV_ADC12IFG1:  break;       //向量14: ADC12MEM1
   情况 ADC12IV_ADC12IFG2:  中止;       //矢量16: ADC12MEM2
   情况 ADC12IV_ADC12IFG3:  中止;       //矢量18: ADC12MEM3
   案例 ADC12IV_ADC12IFG4:  中断;       //矢量20: ADC12MEM4
   案例 ADC12IV_ADC12IFG5:  中断;       //矢量22: ADC12MEM5
   情况 ADC12IV_ADC12IFG6:  break;       //矢量24: ADC12MEM6
   情况 ADC12IV_ADC12IFG7:  中断;       //矢量26: ADC12MEM7
   情况 ADC12IV_ADC12IFG8:  break;       //矢量28: ADC12MEM8
   情况 ADC12IV_ADC12IFG9:  break;       // Vector 30: ADC12MEM9
   案例 ADC12IV_ADC12IFG10: 中断;       //矢量32:ADC12MEM10  
   情况 ADC12IV_ADC12IFG11: break;       //矢量34: ADC12MEM11
   用例 ADC12IV_ADC12IFG12: break;       // Vector 36:ADC12MEM12  
   情况 ADC12IV_ADC12IFG13: break;       //矢量38: ADC12MEM13
   情况 ADC12IV_ADC12IFG14: break;       // Vector 40: ADC12MEM14
   情况 ADC12IV_ADC12IFG15: break;       // Vector 42: ADC12MEM15
   案例 ADC12IV_ADC12IFG16: 中断;       //矢量44:ADC12MEM16  
   情况 ADC12IV_ADC12IFG17: break;       //矢量46: ADC12MEM17
   情况 ADC12IV_ADC12IFG18: break;       //矢量48: ADC12MEM18
   情况 ADC12IV_ADC12IFG19: break;       // Vector 50: ADC12MEM19
   案例 ADC12IV_ADC12IFG20: break;       //矢量52: ADC12MEM20
   情况 ADC12IV_ADC12IFG21: break;       // Vector 54: ADC12MEM21
   情况 ADC12IV_ADC12IFG22: break;       //矢量56: ADC12MEM22
   案例 ADC12IV_ADC12IFG23: 中断;       //矢量58:ADC12MEM23  
   情况 ADC12IV_ADC12IFG24: break;       // Vector 60: ADC12MEM24
   情况 ADC12IV_ADC12IFG25: 中止;       //矢量62: ADC12MEM25
   情况 ADC12IV_ADC12IFG26: break;       // Vector 64: ADC12MEM26
   情况 ADC12IV_ADC12IFG27: break;       // Vector 66: ADC12MEM27
   情况 ADC12IV_ADC12IFG28: break;       // Vector 68: ADC12MEM28
   情况 ADC12IV_ADC12IFG29: break;       // Vector 70: ADC12MEM29
   情况 ADC12IV_ADC12IFG30: break;       //矢量72: ADC12MEM30
   情况 ADC12IV_ADC12IFG31: break;       // Vector 74: ADC12MEM31
   案例 ADC12IV_ADC12RDYIFG:break;       // Vector 76: ADC12RDY
   默认值:中断;
 }

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

    当 ADC12VRSEL=1时、REF 可根据 ADC 的请求自动打开[请参阅用户指南(SLAU367P)图3-1和第34.2.4节]。

    这只是其中一半、因为 REFVSEL=0、所以 VREF 应该是1.2V 而不是2.0V。

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

    是否应该将 REFON 设置为打开电压基准?

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

    如果您查看我参考的图(33-1、右下角)、您将会看到为 REFON "或" ADC 的请求发出了使能。 第一节提到(34.2.4)用文字解释了这一点。  

    不同之处在于、如果您设置 REFON=1、REF 将保持打开状态、但(取决于 ADC 配置) ADC 会动态地将其打开/关闭。 如果发生这种情况、您可以在采样过程中看到启动延迟[根据数据表(SLAS704G)表5-32]。 这在16sps 时可能不会被注意到、平衡起来可能是功耗方面的优势。

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

    好的、谢谢! 很有道理。 因此应将其设置为1.2V 内部电压、但我的数据显示基准电压为2V。 如果您在1.65V INPUT => 0xD69中获取如上所示的输出。 对于2V 基准、我得到:2V/4096 * 3433 (D69)= 1.67V、这非常接近。 如果它的基准电压为1.2V、那么1.65V 输入应该为0xFFF。

    我在 P1.2/A2中检查了输入电压、该电压与我从电源发送的电压相符。

    如果我使用 Vref = AVCC、也会看到这一点。

    有人想知道为什么会发生这种情况吗?

    谢谢!

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

    如果您在 Vref = VCC (ADC12VRSEL=0)时得到相同的结果、听起来就像外部一样。

    SHT0=0非常短。 您的源的阻抗是多少? (那里是否有电阻分压器?)

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

    我仅使用 TI 提供的代码、因此我尚未修改 SHT0寄存器、我刚才也修改了该寄存器。 我尝试了值1、2、3和4、但读取了相同的值。

    施加的电压直接来自电源。

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

    我在使用上述代码的 Launchpad (修订版2.0)上看不到这种行为。 我这里没有可变电压源、但我有1.8V 电源。 如果我更改:

    1) 1) Nothing:0xFFF

    2) 2) ADC12VRSEL=0:0x7FA

    3) REFVSEL=1 (REFON=0):~0xE60

    它们看起来都是正确的。

    我不确定我们的做法有何不同。

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

    好的、我想我解决了。 我将模拟输入移到了另一个引脚、东西可以正常工作。

    我猜可能是我以某种方式损坏了输入。

    感谢您的帮助!