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.

[参考译文] MSP430FR5889:在具有ESI模块的FR系列中读取ADC时出现问题。

Guru**** 670100 points
Other Parts Discussed in Thread: MSP430FR5889, MSP-EXP430FR6989
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/592068/msp430fr5889-problem-in-reading-adc-in-fr-series-having-esi-module

部件号:MSP430FR5889
主题中讨论的其他部件: MSP-EXP430FR6989

尊敬的团队:

我们在MSP430FR5889微控制器中读取ADC通道A3 (WFP 1.3)时遇到了问题。 原始ADC值不断变化。 但当我们将P9输出端口值更改为0x00 (即P9OUT = 0x00)时,读数看起来稳定。 我们后来注意到,端口9与ESI模块针脚多路复用。 我们还在调试器中检查了要禁用的ESI模块寄存器。  

请帮助我们解决问题。 将0x00加载到端口9将如何稳定ADC值。 ?  

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

    您是否能够共享端口,ESI和ADC初始化代码以及问题的屏幕截图? 如果P9SEL寄存器未选择功能,ESI在端口9上不会有影响。 无论以何种速率,建议将未使用的引脚作为低输出驱动。

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

    尊敬的Ryan:

    请查找端口设置,ADC设置,我们未配置的ESI的屏幕快照。 保留默认值。 我们使用8 MHz晶体来处理HF XTAL引脚。

    MCLK = 8 MHz

    SMCLK = 8 MHz

    ADC时钟=2 MHz

    为ADCMEMM1配置的A3的输入电压为0V。 原始ADC计数仍然非常高。

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

    您是否禁用GPIO开机默认高阻抗模式以激活先前配置的端口设置(PM5CTL0 &=~LOCKLPPM5;)?
    在WFP 1.2 上没有发现类似的现象? 它会发生在所有转换中,而不仅仅是前几个转换中? 如果您仅在单通道模式下从A3采样,问题是否仍然存在? 与当前的问题不同,您为什么不使用TimerB作为ADC12样品和保持源选择? 取代软件ADC12SC?

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

    您是否禁用GPIO开机默认高阻抗模式以激活先前配置的端口设置(PM5CTL0 &=~LOCKLPPM5;)?
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ________________________________________________________________
    在WFP 1.2 上没有发现类似的现象? 它会发生在所有转换中,而不仅仅是前几个转换中?
    世纪:是的,在WFP 1.2 ,和WFP 1.3
    ________________________________________________________________
    如果您仅在单通道模式下从A3采样,问题是否仍然存在?
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    世纪:是的。
    ________________________________________________________________
    与当前的问题不同,您为什么不使用计时器B作为ADC12样品和保持源选择? 取代软件ADC12SC?
    ________________________________________________________________

    世纪:定时器B用于比较和捕获ADC采样时间生成(我们捕获电源频率,平均值并生成ADC采样时间以增强正常模式抑制)。

    真正的问题是,当我们在端口9上写入时,端口1受到干扰。

    如前所述,如果未使用端口9,端口1将正常工作

    我们是否能找到任何解决方案。

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

    您能否通过对TI提供的ADC C示例进行细微修改来演示此行为?  这将有助于开始内部调查,因为它显示我无法使用以下代码重现错误(未针对您的应用程序进行优化):

    #include <MSP430.h>
    
    volatile unsigned int result = 0;
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止WDT
    
    //配置GPIO
    P1OUT &=~BIT0; //清除LED以启动
    P1DIR |= BIT0; //将WFP的1.0 设置为输出
    P1SEL1 || BIT2| BIT3; //配置ADC输入A2和A3
    P1SEL0 || BIIT2 | BIT3;
    
    P9DIR = 0xFF;
    P1REN = 0x00;
    P9SEL0 = 0x00;
    P9SEL1 = 0x00;
    P9OUT = 0x00;
    
    //禁用GPIO通电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    //默认情况下,REFSTR=1 => REFCTL用于配置内部参考
    ,同时(REFCTL0和REFGENBUSY); //如果ref发生器忙,请等待
    REFCTL0 || REFVSEL_0| REFON; //选择内部参考= 1.2V
    //内部参考打开
    
    //配置ADC12
    ADC12CTL0 = ADC12SHT0_6 | ADC12ON | ADC12MSC; //采样时间,
    ADC12CTL1上的ADC12 = ADC12SHP | ADC12DIV_3 | ADC12CONSEQ_1; //使用采样计时器
    ADC12CTL2 || ADC12RES_2; // 12位转换结果
    ADC12MCTL0 |= ADC12INCH_2 | ADC12VRSEL_1; //通道2 ADC输入选择;Vref=AVCC
    ADC12MCTL1 |= ADC12INCH_3 | ADC12VRSEL_1 | ADC12EOS; //通道2 ADC输入选择;Vref=AVCC
    ADC12IER0 |= ADC12IE0; //启用ADC转换完全中断
    
    ,同时(!(REFCTL0 & REFGENRDY)); //等待参考发生器
    //在
    
    (1){
    
    __DELAY周期(5000);
    ADC12CTL0 || ADC12ENC | ADC12SC; //开始采样/转换
    
    __bis_sr_register (LPM0_bits + GIE); // LPM0,ADC12_ISR将强制退出
    __no_operation(); //用于调试器
    }
    }
    
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR(void)
    #Elif defined(__GNUC__)
    void __attribute__((interrupt (ADC12_vector))#interrupt lior))
    
    
    #endif
    {
    switch (__偶 数_in_range (ADC12IV,ADC12IV_ADC12RDYIFG))
    {
    案例ADC12IV_NONE: 中断; //矢量0:无中断
    CASE ADC12IV_ADC12OVIFG:中断; //矢量2:ADC12MEMx溢出
    CASE ADC12IV_ADC12TOVIFG:中断; //矢量4:转换时间溢出
    CASE ADC12IV_ADC12HIIFG:中断; //向量6:ADC12BHI
    CASE ADC12IV_ADC12LOIFG:中断; //矢量8:ADC12BLO
    CASE ADC12IV_ADC12INIFG:中断; //矢量10:ADC12BIN
    Case ADC12IV_ADC12IFG0: //向量12:ADC12MEM0中断
    结果= ADC12MEM0; //读出结果寄存器
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出活动CPU
    中断; //从0 (SR)清除CPUOFF位
    CASE ADC12IV_ADC12IFG1:中断; //矢量14:ADC12MEM1
    CASE ADC12IV_ADC12IFG2:中断; //矢量16:ADC12MEM2
    CASE ADC12IV_ADC12IFG3:中断; //向量18:ADC12MEM3
    CASE ADC12IV_ADC12IFG4:中断; //向量20:ADC12MEM4
    CASE ADC12IV_ADC12IFG5:中断; //矢量22:ADC12MEM5
    CASE ADC12IV_ADC12IFG6:Break; //矢量24:ADC12MEM6
    CASE ADC12IV_ADC12IFG7:Break; //矢量26:ADC12MEM7
    CASE ADC12IV_ADC12IFG8:Break; //矢量28:ADC12MEM8
    CASE ADC12IV_ADC12IFG9:Break; //向量30:ADC12MEM9
    CASE ADC12IV_ADC12IFG10:中断; //矢量32:ADC12MEM10
    CASE ADC12IV_ADC12IFG11:Break; //矢量34:ADC12MEM11
    CASE ADC12IV_ADC12IFG12:中断; //矢量36:ADC12MEM12
    CASE ADC12IV_ADC12IFG13:中断; //矢量38:ADC12MEM13
    CASE ADC12IV_ADC12IFG14:Break; //向量40:ADC12MEM14
    CASE ADC12IV_ADC12IFG15:中断; //矢量42:ADC12MEM15
    CASE ADC12IV_ADC12IFG16:Break; //矢量44:ADC12MEM16
    CASE ADC12IV_ADC12IFG17:Break; //矢量46:ADC12MEM17
    CASE ADC12IV_ADC12IFG18:中断; //矢量48:ADC12MEM18
    CASE ADC12IV_ADC12IFG19:中断; //矢量50:ADC12MEM19
    CASE ADC12IV_ADC12IFG20:Break; //矢量52:ADC12MEM20
    CASE ADC12IV_ADC12IFG21:Break; //矢量54:ADC12MEM21
    CASE ADC12IV_ADC12IFG22:中断; //矢量56:ADC12MEM22
    CASE ADC12IV_ADC12IFG23:Break; //矢量58:ADC12MEM23
    CASE ADC12IV_ADC12IFG24:中断; //向量60:ADC12MEM24
    CASE ADC12IV_ADC12IFG25:中断; //矢量62:ADC12MEM25
    CASE ADC12IV_ADC12IFG26:Break; //矢量64:ADC12MEM26
    CASE ADC12IV_ADC12IFG27:Break; //矢量66:ADC12MEM27
    CASE ADC12IV_ADC12IFG28:Break; //矢量68:ADC12MEM28
    CASE ADC12IV_ADC12IFG29:Break; //向量70:ADC12MEM29
    CASE ADC12IV_ADC12IFG30:中断; //矢量72:ADC12MEM30
    CASE ADC12IV_ADC12IFG31:中断; //矢量74:ADC12MEM31
    CASE ADC12IV_ADC12RDYIFG:中断; //矢量76:ADC12RDY
    默认值:break;
    }
    } 

    此致,Ryan

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

    尊敬的Ryan:  

    以上代码有效,因为P9OUT = 0x00,请尝试将一些值写入端口9并读取ADC A2和A3。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我设置P9OUT = 0xFF,A2/A3读数仍如预期。 这可能表示PCB布局存在问题。 我应该提及的是,这是使用MSP-EXP430FR6989的设备,MSP430FR5889的架构基于此设备。

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

     尊敬的Ryan:

    正在解决我们的问题,请查找所附的示波器输出,该示波器在微控制器针脚A2处检查,连接ADC输入,但不连接ADC输入。

    在此PIN上生成2.855Khz频率的脉冲。 另请查找附加的应用程序源代码。

     e2e.ti.com/.../Test-ADC.zip 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些示波器的发现是否独立于P9OUT? 测试ADC代码可以进一步减少,仅显示手头的错误,但屏幕截图似乎进一步指示硬件问题。 您是否能够共享原理图和布局图像?

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

    尊敬的Ryan:

    否,我们在此项目中使用P9OUT作为七段显示输出。

    是的,代码可以减少,但由于我们想在自由运行模式下调试,因此我们在代码中保留了显示部分。

    您能否与我们共享您的电子邮件ID,以便我们发送项目图解和布局详细信息。(公司条款以保持机密性)

    注:即使没有ADC输入到引脚,它也会产生脉冲,如上图所示。

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

    尊敬的Ryan:

    注意:当我们在A2输入引脚上加载频率约为2.8KHz的10K电阻时,我们会获得稳定的脉冲。

    在此代码捕获输入TTB 0.3 中,我们还使用捕获电源频率(约50 Hz =20毫秒)。

    我们将此时间除以64,以获得ADC采样间隔,并以该速率生成比较中断TB0CCTL1 (即20ms/64=312)
    美国(3.2KHz))。

    我们也不使用低频晶体。 引脚保持打开状态

    我们已经邮寄了必要的文件。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经回复了您的信息,也许我们可以从那里继续对话。

    此致,
    Ryan