我正在使用带有Mbed在线编译器的STM32F769光盘板。我的任务是根据输入更改PWM频率和占空比。
我根据需要创建了一个简单的算法,程序运行良好,但是每当控制器更新PWM频率时,就会出现奇怪的行为(可能重叠,可能很难为我口头解释),频率立即更改,并且输出当时不正确。对于其他控制器(如arduino),这种情况永远不会发生,在PWM时间段结束后,控制器会更新值。但在这种情况下不是。 有什么问题吗?
我认为在更新值之前会添加一个小的延迟,但这将不起作用,因为每次都需要不同的延迟。我已经附上了代码和屏幕截图。
#include "mbed.h"
AnalogIn analog_value(A0);
PwmOut pulse(D11);
int main() {
double meas_v = 0;
double out_freq, out_duty, s_time;
while (1) {
meas_v = analog_value.read() * 3300;
if (meas_v < 1) {
out_freq = 50000;
out_duty = 40;
} else if (meas_v >= 1000) {
out_freq = 100000;
out_duty = 80;
} else {
out_freq = 50000 + (meas_v * 50);
out_duty = 40 + (meas_v * 0.04);
}
pulse.period(1.0 / out_freq);
pulse = out_duty / 100;
s_time = 0.0001;
wait(s_time);
}
}
输出应在当前周期完成后更新,而不是立即更新。
答案 0 :(得分:0)
设置新的周期时,底层的HAL代码可能会重置计时器的当前计数值。您必须读取当前计时器的cnt值,并等待其达到0
。您可以在计时器cnt值达到0
时设置新的时间段。
答案 1 :(得分:0)
您需要在更新中断中更新值或使用计时器DMA突发模式