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.

[参考译文] MSP430F5529 ADC12_A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/957181/msp430f5529-adc12_a

你好

我对以下代码有2个问题、这些代码正常工作。 如果完全覆盖了连接到 ADC12_A 输入(引脚6.0)的光电电阻器、则代码的目的是打开连接到引脚1.0的 LED、否则它会关闭 LED。

问题是:

1 - ADC12_A 的默认分辨率是多少? 根据数据表、使用 ADC12CTL2寄存器中的 ADC12RES 位来定义分辨率。 它可以是8、10、0r 12。 在以下代码中、ADC12RES=0表示分辨率是8位、 但分辨率是12而不是8?

2 -在此代码中、转换结果可在 ADC12MEM0存储器寄存器中获得。 默认情况下、引脚6.0是否连接到此寄存器? 我想我们需要明确地配置 ADC12MEM0存储器寄存  器、以便使用 ADC12MCTL0控制寄存器从其中一个 ADC12输入引脚读取数据。 我的理解是否正确?

代码如下:

--------------------------------------------------------------------

#include

int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
ADC12CTL0 = ADC12SHT00 + ADC12ON;//采样时间、ADC12打开
ADC12CTL1 = ADC12SHP+ADC12SSEL1;//使用采样定时器+定时器时钟为 ACLK
ADC12IE = ADC12IE0;//启用中断,也可以使用0x01
ADC12CTL0 |= ADC12ENC;
P6SEL |= BIT0;// P6.0 ADC 选项选择
P1DIR |= BIT0;// P1.0输出
P1OUT &=~BIT0;
while (1)

ADC12CTL0 |= ADC12SC;//开始采样/转换

_bis_SR_register (LPM0_bits + GIE);// LPM0、ADC12_ISR 将强制退出


#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)

switch (__evo_in_range (ADC12IV、34))

情况0:中断;//向量0:无中断
情况2:中断;//矢量2:ADC 溢出
情况4:中断;//矢量4:ADC 时序溢出
情况6://向量6:ADC12IFG0
如果(ADC12MEM0 < 0x7ff)// ADC12MEM = A0 < 0.5AVcc?
P1OUT &=~BIT0;// P1.0 = 1
其他
P1OUT |= BIT0;// P1.0 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU

情况8:中断;//向量8:ADC12IFG1
情况10:中断;//向量10:ADC12IFG2
情况12:中断;//向量12:ADC12IFG3
案例14:中断;//矢量14:ADC12IFG4
情况16:中断;//向量16:ADC12IFG5
情况18:中断;//向量18:ADC12IFG6
情况20:中断;//向量20:ADC12IFG7
情况22:中断;//向量22:ADC12IFG8
情况24:中断;//向量24:ADC12IFG9
情况26:中断;//向量26:ADC12IFG10
情况28:中断;//向量28:ADC12IFG11
情况30:中断;//向量30:ADC12IFG12
情况32:中断;//向量32:ADC12IFG13
案例34:中断;//矢量34:ADC12IFG14
默认值:break;

----------------------------------------------------

谢谢

