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.

[参考译文] MSP430FR6989:ADC12_B 通道序列-重复采样

Guru**** 2562120 points
Other Parts Discussed in Thread: MSP430FR6989

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/602194/msp430fr6989-adc12_b-sequence-of-channels---repeated-sampling

器件型号:MSP430FR6989

您好!

我是 MSP430编程的新手。 我目前在 MSP430FR6989 LaunchPad 板上工作。 我想重复对3个 ADC 输入通道进行采样。 在浏览了数据表、用户指南和示例程序之后、我编写了以下代码来对 A3 (P1.3)、A4 (P8.7)和 A5 (P8.6)的模拟输入进行采样。

下面代码的预期行为是 ADC12应该将 MEM0 (无中断)、MEM1 (无中断)和 MEM2 (生成中断)转换为 MEM0、1和2中的寄存器内容、这样、采样和中断的序列将继续发生。 我在这里遇到的问题是,当我设置值  ADC12IER0 |= ADC12IE2 (即在序列末尾)时,不会生成中断。 而当我将值更改为  ADC12IER0 |= ADC12IE0时、会为 MEM0生成中断、并单独对通道 A3进行采样。 下面是代码。 在此处请求您的友好指导。 提前感谢您。

int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
P1SEL1 |= BIT3;//为 ADC
P1SEL0配置 P1.3 |= BIT3;
P8SEL1 |= BIT6;//

为 ADC P8SEL0配置 P8.6 |= BIT6;P8SEL7

~


|= BTR0 |= BTRL7;BTR0 (0)|= BTRL7 + BTR0 + BTRL0 (B8)
REFCTL0 |= REFVSEL_3 | REFON;

//配置 ADC12
ADC12CTL0 = ADC12SHT0_2 | ADC12ON;
ADC12CTL1 = ADC12SHP| ADC12CONSEQ_2;
ADC12CTL2 &= 0xCHAN;// 8位分辨率= ADC12SHP



| ADC12CONSEQ2;ADC12MCTR12SDO = ADC12MCI0 | ADC12MC12SDO = ADC12MC12ENCH = ADC12MC12ADC12EN0;ADC12MC12MCTR0 | ADC12ENC12ENC12R = ADC12SDO
//Vref = 2.5V

ADC12MCTL1 |= ADC12INCH_4;// A4 CHAN
ADC12MCTL1 |= ADC12VRSEL_1;//Vref = 2.5V

ADC12MCTL2 |= ADC12INCH_5+ADC12EOS;// ADC12MCTL 采样序列结束;



// ADC12MCTL2 |= 2.5V

转换周期
;// ADC12INCH_0 = ADC12L12_1;// ADC12VREF_0 (= ADC12_1)|= ADC12VREF_0转换周期;// ADC12_ADC12_ADC12_0 (= ADC12VREF_1);// ADC12_ADC12_ADC12_ADC12_ADC12 //仅用于调试
}
#pragma

