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.

[参考译文] MSP432P401R:代码运行时、PWM 不会改变输出

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/670781/msp432p401r-pwm-not-varying-output-while-code-is-running

器件型号:MSP432P401R

大家好、我在使用内置 Timer_A_generatePWM 函数时遇到了一个奇怪的问题。 我知道如何设置和正确使用它、但是在我的应用中、我希望基于连接的传感器的数据具有不同的 PWM。 我尝试自行调试它、但我发现它很奇怪、因为我的代码运行方式与我手动添加断点时的运行方式相同、然后占空比会发生变化。 如果没有断点、则占空比永远不会改变。 我创建了一个简单的程序来展示实现示例和问题:

volatile int toggle = 0;


int main (void)
{

GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、GPIO_PRIMARY_MODULE_Function);

PWMConfig PWM_Motor_1 =
{
Timer_A_CLOCKSOURCE_SMCLK、
Timer_A_CLOCKSOURCE_divider _28、
周期、
Timer_A_CAPTURECOMPARE 寄存器_1、
Timer_A_OUTPUTMODE_RESET_SET、
0
};


while (1)
{
if (toggle =0)
{
PWM_Motor_1.dutyCycle = DutyCycle _10; //<=此行会更改占空比(定义但未显示,我使用周期*0.10)
Timer_A_generatePWM (timer_A0_BASE、&PWM_Motor_1); //<=这应该会改变我的占空比、但是如果没有手动断点、就像 MSP 跳过这个函数一样
切换++; //以下所有 if 语句的问题相同
}
否则、如果(TOGGLE = 1)
{
PWM_Motor_1.dutyCycle = DutyCycle _ 20;
Timer_A_generatePWM (timer_A0_BASE、&PWM_Motor_1);
切换++;
}
否则、如果(TOGGLE == 2)
{
PWM_Motor_1.dutyCycle = DutyCycle _40;
Timer_A_generatePWM (timer_A0_BASE、&PWM_Motor_1);
切换++;
}
否则、如果(TOGGLE == 3)
{
PWM_Motor_1.dutyCycle = DutyCycle _50;
Timer_A_generatePWM (timer_A0_BASE、&PWM_Motor_1);
切换++;
}
否则、如果(TOGGLE == 4)
{
PWM_Motor_1.dutyCycle = DutyCycle _80;
Timer_A_generatePWM (timer_A0_BASE、&PWM_Motor_1);
切换++;
}
否则、如果(TOGGLE == 5)
{
PWM_Motor_1.dutyCycle = DutyCycle _100;
Timer_A_generatePWM (timer_A0_BASE、&PWM_Motor_1);
切换++;
}

if (切换> 5)
{
切换= 0;
}
}

有什么想法吗? 我是缺少什么东西、还是 MSP432在如此快速地更改占空比时遇到问题?

编辑:

当我在每个 Generate 函数之后添加类似这样的延迟时、令人惊讶的是、它会起作用。 有什么想法吗?  

PWM_Motor_1.dutyCycle = DutyCycle _10;
Timer_A_generatePWM (timer_A0_BASE、&PWM_Motor_1);
uint32_t I = 0;
for (I = 0;I < 70000;i++);
toggle++; 

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

    乍一看,你似乎是如此迅速地改变职责,以至于它永远没有机会生效。 您需要至少运行 PWM 一个周期、使其完全为 PWM。 (这是一个逻辑问题、而不是特定于 MSP432的问题。)

    必然结果是、在您的应用中、您希望以不超过 PWM 周期的速度对传感器进行采样。 您甚至可以使用计时器周期来对采样进行定速。

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

    很棒,感谢你们的洞察力!!