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.

[参考译文] MSP430FR6043:PWM 生成

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1250059/msp430fr6043-pwm-generation

器件型号:MSP430FR6043
主题中讨论的其他器件:EVM430-FR6043

社区您好。

我使用 EVM430-FR6043板通过 Timer_A1模块创建 PWM。

Timer_A1模块具有 TA1.0、TA1.1和 TA1.2引脚。
用于 TA1.0的 P1.2、用于 TA1.1的 P1.3以及用于 TA1.2的 P7.0

我读取示例代码以使用 Timer_A1生成两个 PWM、但无法生成正确的 PWM。

仅在 TA1.1 (P1.3)中发生 PWM 生成、占空比不正确。 我将提供占空比值、但创建的占空比值不同。

我附上了我的代码供您参考。 请帮助我解决此问题。

#include <msp430.h> 
#include "timer_a.h"

#define TIMER_PERIOD 49
#define DUTY_CYCLE1  5
#define DUTY_CYCLE2  5

Timer_A_initCompareModeParam pwm_gen_0;
Timer_A_initCompareModeParam pwm_gen_1;

Timer_A_initUpModeParam pwm_up;
/**
 * main.c
 */
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;               // Stop WDT

    // Configure GPIO
    P1DIR |= BIT2;                          // P1.2 as output
    P1DIR |= BIT3;                          // P1.3 as output
    P7DIR |= BIT0;                          // P7.0 as output


    P1SEL1 |= BIT2;                         // P1.2,P1.3 and P7.0 options select
    P1SEL1 |= BIT3;
    P7SEL1 |= BIT0;

       // Disable the GPIO power-on default high-impedance mode to activate
       // previously configured port settings
       PM5CTL0 &= ~LOCKLPM5;

       CSCTL0_H = CSKEY_H;                     // Unlock CS registers
       CSCTL1 = DCOFSEL_6;                     // Set DCO = 8MHz
       CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;// Set ACLK=VLO SMCLK=DCO
       CSCTL3 = DIVA__8 | DIVS__8 | DIVM__8;   // Set all dividers
       CSCTL0_H = 0;

       /*------- Timer A1------------*/

       pwm_up.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;
       pwm_up.clockSourceDivider=TIMER_A_CLOCKSOURCE_DIVIDER_1;
       pwm_up.timerPeriod=TIMER_PERIOD;
       pwm_up.timerInterruptEnable_TAIE=TIMER_A_TAIE_INTERRUPT_DISABLE;
       pwm_up.captureCompareInterruptEnable_CCR0_CCIE=TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE;
       pwm_up.timerClear=TIMER_A_DO_CLEAR;
       pwm_up.startTimer=false;



       pwm_gen_0.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_1;
       pwm_gen_0.compareInterruptEnable=TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
       pwm_gen_0.compareOutputMode=TIMER_A_OUTPUTMODE_RESET_SET;
       pwm_gen_0.compareValue=DUTY_CYCLE1;



       pwm_gen_1.compareRegister=TIMER_A_CAPTURECOMPARE_REGISTER_2;
       pwm_gen_1.compareInterruptEnable=TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
       pwm_gen_1.compareOutputMode=TIMER_A_OUTPUTMODE_RESET_SET;
       pwm_gen_1.compareValue=DUTY_CYCLE2;


       Timer_A_initUpMode(TA1_BASE,&pwm_up);

       Timer_A_initCompareMode(TA1_BASE,&pwm_gen_0);

       Timer_A_initCompareMode(TA1_BASE,&pwm_gen_1);

       Timer_A_startCounter(TA1_BASE,TIMER_A_UP_MODE);
       return 0;
}

提前感谢、

