首页 > 解决方案 > 根据条件更新时 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);
  }
}

输出应该在当前周期完成后更新,而不是立即更新。

我得到的错误

标签: c++stm32mbedpwm

解决方案


设置新周期时,底层 HAL 代码可能会重置计时器的当前计数值。您必须读取当前计时器的 cnt 值并等待它达到0. 当计时器 cnt 值达到 时,您可以设置一个新的周期0


推荐阅读