Mahmoud

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

    1) 1) ADC12RES=2、因此如果您不对其进行更改、分辨率为12位。 [参考用户指南(SLAU208Q)表28-6.] 此代码看起来需要12位。

    2) 2)使用 ADC12MCTL0:ADC12INCH 设置 MEM0的 AN。 复位时 ADC12MCTL=0、因此如果你不改变它、它指 A0 (INCH=0)。 [参考用户指南表28-8]。 您使用的是(省略) CONSEQ=0、它使用 MCTL0/MEM0 (除非您使用 ADC12CTL1:ADC12CSTARTADD 进行更改)。

    未经请求:

    >ADC12CTL1 = ADC12SHP+ADC12SSEL1;//使用采样定时器+定时器时钟为 ACLK

    ADC12SSEL1是位名称、而不是字段值、因此这实际上会设置 ssel=2。 要获得 ssel=1、请使用 ADC12SSEL_1。  

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

    尊敬的 Bruce:

       我希望你们有一个安全和快乐的感恩节假期。 非常感谢您的详细答复。

    我仍在为您的最后一条评论而挣扎、请您详细解释为什么 ACD12SSEL1设置 ssel=2? 位名称和字段名称之间有何区别?

    谢谢

    Mahmoud

    。  

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

    ADC12SSEL1只是 ADC12SSEL 域的位1 (而不是位0)。 ADC12SSEL_1是 ADC12SSEL 域中的值1。 您的注释显示您需要 ACLK、在 ADC12SSEL 字段中该值为1。

    #define ADC12SSEL0 (0x0008)/* ADC12时钟源选择位:0 */
    #define ADC12SSEL1 (0x0010)/* ADC12时钟源选择位:1 */
    [...]
    #define ADC12SSEL_0 (0*8u)/* ADC12时钟源选择:0 */
    #define ADC12SSEL_1 (1*8u)/* ADC12时钟源选择:1 */
    #define ADC12SSEL_2 (2*8u)/* ADC12时钟源选择:2 */
    

    在实践中、我几乎从未使用位名称、但我想应该定义它们、因为它们在用户指南中。

    [编辑:添加了 ssel_2进行比较。]

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

    感谢 Bruce 的回答。

    我还有一个关于多通道 ADC 的问题。 以下代码转换 A0 (6.0)和 A1 (6.1)的模拟输入。 它会根据输入电压使板载 LED 闪烁。 不幸的是,它不起作用。 如果我发生配置错误、请告诉我。

    #include

    int main (空)

    WDTCTL = WDTPW + WDTHOLD;//停止 WDT
    ADC12CTL0 |= ADC12SHT0_0 + ADC12ON;//采样时间、ADC12打开
    ADC12CTL1 |= ADC12SHP+ADC12SSEL_1_ADC12CONSEQ_1;//使用采样定时器+定时器时钟为 ACLK+通道序列
    ADC12MCTL0|=ADC12INCH_0;// A0=6.0
    ADC12MCTL1|=ADC12INCH_1_ADC12EOS;// A1=6.1、序列结束
    ADC12IE = ADC12IE0+ADC12IE1;//启用来自 MEM0和 MEM1的中断、
    ADC12CTL0 |= ADC12ENC;
    P6SEL |= BIT0+BIT1;// P6.0 ADC 选项选择
    P1DIR |= BIT0;// P1.0输出
    P1OUT &=~BIT0;
    P4DIR |= BIT7;// P4.7输出
    P4OUT &=~BIT7;
    while (1)

    ADC12CTL0 |= ADC12SC;//开始采样/转换

    _bis_SR_register (LPM0_bits + GIE);// LPM0、ADC12_ISR 将强制退出


    #pragma vector = ADC12_vector
    _interrupt void ADC12_ISR (void)

    switch (__evo_in_range (ADC12IV、34))

    情况0:中断;//向量0:无中断
    情况2:中断;//矢量2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    情况6://向量6:ADC12IFG0
    如果(ADC12MEM0 < 0x7ff)// ADC12MEM0 = A0 < 0.5AVcc?
    P1OUT &=~BIT0;// P1.0 = 1
    其他
    P1OUT |= BIT0;// P1.0 = 0
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
    中断;
    案例8:
    如果(ADC12MEM1 < 0x2ff)// ADC12MEM1 = A1 < 0.5AVcc?
    P4OUT &=~BIT7;// P4.7 = 1
    其他
    P4OUT |= BIT7;// P4.7 = 0
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU

    中断;//向量8:ADC12IFG1
    情况10:中断;//向量10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//矢量14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//向量18:ADC12IFG6
    情况20:中断;//向量20:ADC12IFG7
    情况22:中断;//向量22:ADC12IFG8
    情况24:中断;//向量24:ADC12IFG9
    情况26:中断;//向量26:ADC12IFG10
    情况28:中断;//向量28:ADC12IFG11
    情况30:中断;//向量30:ADC12IFG12
    情况32:中断;//向量32:ADC12IFG13
    案例34:中断;//矢量34:ADC12IFG14
    默认值:break;

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

    根据用户指南(SLAU208Q)第28.2.7.2节、必须明确清除 ADC12SC (然后再进行设置)、并且 CONSEQ=1。 这是不明显的,事实上我自己忘记了。 这句话是指"序列"、但由于您的 MSC=0、因此实际上是在每次转换后。  

    因此、只需在设置 ADC12SC 之前添加以下内容:

    >ADC12CTL0 &=~ADC12SC;  //清除以进行下一次转换

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

    谢谢 Bruce、我已经尝试了您的建议。 它部分工作、因为我目前只能看到 ADC12将数据放置在 MEM1中的指示。 MEM0无响应。 因此在以下代码中、仅 LED 4.7关闭和打开。 请给出建议。

    #include

    int main (空)

    WDTCTL = WDTPW + WDTHOLD;//停止 WDT
    ADC12CTL0 |= ADC12SHT0_8 + ADC12ON;//采样时间、ADC12打开
    ADC12CTL1 |= ADC12SHP+ADC12SSEL_1_ADC12CONSEQ_1;//使用采样定时器+定时器时钟为 ACLK+通道序列
    ADC12MCTL0|=ADC12INCH_0;// A0=6.0
    ADC12MCTL1|=ADC12INCH_1_ADC12EOS;// A1=6.1、序列结束
    ADC12IE = ADC12IE0+ADC12IE1;//启用来自 MEM0和 MEM1的中断、
    ADC12CTL0 |= ADC12ENC;
    P6SEL |= BIT0+BIT1;// P6.0 ADC 选项选择
    P1DIR |= BIT0;// P1.0输出
    P1OUT &=~BIT0;
    P4DIR |= BIT7;// P4.7输出
    P4OUT &=~BIT7;
    while (1)

    ADC12CTL0 &=~ADC12SC;
    ADC12CTL0 |= ADC12SC;//开始采样/转换

    _bis_SR_register (LPM0_bits + GIE);// LPM0、ADC12_ISR 将强制退出


    #pragma vector = ADC12_vector
    _interrupt void ADC12_ISR (void)

    switch (__evo_in_range (ADC12IV、34))

    情况0:中断;//向量0:无中断
    情况2:中断;//矢量2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    情况6://向量6:ADC12IFG0
    如果(ADC12MEM0 < 0x2ff)// ADC12MEM0 = A0 < 0.5AVcc?
    P1OUT &=~BIT0;// P1.0 = 1
    其他
    P1OUT |= BIT0;// P1.0 = 0
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
    中断;
    案例8:
    如果(ADC12MEM1 < 0x2ff)// ADC12MEM1 = A1 < 0.5AVcc?
    P4OUT &=~BIT7;// P4.7 = 1
    其他
    P4OUT |= BIT7;// P4.7 = 0
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
    //向量8:ADC12IFG1
    情况10:中断;//向量10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//矢量14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//向量18:ADC12IFG6
    情况20:中断;//向量20:ADC12IFG7
    情况22:中断;//向量22:ADC12IFG8
    情况24:中断;//向量24:ADC12IFG9
    情况26:中断;//向量26:ADC12IFG10
    情况28:中断;//向量28:ADC12IFG11
    情况30:中断;//向量30:ADC12IFG12
    情况32:中断;//向量32:ADC12IFG13
    案例34:中断;//矢量34:ADC12IFG14
    默认值:break;

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

    当我在 Launchpad 上运行此代码时、我会同时从 P6.0和 P6.1获得响应。 我的测试用例非常原始-我只是将引脚跳至 GND 或3V3。  

    您连接到这些引脚的是什么?

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

    您好、Bruce、

       谢谢、问题出在我这边、我的引脚6.0不工作。 感谢您的参与、祝您假期愉快。