c++ - 根据条件更新时 STM32F769 PWM 输出出现问题
问题描述
我正在使用带有 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);
}
}
输出应该在当前周期完成后更新,而不是立即更新。
解决方案
设置新周期时,底层 HAL 代码可能会重置计时器的当前计数值。您必须读取当前计时器的 cnt 值并等待它达到0
. 当计时器 cnt 值达到 时,您可以设置一个新的周期0
。
推荐阅读
- python - 使用 statsmodel 中的 get_forecast 时出现 TypeError
- python - Python 3.6 正则表达式产生意外结果(尽管使用字符串文字)
- angular - 无法在 Ionic 的真实 android 设备中获取 REST API 响应
- javascript - 如何正确使用.then
- fftw - FFT 输入数组编号?
- javascript - VS Code 调试 PHP 和 Javascript
- firebase - 无法部署云功能
- javascript - 如何在没有硬编码的情况下传递数组的索引来更新“react-addons-update”的方法?
- sql - SQL Cast 怪癖
- regex - 301用正则表达式重定向404页面