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.

[参考译文] MSP430FR2355:将 Timer_B 设置为 PWM

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/828846/msp430fr2355-set-up-of-timer_b-as-a-pwm

器件型号:MSP430FR2355

大家好。

我正在使用 MSP430FR2355 LaunchPad 板、并尝试在 P6.0和 P6.1上设置 PWM 输出

我在另一个论坛帖子中找到了一些示例代码。 必须对其进行修改才能使用不同的计时器实例、因此这里可能存在错误。

下面是我使用的代码:

P6DIR = 0x03; //将 P6.0和 P6.1作为输出。 DS 表6-68中的值。
P6SEL0 = 0x03; //将 P6.0与 TB3.1连接。 将 P6.1与 TB3.2连接

//从 E2E 支持论坛进行设置
// e2e.ti.com/.../614877
TB3CCR0 = 0;
TB3CCR1 = 0;

//TB0CCTL1 = CCLD_1 | OUTMOD 6;
TB0CCTL1 = 0x02C0;

//TB0CTL = TBSSEL_SMCLK + MC_UP + ID_2 + TBCLR;
TB0CTL = 0x0254;

TB3CCR0 = 100;
TB3CCTL0 = CLLD_3;
TB3CCR1 = 50;

编译器未看到诸如 CCLD_1、OUTMOD6、...之类项目的定义 我在下面的行上对这些进行了硬编码

提前感谢您的帮助!

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

    您好、Stephen、

    所有 MSP430FR2355代码示例均可在 Resource Explorer 中找到。  您可以通过网络或在 CCS 中访问它。  它们是:http://dev.ti.com/tirex/explore/node?node=ACqyBhoKY-mma1YuW1PofA__IOGqZri__LATEST

    此示例在 P6.0-P6.3上输出 PWM、并且应非常接近您所需的值。  尝试在 Launchpad 上运行: http://dev.ti.com/tirex/explore/node?node=APK1q.nW0y7-SXlpQdIsRQ__IOGqZri__LATEST 

    谢谢、

    JD

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

    代码示例非常好、我能够看到 PWM 切换。

    唯一的问题是示例代码进入 LPM3、似乎需要 LPM3模式才能使 PWM 正常工作。

    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    
    //配置 GPIO
    P6DIR |= BIT0 | BIT1 | BIT2 | BIT3; // P6.0 P6.1 P6.2 P6.3输出
    P6SEL0 |= BIT0 | BIT1 | BIT2 | BIT3; // P6.0 P6.1 P6.2 P6.3选项选择
    P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚
    操作
    {
    CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    //设置 Timer3_B
    TB3CCR0 = 100-1; // PWM 周期
    TB3CCTL1 = OUTMOD_7; // CCR1复位/置位
    TB3CCR1 = 80; // CCR1 PWM 占空比
    TB3CCTL2 = OUTMOD_7; // CCR2复位/置位
    TB3CCR2 = 50; // CCR2 PWM 占空比
    TB3CCTL3 = OUTMOD_7; // CCR3复位/置位
    TB3CCR3 = 30; // CCR3 PWM 占空比
    TB3CCTL4 = OUTMOD_7; // CCR4复位/置位
    TB3CCR4 = 20; // CCR4 PWM 占空比
    TB3CTL = TBSSEL_1 | MC_1 | TBCLR; // ACLK、向上计数模式、清除 TBR
    
    _bis_SR_register (LPM3_bits); //进入 LPM3
    __no_operation(); //进行调试 

    我不想进入 LPM3模式、那么 PWM 如何在器件以正常模式运行的情况下工作?

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

    PWM 不需要 LPM3即可运行。 LPM3线路所做的是阻止您的程序退出。 将其替换为类似的东西

    >   while (1)/*empty*/; //永远旋转

    您可以获得相同的效果(仅忙)。

    也就是说,我看不到你的症状。 无论我使用 LPM3、while (1)还是无任何内容、PWM (P6.3上的 LED)都会继续。 在后一种情况下、它会关闭 ABORT()并旋转、但 PWM 不会停止。

    如果您在调试器中暂停、您的程序在哪里执行?

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

    更接近弄清这个问题。 当我设置比较器时、PWM 停止工作。 我不明白为什么会发生这种情况、但我可以用示例代码复制它。

    请尝试运行以下代码:

    #include 
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    
    //配置 GPIO
    P6DIR |= BIT0 | BIT1 | BIT2 | BIT3; // P6.0 P6.1 P6.2 P6.3输出
    P6SEL0 |= BIT0 | BIT1 | BIT2 | BIT3; // P6.0 P6.1 P6.2 P6.3选项选择
    P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚
    操作
    {
    CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    //设置 Timer3_B
    TB3CCR0 = 100-1; // PWM 周期
    TB3CCTL1 = OUTMOD_7; // CCR1复位/置位
    TB3CCR1 = 80; // CCR1 PWM 占空比
    TB3CCTL2 = OUTMOD_7; // CCR2复位/置位
    TB3CCR2 = 50; // CCR2 PWM 占空比
    TB3CCTL3 = OUTMOD_7; // CCR3复位/置位
    TB3CCR3 = 30; // CCR3 PWM 占空比
    TB3CCTL4 = OUTMOD_7; // CCR4复位/置位
    TB3CCR4 = 20; // CCR4 PWM 占空比
    TB3CTL = TBSSEL_1 | MC_1 | TBCLR; // ACLK、向上计数模式、清除 TBR
    
    //导致 PWM 停止工作的代码。
    CP1INT = 0; //清除中断标志。
    CP1CTL0 = 0x1016; //设置比较器输入。
    CP1CTL1 = BIT9; //启用比较器。
    CP1DACCTL = 0x0080; //打开 DAC。
    CP1DACDATA = 0x2020;// DAC 输出的中点。 这涵盖了两个 DACBUF。 0x2020为1.65V
    
    while (1);
    } 

    在 CP1设置期间、PWM 开始出现错误行为并输出不良信号。 设置 CP1后、PWM 不再出现在 P6.0上

    感谢您对此提供的帮助。

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

    设置 CP1后、PWM 要么不会出现、要么已损坏。 该信号应占空比为80%:

    如果我不初始化 CP1、它始终正常工作。

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

    当 CPOUT 变为1时、会触发 TB3的 DISABLE (TBOUTH)信号[参考用户指南(SLAU445I)第14.2.5节]。 尝试:

    > SYSCFG2 |= TB3TRGSEL;//强制 TB3OUTH 源到外部(未分配引脚)

    这会将 TB3OUTH 源从 eCOMP1 CPOUT 切换到外部引脚(很方便、不存在该引脚)。 [参考数据表(SLASEC4B)表6-20]

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

    这解决了问题-非常感谢!