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 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上
感谢您对此提供的帮助。
当 CPOUT 变为1时、会触发 TB3的 DISABLE (TBOUTH)信号[参考用户指南(SLAU445I)第14.2.5节]。 尝试:
> SYSCFG2 |= TB3TRGSEL;//强制 TB3OUTH 源到外部(未分配引脚)
这会将 TB3OUTH 源从 eCOMP1 CPOUT 切换到外部引脚(很方便、不存在该引脚)。 [参考数据表(SLASEC4B)表6-20]
这解决了问题-非常感谢!