萨尔沃特

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

    我是否正在使用正确的计时器引脚??

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

    您可以直接看到计时器的寄存器值吗?

    我认为您使用的是正确的引脚。

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

    是的、我能够查看时间周期值、CCR1值和 CCR2值。 我的计时器也在运行、

    那么...是否有任何与代码相关的问题?

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

    我在 P1.3 (蓝色)中得到 PWM 信号、但占空比不正确。  

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

    是否已从 J3 [TXD/RXD]引脚上移除跳线? 尤其是 RXD 可能会与 P1.3发生总线冲突。

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

    我没有移除跳线。 但我在 P1.3中得到了一些信息。  

    在 P1.2/P7.0中、我没有得到任何 PWM 生成、但 CCR2正按照我的值进行更新。 请查看上面上传的屏幕截图和我的代码。

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

    我建议您移除 J3 TXD/RXD 跳线。

    看起来 TA1CCR2为=0、而不是=5。 这将同时设置和重置信号、并提供一个恒定(低电平、我认为)值。 我不知道为什么没有将其设置为5。 最快的方法可能是单步执行(第2次) initCompareMode 调用(非常短)以查看 其出现问题的位置。

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

    很抱歉、我上传的屏幕截图不正确。 TA1CCR2仅为5。 我尝试了每种权变措施来生成适当的 PWM、但结果失败了。

    我的代码有什么问题吗? 你已经验证过了吗?

    我选择的引脚正确、所有注册更新都按计划进行。 但是、PWM 生成存在问题。  

    如果你看看上面的输出屏幕截图、你会注意到 TA1CCR1被设置为5。 但是、我为什么会 获得50%的占空比作为输出呢?

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

    您的示波器跟踪显示了总线冲突的指示(范围1.2-2.0V)。 希望您拆下 J3 RXD/TXD 跳线。

    我不会看到您的代码有任何明显错误的地方。 我没有您的设备、因此无法验证。  

    P7.0连接到 J10 (XPB0)。 该引脚是否有任何连接?

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

    在我移除跳线 J3后、结果为负。

    请看一下运行期间更新的寄存器值。

    P7.0仅连接到 J10。

    不过、我的问题仍然没有解决、我受到 EVM430-FR6043引脚排列的限制。 因此、我无法使用任何额外的计时器或引脚。

    如果我的引脚选择正确且代码正确、那么谁在 PWM 生成期间产生问题?  

    请帮我解决这个问题。

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

    "结果是否定的"究竟意味着什么? 您的示波器迹线是否仍然显示低振幅(摆幅0.75V) 20kHz 信号?

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

    我可以在我的水箱中找到的最接近(我想) FR6043的表弟是 FR5994。 我在代码中调整了引脚分配、并且在 TA1.1和 TA1.2上都获得了适当的 PWM (P1.2/.3)。

    我的 Launchpad 比您的 EVM 简单得多;只需查看原理图、很可能我漏掉了您的连接中的一些冲突。

    P1.2/.3中的示波器跟踪:

    代码更改:

    #if BMC
        P1DIR |= (BIT2 | BIT3 | BIT7);
        P1SEL0 |= BIT2;     // P1.2 as TA1.1 per Table 9-20
        P1SEL0 |= BIT3;     // P1.3 as TA1.2 per Table 9-21
        P1SEL0 |= BIT7;     // P1.7 as TA1.0 per
        P1SEL1 |= BIT7;     //                   Table 9-22
    #else
        P1DIR |= BIT2;                          // P1.2 as output
        P1DIR |= BIT3;                          // P1.3 as output
        P7DIR |= BIT0;                          // P7.0 as output
    
        P1SEL1 |= BIT2;                         // P1.2,P1.3 and P7.0 options select
        P1SEL1 |= BIT3;
        P7SEL1 |= BIT0;
    #endif
    

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

    很抱歉响应出现延迟。

    我使用的引脚实际上连接到另一个模块。 所以、不会产生 PWM。

    我选择了 Timer_A、而不是 Timer_B、并且选择了未连接到任何其他端口或模块的 Timer_b 引脚。

    我最终能够在两个引脚上创建 PWM。

    TB0.1 (上面的屏幕截图)

    TB0.4 (上面的屏幕截图)

     

    设置占空比就是我现在关心的问题。 现在我正在设置 TB0CCR1至5 TB0CCR4至5

    TB0.1和 TB0.4屏幕截图中产生的占空比为 10 。 为什么会翻一番?

    I 设置 TB0CCR1至40 TB0CCR4至40 并获得了 80%占空比

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

    您的 CCR0值为50 (-1)。 5个节拍/50个节拍=10% 40ticks/50ticks=80%。  

    您的目标是一个特定的(a)高持续时间还是(b)占空比?

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

    我的目标是控制 PWM 占空比(电机控制)。

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

    我不是一个电机控制向导,但我想(?) 20kHz 频率已预先指定、因此您无法更改。

    如果 PWM 周期为50个周期、您只能从50个不同的占空比中进行选择。 具体而言,您无法获得(恰好) 5%,因为这需要设置 CCRx=(0.05*50)=2.5周期。

    如果您需要更高的分辨率、一个选择是加快 SMCLK。 复位时、DCO 已经在8MHz 下运行、因此如果您设置 DIVS__1和 DIVM_1、然后设置 CCR0=(8* 50)-1、在20kHz 频率下将有400种可能的占空比设置。 [可以比 MCLK 运行 SMCLK 更快、但我不建议这样做。]