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/MSP430FR2111:将 ADC 功能从 MSP430G2131移植到 MSP430FR2111的代码

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/695551/ccs-msp430fr2111-code-porting-adc-functionality-from-msp430g2131-to-msp430fr2111

器件型号:MSP430FR2111
主题中讨论的其他器件:DRV8837EVM

工具/软件:Code Composer Studio

您好!

我正在使用电机驱动器评估模块(DRV8837EVM)、在该模块中、我将使用 FR2111替换现有的 MCU (G2131)。

其理念是使所有功能与 G2131和 FR2111的运行方式相同。   

我已经在硬件上设置了所有内容。 我已将 FR2111上的 ADC 通道识别为 P1.1。 但是、在移植代码时、我需要帮助、以便使 FR2111中的 ADC 能够读取 DRV8837EVM 中包含的电位器。

EVM G2131上 ADC 的当前代码为:

我当前为 FR2111准备的代码如下所示:

如何初始化 ADC 以便将电位器与 FR2111配合使用?

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

    您好、Blake、

    查看 DRV8837EVM 的原理图、可以看到电位计在一侧连接到 MSP430 VREF+基准电压输出、而在另一侧接地、并且抽头连接到 ADC 输入。  这是一个很好的设置、因为如果 ADC 也以 VREF 为基准、电位计应在整个范围内改变 ADC 输入。  在 MSP430FR2111上、内部 ADC VREF 为1.5V、外部 VREF 为1.2V、因此您不会获得完全范围。  

    您是否在新硬件中使用了类似的拓扑?  您可以使用 MSP430FR2111以类似的方式输出基准、但需要一些 PMM 配置。  新 MCU 上的 VREF+输出位于 P1.7上。  要输出 VREF+、您需要多路复用 P1.7以实现 ADC 功能、并在 PMM 控制寄存器中启用基准输出。

    设置 ADCMCTL0时、还需要设置 ADC 的基准。  如果要使用内部基准、您将具有如下所示的内容:

    ADCMCTL0 |= ADCINCH_1 | ADCSREF_1; 

    对于 PMM 基准生成、您的设置如下所示:

    //配置引用
    PMMCTL0_H = PMMPW_H;
    PMMCTL2 |= INTREFEN | EXTREFEN;
    _DELAY_CYCLES (400); //基准趋稳延迟 

    我还假设您希望运行计时器触发的周期性 ADC 转换。  以下是一个良好的代码示例:

    /*-版权所有-、BSD_EX
    *版权所有(c) 2014、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430FR211x 演示- ADC、采样 A1、内部1.5V 基准、TB1.1 Trig、如果 A1>0.5V 则设置 P1.0
    //
    //说明:此示例在单通道重复模式下工作。
    // A1以1.5V 为基准每秒采样16次(ACLK/1024)。
    // Timer_B 以向上计数模式运行、TB1.1B 用于自动触发
    // ADC 转换。 内部振荡器乘以采样(16x)和转换(13x)。
    //在 ADC_ISR 内部、如果 A1 > 0.5V、P1.0被置位、否则复位。 正常模式为 LPM3。
    // ACLK = XT1 = 32768Hz、MCLK = SMCLK =默认 DCODIV ~1MHz。
    ////////* ACLK 需要一个 XOUT 上的外部手表晶振*//
    
    //// MSP430FR2111
    // --------
    // /|\| |
    // || |
    // -|RST |
    // | |
    // --|P1.1/A1 P1.0|->LED
    ////
    
    // Xiaodong Li
    // Texas Instruments Inc.
    // 2015年12月
    //使用 IAR 嵌入式工作平台 v6.40和 Code Composer Studio v6.1构建
    //*********
    
    #include 
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    
    //配置 GPIO
    P1DIR |= BIT0; //将 P1.0设置为输出方向
    P1OUT &=~BIT0; //清除 P1.0
    
    //配置 ADC A1引脚
    P1SEL0 |= BIT1;
    P1SEL1 |= BIT1;
    
    //配置 XT1振荡器
    P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    CSCTL4 = SELA_XT1CLK; //设置 ACLK = XT1;MCLK = SMCLK = DCO
    操作
    {
    CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    
    //配置 ADC
    ADCCTL0 |= ADCON | ADCMSC; // ADCON
    ADCCTL1 |= ADCSHS_2 | ADCCONSEQ_2; //重复单通道;TB1.1 TRIG 采样开始
    ADCCTL2 |= ADCRES; // 10位转换结果
    ADCMCTL0 |= ADCINCH_1 | ADCSREF_1; // A1 ADC 输入选择;Vref=1.5V
    ADCIE |= ADCIE0; //启用 ADC 转换完成中断
    
    //配置引用
    PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
    PMMCTL2 |= INTREFEN; //启用内部基准
    _DELAY_CYCLES (400); //基准趋稳延迟
    
    ADCCTL0 |= ADCENC; // ADC 使能
    
    
    // ADC 转换触发信号- TimerB0.1 (32ms 导通周期)
    TB0CCR0 = 1024-1; // PWM 周期
    TB0CCR1 = 512-1; // TB1.1 ADC 触发
    TB0CCTL1 = OUTMOD_4; // TB1CCR0切换
    TB0CTL = TBSSEL_ACLK | MC_1 | TBCLR; // ACLK、向上计数模式
    
    _bis_SR_register (LPM0_bits | GIE); //输入带中断的 LPM3
    }
    
    // ADC 中断服务例程
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=ADC_vector
    __interrupt void ADC_ISR (void)
    #Elif defined (__GCOMPILE__)
    void __attribute__(((nC_vector)#interrupt
    
    !void (nc)#inc Compiler (void)错误!
    #endif
    {
    switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))
    {
    案例 ADCIV_NONE:
    中断;
    ADCIV_ADCOVIFG 案例:
    中断;
    案例 ADCIV_ADCTOVIFG:
    中断;
    ADCIV_ADCHIIFG 案例:
    中断;
    ADCIV_ADCLOIFG 案例:
    中断;
    ADCIV_ADCINIFG 案例:
    中断;
    ADCIV_ADCIFG 案例:
    如果(ADCMEM0 < 0x155) // ADCMEM = A0 < 0.5V?
    P1OUT &=~BIT0; //清除 P1.0 LED 关闭
    其他
    P1OUT |= BIT0; //将 P1.0 LED 设置为打开
    ADCIFG = 0;
    中断; //将 CPUOFF 位从0 (SR)清零
    默认值:
    中断;
    }
    }
    

    请告诉我如何继续提供帮助。

    此致、
    Walter

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