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.

[参考译文] CCS/MSP430FR6989:MSP430FR6989 ADC 设置

Guru**** 2768815 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/691288/ccs-msp430fr6989-msp430fr6989-adc-setup

器件型号:MSP430FR6989

工具/软件:Code Composer Studio

大家好、

我正在尝试为 MSP430FR6989 MCU 设置 ADC 引脚。 我为 A10引脚编写了这部分代码、工作正常。

void ADC_Setup (void)
{
#define ADC12_SHT_16 0x0200 //用于采样保持的16个时钟周期
#define ADC12_ON 0x0010 //用于打开 ADC12外设
#define ADC12_SHT_SRC_SEL 0x0200 //选择采样保持的源
#define ADC12_12bit 0x0020 //使用 ADC92_P00012位分辨
率#define ADC92_SEL/ ADC00012位#define ADC92输入 模拟输入


ADC12CTL0 = ADC12CTL0 | ADC12ENC;//启用转换
ADC12CTL0 = ADC12CTL0 | ADC12SC;//开始转换



ADC12CTL0 = ADC12_SHT_16 | ADC12_ON;//开启、设置采样保持时间
C12C12CTL0 = ADC12_SHT_16;//指定 ADC12_SOURCE;ADC12_SHIP = ADC12_SHIP = ADC12_C12_TCC12_ON;//指定 ADC12_TCC12_TCC12_SHIP;//
// 12位转换结果
ADC12MCTL0 = ADC12_P92;// P9.2是模拟输入 

但我想在代码中再添加一个 ADC 引脚。 我想使用 A9引脚作为模拟输入。 在 ADC 设置块中,我为 A9添加了这4行,如果我还设置其他内容,设置 A9是否足够?

#define ADC12_P91 0x0009 //将输入 P9.1用于模拟输入

ADC12MCTL1 = ADC12_P91;// P9.1是模拟输入

ADC12CTL1 = ADC12CTL1 | ADC12ENC;//启用转换
ADC12CTL1 = ADC12CTL1 | ADC12SC;//开始转换 

谢谢!

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

    您是从某个地方编写代码还是复制了代码?
    如果不分析您的代码、我说初始条件是关键。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要同时对两个通道进行采样、请使用 CONSEQ=1 [参考 SLAU367O 表34-5和图34-9]、MSC=1 [第34.2.8.5节和表34-4]。 您将需要在 ADC12MCTL1中设置 ADC12EOS。 我看不到您是如何检查完成的、但您需要使用 ADC12IFG1而不是 ADC12IFG0。 (或者:ADC12BUSY 仍然可以工作。)
    ----
    >ADC12CTL1 = ADC12CTL1 | ADC12ENC;//启用转换
    >ADC12CTL1 = ADC12CTL1 | ADC12SC;//开始转换
    ADC12ENC 和 ADC12SC 位于 ADC12CTL0中。
    ----
    在您的第一个代码片段中、您需要先启用(ENC)并启动(SC) ADC、然后再进行设置。 显而易见、这也是一个问题、因为一旦您设置 ENC=1、您就无法更改您尝试更改的某些内容。 向下移动这些行以按照设置进行操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include 
    #define ENABLE_Pins 0xFFFE //启用输入和输出
    void ADC_Setup (void);//用于设置 ADC12外设
    unsigned int VNew、vold;
    main ()
    {
    WDTCTL = WDTPW | WDTHOLD;//停止 WDT
    PM5CTL0 = ENABLE_Pins;//启用输入和输出
    P8DIR = BIT4 + BIT4 + BIT6 + BIT4;//将 port8位4 5 6 7设置为输出
    P9DIR = BIT0;//将 PORT9位0设置为输出
    ADC_Setup();//设置 ADC 外设
    VOLD = 0;
    while (1)
    {
    ADC12CTL0 = ADC12CTL0 | ADC12ENC;//启用转换
    ADC12CTL0 = ADC12CTL0 | ADC12SC;//开始转换
    
    VNew = ADC12MEM0;
    IF (((VNew >= 0x460)&&(VNew <= 0x540))//输入0.9~1.1、5伏
    {
    P8OUT |= BIT4;
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    Vold = VNew;
    
    }
    否则、如果((VNew >= 0xB20)&&(VNew <= 0xCA0))//输入2.3~2.6、12伏
    {
    P8OUT &=(~BIT4);
    P8OUT |= BIT5;
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    Vold = VNew;
    
    }
    否则、如果(VNew < 0x300)//输入为零(小于0.6V?)
    {
    if (((vold >= 0xB20)&&(vold <= 0xCA0))//old 输入2.3~2.6、12伏
    {
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT |= BIT7;
    P9OUT |= BIT0;
    
    }
    否则、如果((vold >= 0x460)&&(vold <= 0x540))// OLD 输入0.9~1.1、5伏
    {
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT |= BIT6;
    P8OUT &=(~BIT7);
    P9OUT |= BIT0;
    
    }
    其他
    {
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    }
    }
    否则{
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    
    }
    
    
    //结束 while (1)
    }//结束 main ()
    
    void ADC_Setup (void)
    {
    #define ADC12_SHT_16 0x0200 //采样保持的16个时钟周期
    #define ADC12_ON 0x0010 //用于在
    #define ADC12_SHT_SEL 0x0200上打开 ADC12_ON 0x0012外设
    #define ADC12_SHT_SEL 0x0200 //为 ADC12_HOLD 选择源/ define ADC1212位分辨率0x12位/define ADC12_SEL
    0x000A //对模拟输入使用输入 P9.2
    ADC12CTL0 = ADC12_SHT_16 | ADC12_ON;//开启、设置采样保持时间
    ADC12CTL1 = ADC12_SRC_SEL;//指定采样保持时钟源
    ADC12CTL2 = ADC12_12BIT;// ADC12_P92_ADC12_SEL
    = ADC12_ADC12_ADC92 = ADC12_BIT 转换结果
    

    我从零写入代码、这是全代码块。 但我还想另外使用 A9。  

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

    我们在您的注释中使用了所有寄存器。 我们还在 P9、7上使用 LED2来测试第二个 ADC 通道、它无法正常工作。

    这是我们的应用程序的完整代码。

    #include 
    #define ENABLE_Pins 0xFFFE //启用输入和输出
    void ADC_Setup (void);//用于设置 ADC12外设
    unsigned int VNew、vold、Vout;
    main ()
    {
    WDTCTL = WDTPW | WDTHOLD;//停止 WDT
    PM5CTL0 = ENABLE_Pins;//启用输入和输出
    P8DIR = BIT4 + BIT4 + BIT6 + BIT4;//将 port8位4 5 6 7设置为输出
    P9DIR = BIT0 + BIT7;//将 PORT9位0设置为输出
    ADC_Setup();//设置 ADC 外设
    VOLD = 0;
    while (1)
    {
    ADC12CTL0 |= ADC12ENC;
    ADC12CTL0 = ADC12CTL0 | ADC12SC;//开始转换
    
    VOUT = ADC12MEM1;
    如果((Vout >= 0x460)&&(Vout <= 0x540)){
    P9OUT &=(~BIT7);
    }
    else P9OUT |= BIT7;
    
    VNew = ADC12MEM0;
    IF (((VNew >= 0x460)&&(VNew <= 0x540))//输入0.9~1.1、5伏
    {
    P8OUT |= BIT4;
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    Vold = VNew;
    }
    否则、如果((VNew >= 0xB20)&&(VNew <= 0xCA0))//输入2.3~2.6、12伏
    {
    P8OUT &=(~BIT4);
    P8OUT |= BIT5;
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    Vold = VNew;
    }
    否则、如果(VNew < 0x300)//输入为零(小于0.6V?)
    {
    if (((vold >= 0xB20)&&(vold <= 0xCA0))//old 输入2.3~2.6、12伏
    {
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT |= BIT7;
    P9OUT |= BIT0;
    }
    否则、如果((vold >= 0x460)&&(vold <= 0x540))// OLD 输入0.9~1.1、5伏
    {
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT |= BIT6;
    P8OUT &=(~BIT7);
    P9OUT |= BIT0;
    }
    其他
    {
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    }
    }
    否则{
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT4);
    P8OUT &=(~BIT6);
    P8OUT &=(~BIT7);
    P9OUT &=(~BIT0);
    }
    
    //结束 while (1)
    }//结束 main ()
    void ADC_Setup (void)
    {
    #define ADC12_SHT_16 0x0200 //采样保持的16个时钟周期
    #define ADC12_ON 0x0010 //用于在
    #define ADC12_SHT_SEL 0x0200上打开 ADC12_ON 0x0012外设
    #define ADC12_SHT_SEL 0x0200 //为 ADC12_HOLD 选择源/ define ADC1212位分辨率0x12位/define ADC12_SEL
    0x000A //将输入 P9.2用于模拟输入
    #define ADC12_P91 0x0009 //将输入 P9.1用于第二输入
    ADC12CTL0 = ADC12_SHT_16 | ADC12MSC | ADC12_ON;//打开、设置采样保持时间
    ADC12CTSRC = ADC12CONSEQ1 + ADC12SHT_ON;//指定 ADC12_SOURCE;ADC12_TH = ADC12_SHIP;//指定 ADC12_SHIP;ADC12_SHIP;ADC12_SHUT_SHUTH
    // 12位转换结果
    ADC12MCTL0 = ADC12_P92;// P9.2是模拟输入
    ADC12MCTL1 = ADC12_P91 | ADC12EOS;//P9.1 second 输入、序列结束
    
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >ADC12CTL1 = ADC12CONSEQ1 + ADC12_SHT_SRC_SEL;//指定采样保持时钟源
    这实际上设置了 CONSEQ=2 (是的、并不完全明显)。 尝试:
    >ADC12CTL1 = ADC12CONSEQ_1 + ADC12_SHT_SRC_SEL;//指定采样保持时钟源
    ----
    我看不到您将引脚分配给 ADC 的位置。 添加类似于[参考 SLAS789C 表6-37]的内容:

    P9SEL1 |=(BIT1 |BIT2);//分配 P9.1/2 (A9/A10)
    P9SEL0 |=(BIT1 |BIT2);//至 ADC
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、alikaan、

    要实现对2个通道的采样:

    1:配置 ADC 的引脚:

    P9SEL1 |= BIT1;//为 ADC
    P9SEL0配置 P9.1 |= BIT1;
    
    P9SEL1 |= BIT2;//为 ADC
    P9SEL0配置 P9.2 |= BIT2; 

    2.配置 ADC

    您的配置看起来正确。

    3.访问转换结果。

    在访问结果之前、您需要确保转换已完成。

    为此、您首先需要为序列转换的最后一个 MEM 位置启用中断、即 MEM1

    ADC12IER0 |= ADC12IE1;//在 MEM1上启用 ADC 中断 

    您可以使用 ADC_ISR 来检查标志 ADC12IFG1、也可以只是在邮件循环中轮询标志。

    下面是使用 ADC_ISR 的示例

    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)#Elif defined (__GNU__) void __attribute__((interrupt (ADC12_vector)))) ADC12_ISR #else!#error Compiler #include! #endif
    {
    switch (__even_in_range (ADC12IV、ADC12IV_ADC12RDYIFG))
    {
    case ADC12IV_ADC12IFG1:// ADC12MEM1 Interrupt
    ADC_value0 = ADC12MEM0;//保存 MEM0
    ADC12MEM1 = ADC12MEM1
    ;
    默认值
    
    :/断点:}