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:将电机驱动器功能从 MSP430G2131移植到 MSP430FR2111的代码

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

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

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

工具/软件:Code Composer Studio

大家好!

您好!

我正在使用电机驱动器评估模块(DRV8837EVM)、在该模块中、我已将现有 MCU (G2131)替换为 FR2111。  其理念是使所有功能与 G2131和 FR2111的运行方式相同。   

硬件已设置、我已确定 PWM 的来源、并相应地调整了占空比、直流电机按预期运行。 其理念是使该器件能够将电机的方向从顺时针切换到逆时针、反之亦然。 目前、我可以通过将 PWM 信号连接到测试点 IN1来实现这一点、使其逆时针旋转、并将其连接到 IN2来顺时针旋转。

目标是将其连接到 GPIO、以便我能够切换此操作。 我的代码在实现这一点方面是否最佳?   我当前改变电机方向的方法能否得到改进?

以下是 MSP430G2131上当前与此操作相关的代码:

 

 

下面您将看到 MSP430FR2111上当前的代码:

我们非常感谢您的任何帮助。 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Blake
    1.您能否在 CCS 中顺利通过编译操作?您能否在图片模式下上传代码?将代码复制到 CCS 中并找出问题对我来说并不方便。
    2.我想您错过了 GPIO 中断配置。
    3.在 fr2111中没有 PxSEL 寄存器,它有 PxSEL0和 PxSEL1,您只需将 P1SEL 更改为 P1SLE0即可
    4.您无需更改 DIR 寄存器

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


    嗨、Gary、

    构建而不会出现任何错误。 在下面、您可以找到这两种代码:

    MSP430G2131代码:

    #include "msp430g2131.h"
    
    #define LEDBIT1// P1.1
    #define IN_1_PWMBIT2// P1.2
    #define IN_2_PWMBIT6// P2.6
    #define ADC_VREFBIT4// P1.4
    
    #define PWM_SEL_INBIT3// P1.3
    
    初始化
    无符号 WDTCLDLED= 0 +无符号 WDINT 计时计数
    
    
    
    器//停止看门狗计时器
    
    
    //配置端口方向和外设
    P1DIR |= IN_1_PWM | LED;//将端口1 GPIO 设置为在 P1.1上输出,将 P1.2
    P2DIR = IN_2_PWM;//将端口2 GPIO 设置为仅在 P2.6上输出
    
    P1OUT = LED;//将 P1OUT 设置为已知状态
    P2OUT &= 0x00;//将 P2OUT 设置为已知状态
    
    P1SEL = IN_1_PWM;//在 P1.2上选择辅助功能,将其绑定到 TA1
    P2SEL &=~IN_2_PWM;//确保 P2.6外设功能被禁用
    
    BCSCTL3 = LFXT1S_3;//必须设置的寄存器值以允许在 XIN 引脚上使用 TAI 功能
    
    //配置定时器 A 捕捉/比较寄存器以生成10kHz PWM、占空比可调
    CCR0 = 100-1;//将 PWM 频率设置为~10kHz
    CCTL1 = OUTMOD_7;// CCR1处于设置/复位模式
    CCR1 = 50;//将占空比设置为50%
    TACTL = tassel_2 + MC_1;// SCLK 源、向上计数模式
    
    
    //配置端口1按钮中断
    
    P1REN = PWM_SEL_IN;//在 P1.3
    P1OUT 上启用上拉/下拉电阻器&=~PWM_SEL_IN;//在 P1.3上设置下拉电阻器、
    P1IFG = 0x00;//清除端口1上的所有中断标志
    P1IE = PWM_SEL_IN;//在端口1按钮引脚
    P1IES &=~BIT3上启用中断;//将中断设置为在端口1.3上的低电平到高电平转换时触发
    
    
    //将 ADC10配置为提供基准电压并读取 P1.0
    ADC10CTL0上的分压器值|= REFON + REF2_5V + REFOUT;//将 ADC 基准电压设置为2.5V、并在具有 Vref+功能的引脚上输出
    
    ADC10CTL0 |= SREF_1 + ADC10SHT_2 + ADC10ON + ADC10IE;// VR+= VREF+、VR-=AVSS、16倍采样和转换、启用 ADC 和 ADC 中断
    ADC10AE0 |= INCH_0;//在 A0上启用 ADC 输入
    
    
    //代码的主体
    _BIS_SR (GIE);//针对
    
    (;)启用全局中断
    {
    ADC10CTL0 |= ENC + ADC10SC;//采样和转换开始
    占空比=((ADC10MEM*20)/0x3FF)*5;
    CCR1 =占空比;
    }
    }
    
    //Pushbutton 中断服务例程
    #pragma vector=Port1_vector
    __interrupt void PWM_OUT_SEL (void)
    {
    P1IFG ^= PWM_SEL_IN;//清除中断标志位
    P1IE ^= PWM_SEL_IN;//禁用中断以防止双跳转
    P1SEL ^
    ^= IN_1_PWM;//将 GPIO_IN 状态切换为 P2PWM_1;// PPM_IN 引脚1//切换 IN_2_PWM 引脚
    
    的 GPIO 状态 unsigned long x = 0;//空 while 循环等待开关反弹消散
    而(x<30000)//文明时代的不优雅武器
    {
    x++;
    }
    
    P1IE ^= PWM_SEL_IN;//重新启用按钮中断
    }
    
    // ADC10中断服务例程
    #pragma vector=ADC10_vector
    __interrupt void ADC10_ISR (void)
    {
    LEDcounter ++;
    if (LEDcounter>(3000-(26*DutyCycle)))
    ){
    P1OUT ^= LED;//切换 P1.0
    LEDcounter=0;//重置 LED 计数
    器}
    
    

     

    MSP430FR2111代码:

     

    #include 
    
    #define IN_1_PWM 位2 // P1.2
    #define IN_2_PWM BIT6 // P2.6
    #define PWM_SEL_IN BIT3 // P1.3
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    
    P1DIR |= BIT6 | BIT7; // P1.6和 P1.7输出
    P1SEL1 |= BIT6 | BIT7; // P1.6和 P1.7选项选择
    
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    TB0CCR0 = 100-1; // PWM 周期比较并匹配10kHz
    TB0CCTL1 = OUTMOD_7; // CCR1复位/置位
    TB0CCR1 = 50; // CCR1 PWM 占空比设置为50%
    TB0CCTL2 = OUTMOD_7; // CCR2复位/置位
    TB0CCR2 = 25; // CCR2 PWM 占空比设置为25%
    TB0CTL = TBSSEL_SMCLK | MC__UP | TBCLR;// SMCLK、向上计数模式、清除 TBR
    
    _bis_SR_register (LPM0_bits); //输入 LPM0
    __no_operation(); //对于调试
    器}
    
    //按钮中断服务例程
    #pragma vector=Port1_vector
    __interrupt void PWM_OUT_SEL (void)
    {
    P1IFG ^= PWM_SEL_IN; //清除中断标志位
    P1IE ^= PWM_SEL_IN; //禁用中断以防止双弹
    P1DIR ^= IN_1_PWM; //切换 IN_1_PWM 引脚
    的 GPIO 状态 P1SEL1 ^= IN_2_PWM; //切换 IN_2_PWM 引脚
    的 GPIO 状态 P1IE ^= PWM_SEL_IN; //重新启用按钮中断
    }
    

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Blake
    您之前是否根据我的建议更改代码?
    此致
    Gary