根据条件更新时STM32F769 PWM输出的问题

时间:2019-05-29 05:10:39

标签: c++ stm32 mbed 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);
  }
}

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

我得到的错误

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您需要在更新中断中更新值或使用计时器DMA突发模式