vector = ADC12_vector
__interrupt void ADC12_ISR (void)
#endif
{
switch (_even_in_range (ADC12IV、ADC12IV_ADC12RDYIFG))
{
case ADC12IV_NOE:break;// vector 0:no interrupt
case 12IV_ADC12IV_ADC12VECI:ADC12VECI:ADC12VEC4:ADC12VECI:ADC12VECG
溢出/ ADC12VECI:ADC12VECI:ADC12VECI:ADC12VECG
ADC12BHI
case ADC12IV_ADC12LOIFG:break;//向量8:ADC12BLO
case ADC12IV_ADC12INIFG:break;//向量10:ADC12BIIN
case ADC12IV_ADC12IFG0:break;//向
量12:ADC12MEM0 = ADC1216;ADC12MEM2
= ADC12= ADC12MEM2;ADC12= ADC12MEM2 case

ADC12= ADC12= ADC12MEM2;ADC12MEM1:ADC12= ADC12MEM2;ADC12ADC12= ADC12MEM1:ADC12MEM2;ADC12ADC12= ADC12MEM1:ADC12ADC12ADC12MEM2;ADC12ADC12ADC12MEM1:ADC12ADC12ADC12=



case ADC12IV_ADC12IFG4:break;//向量20:ADC12MEM4
case ADC12IV_ADC12IFG5:break;//向量22:ADC12MEM5
case ADC12IV_ADC12IFG6:break;//向量24:ADC12MEM8
case ADC12IV_ADC12IFM9



;ADC12MEM8 case:ADC1224:ADC12MEM8:ADC1224:ADC12MEM8;ADC1224:ADC12MEM8 case:ADC1224:ADC1224:ADC12MEM8;ADC1224:ADC12MEM8:ADC1224:ADC1224:ADC1224:ADC12MEM8 case:ADC 

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

    阿鲁昆马、您好!

    首先、为了在将来获得更快的响应、请使用代码格式化工具(看起来是这样的 以上)。 这使代码更易于阅读、您将收到更多答复。 这次我将为您执行此操作。

    看起来您使用的是重复单通道模式、请尝试更改代码以设置 ADC12CONSEQ_3。

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

    尊敬的 Cameron P. LaFollowette:
    感谢您的回复。 根据您的建议、我将代码更改为 ADC12CONSEQ_3 (通道的重复序列)并在 Launchpad 中进行测试、但即使在更改之后、ADC 中断也不会触发、数据也不会转换并存储在 MEM0、1、2寄存器中。
    我的一次尝试是,当我使用 ADC12IE0加载 ADC12IER0寄存器时,仅为 MEM0转换触发中断,其他通道未被转换。
    请告诉我我在这里犯的错误。

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

    阿鲁昆马、您好!

    我用 IE0尝试了您的测试、它没有触发、因此我不确定它是如何为您触发的... 我很想查看您在本例中的整个测试代码。

    看起来您的全局中断未启用。

    尝试一下、我对它进行了测试、它工作正常。 确保您使用的是正确的 CONSEQx

    while (1)
    {
    _delay_cycles (5000);//转换之间的延迟
    ADC12CTL0 |= ADC12ENC | ADC12SC;//采样和转换开始
    _ bis_SR_register (GIE); //
    __no_operation();//仅用于调试
    } 

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

    Cameron P. Lafollette、您好!

    很抱歉、我在 这个论坛开始时发布的代码中出现了拼写错误。 我在我发布的代码中错过了启用全局中断 LOC。 我在 Launchpad 上测试的代码具有这个 GIE LOC、这就是我可以看到针对 MEM0触发中断的原因。

    在通过互联网进行广泛搜索(浏览了大量 ADC 示例代码)并在用户指南中再次浏览 ADC12寄存器后、我找到了它、并需要使用 ADC12MEM0、ADC12MEM1和 ADC12MEM2。

    现在、我能够为每个 MEMx 寄存器数据加载获取中断。 我对 ADC CTRL 寄存器进行了一些更新,下面是我在 MSP430FR6989 Launchpad 上测试的工作代码:  

    unsigned short ADCValue0=0;
    unsigned short ADCValue1=0;
    unsigned short ADCValue2=0;
    
    int main (void)
    
    {
    
    WDTCTL = WDTPW | WDTHOLD;//停止 WDT
    
    P1SEL1 |= BIT3;//为 ADC
    P1SEL0配置 P1.3 |= BIT3;
    
    //为 P8SEL6
    | P8L1 |= BIT1;//配置 P8 SEL6 | P8
    
    //为 ADC
    P8SEL0配置 P8.7 |= BIT7;
    
    PM5CTL0 &=~LOCKLPM5;
    
    
    while (REFCTL0 & REFGENBUSY);
    
    REFCTL0 |= REFVSEL_3 | REFON;
    
    
    //配置 ADC12
    ADC12CTL0 = ADC12MC12|ADC12C12| ADC12C120
    
    | ADC12C12C12| ADC12C12+ ADC12C12C12+ ADC12C12+ ADC12C12+ ADC12C12+ ADC12C12+ ADC12C12C12+ ADC12C12+ ADC12C12+ ADC12C12+ ADC12C12+ ADC12C12C12+ ADC12C12+ ADC12C12C12+ ADC
    //生成针对 MEM0、MEM1、MEM2 ADC 的中断新数据加载
    
    
    ADC12MCTL0 = ADC12VRSEL_1 | ADC12INCH_3;//模拟通道3
    ADC12MCTL1 = ADC12VRSEL_1 | ADC12INCH_4;//模拟通道4
    ADC12MCTL2 = ADC12MCTL1 | ADC12VREF_0
    
    
    
    + ADC12REF_0 + ADC12ENCH 转换(ADC12EN5)+ ADC12REF_1 + ADC12REF_0 + ADC12ENCH + ADC12REF_0 + ADC12ENCH + ADC12EN5转换(ADC12ENCH + ADC12EN5 + ADC12ENC12ENCH + ADC12
    
    //采样和转换开始
    __bis_SR_register (LPM0_bits + GIE);
    __no_operation ();//仅用于调试
    
    }
    
    
    
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    {
    
    switch (_even_in_range (ADC12IV、ADC12IV_INTERRUPT)
    
    = ADC12_ADC12_ADC12_ADC12_ADC12G;ADC12VEC12VEC4:ADC12_ADC12_ADC12_ADC12G:ADC12_ADC12_ADC12G:ADC12_ADC12_ADC12VEC4:ADC12_ADC12_ADC12_ADC12G:ADC12_
    
    转换时间溢出
    案例 ADC12IV_ADC12HIIFG:break;//向量6:ADC12BHI
    案例 ADC12IV_ADC12LOIFG:break;//向量8:ADC12BLO
    案例 ADC12IV_ADC12INIFG:break;//向量10:ADC12BIN_ADC12BIF_ADC12_ADC12R
    =
    
    
    ADC12/ ADC12_ADC12_ADC12_ADC12_ADC12_ADC0 = ADC12/ ADC12_ADC12_ADC12_ADC12_ADC12_ADC12_ADC0 = ADC12_ADC12_ADC12_ADC12_ADC0 = ADC12_ADC12_ADC12_ADC12_ADC12_ADC0 =
    
    
    ADCValue1 = ADC12MEM1;break;//向量14:ADC12MEM1
    case ADC12IV_ADC12IFG2:ADCValue2 = ADC12MEM2;break;//向量16:ADC12MEM2
    
    默认值:break;
    }
    

    
    

    如果可能、请您进行测试、并让我知道您的最终结果

    感谢您向我推荐您的想法和意见。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了。 我假设您省略了 MSC 位、因为您需要通道之间的延迟。 我的错误! :-)

    它应该仍然可以处理 MSC 位、但它需要通过 while (1) 3次。