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.
工具与软件:
您好!
我想使用计时器 A3.0作为 PWM 输出。 为此、我定义了以下内容:
void pwmTempLuefter(real outpwm) { real vCCR0; P4DIR |= BIT1; P4SEL0 |= BIT1; PM5CTL0 |=LOCKLPM5; vCCR0 = 65500; TA3CCR0 = (uint16)vCCR0; TA3CCTL1 = OUTMOD_6; // CCR1 reset/set TA3CCR1 = (uint16)(vCCR0*outpwm); // CCR1 PWM duty cycle TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR;// |TAIE; }
例如、TIMERB0上的 PWM 正常工作。 计时器 A3.0有何不同?
有人能在这里帮助我吗?
"输出模式2、3、6和7对输出单元0来说是无用的、因为 EQUn = EQU0。"
但是、虽然您配置的引脚用于 A3.0、但您配置的输出单元用于 A3.1。
尊敬的 David:
首先,非常感谢你的答复。
您说我为3.1定义了 PWM。 不知怎么地、我无法在我的思维中看到错误。 它应该如何正确? 提前感谢。
此致
> TA3CCTL1 = OUTMOD_6;// CCR1复位/设置
OUTMOD 是生成输出信号的源、按照编码、它在 TA3.1 (CCR1/CCTL1)(在 P4.0而非 P4.1上)上实现该功能。
最简单的补救方法是切换到使用 P4.0 (P4DIR/P4SEL/接线)。
您好!
这是否意味着、如果我写入 TA3CCTL0 = OUTMOD_6、则该值会在 TA3.0上输出?
您将获得输出、但它不会很有趣(常量)。 正如 David 在《用户指南》中引用的(上述)所指出的那样、tax.0对于(可变) PWM 没有用处。 它可以生成50%的占空比(OUTMOD=4)、仅此而已。
您好!
Danke zunächst für ñ a Die Antwort. Dann sollte ich 也是一个 TA3.2 DIE PWM ausgeben。 ICH würde è s es Dann wie foldg umsetzen:
void pwmTempLuefter(float outpwm) { float vCCR0; P3DIR |= BIT7; P3SELC |=BIT7; PMM_unlockLPM5(); vCCR0 = 65500; TA3CCR1 = (uint16_t)vCCR0; TA3CCTL2 = OUTMOD_6; // CCR1 reset/set TA3CCR2 = (uint16_t)(vCCR0*outpwm); // CCR1 PWM duty cycle TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR ; }
"怎么样?
对不起她的英语,
您好!
感谢您的回答。 然后我应将 PWM 输出到 TA3.2。 然后、我将按以下方式执行:
void pwmTempLuefter(float outpwm) { float vCCR0; P3DIR |= BIT7; P3SELC |=BIT7; PMM_unlockLPM5(); vCCR0 = 65500; TA3CCR1 = (uint16_t)vCCR0; TA3CCTL2 = OUTMOD_6; // CCR1 reset/set TA3CCR2 = (uint16_t)(vCCR0*outpwm); // CCR1 PWM duty cycle TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR ; }
我是否理解正确?
是的、这是一般想法。
OUTMOD=6实际上是切换/置位、而不是复位/置位。 这两者是相同的、从第二个周期开始。
---
未经请求:
> P3SELC |=BIT7;
我很确定这将在您希望 PSEL=01时设置 PSEL=11。 我建议您坚持:
> P3SEL0 |=BIT7;
早上好、
感谢您发送编修。
尽管进行了更改、但仍然没有获得适当的 PWM。 对于 MSP430FR2476 40引脚外壳、还有其他需要考虑的因素吗? (Re 映射或类似工具)。
我现在还有另一个‘问题'端口3.0和3.3无法切换。 是否有任何限制? 例如、我已经看到、P3.0在开发底板上完全没有引出。
您在 P3.7上看到了什么? [悬空? 卡在0? 卡在1?] 我建议您使用调试器["寄存器"视图]来查看 TA3CCR0和 TA3CCR2中实际上包含的内容。 P3.7是 TA3.2的未重新映射目标[参考数据表(SLASEO7C)表9-16]。 (我认为这就是你选择它的原因。)
您如何切换 P3.0/.3? 您在引脚上看到了什么?
未经请求:
> PMM_unlockLPM5();
我建议您将其移至 main ()。 这并不是说这不起作用、而是对错误的邀请、因为在你调用此函数之前、你真的不能信任任何 GPIO、并且系统的所有其他部分都需要知道这一点。
您好!
首先、端口3.0/3.3按如下方式初始化:
#include <msp430.h> #include "driverlib.h" #include "global.h" vInitSystem(){ WDT_A_hold(WDT_A_BASE); initClock(); initGPIO(); } void initClock(){ CS_initClockSignal( CS_FLLREF, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 ); CS_initClockSignal( CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 ); CS_initFLLParam param = {0}; CS_initFLLCalculateTrim( CS_MCLK_DESIRED_FREQ_IN_KHZ, CS_MCLK_FLLREF_RATIO, ¶m ); CS_clearAllOscFlagsWithTimeout(1000); SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT); _NOP(); } void initGPIO(){ P3DIR |= BIT3; PM5CTL0 &= ~LOCKLPM5; }
主程序如下所示:
#include <msp430.h> #include "driverlib.h" #include "global.h" void main(){ WDT_A_hold(WDT_A_BASE); initSystem(); while(1){ _NOP(); TogglePort3(); delay_ms(250); } } // ------------------------------------------------------------------------------------------ void TogglePort3(){ P3OUT ^= BIT3; } // ------------------------------------------------------------------------------------------ void delay_ms(const uint32_t delay_time_ms){ const uint32_t cycles_per_loop = 8; uint32_t delayTime = CS_getSMCLK() / (cycles_per_loop * 1000u ) ; delayTime = delayTime * delay_time_ms; do{ __delay_cycles(1); }while(--delayTime > 0); }
寄存器中也可以看到切换操作、但示波器上的线始终保持为高电平。 该引脚通过一个上拉电阻器进行连接。 它应该实际工作(就像它以前在其他项目中多次工作一样)。
我没有看到您描述的在 Launchpad 上运行此代码的行为。 我的示波器在 P3.3上看到~2Hz 方波。
我合并了两个片段,并编辑最少,以使它构建。 我在 P3.3上放置1K 到3.3V。
我不确定我们的做法有何不同。
早上好、
嗯、我想它可以是我的电路板。 我在项目中使用了许多其他功能(I2C、RS485等)。 这是一个非常复杂的项目,我可以想象有很多互动。 当然、我已经将我的示例写在一个单独的项目中、但电路保持不变。 我几乎不能想象任何其他东西。
我要非常感谢你的支持。 很高兴能够与他人交流想法。 我祝愿你和在这里作出贡献的每个人都有一个美好的星期。