Arduino PORTENTA Pro C33 的高级 PWM 功能

Arduino PORTENTA Pro C33 的默认 PWM 频率是多少?

Arduino 长期以来一直保持其产品之间的向后兼容性。新的 Arduino PORTENTA Pro C33 也不例外。与 Arduino Uno 一样,C33 的默认脉宽调制 (PWM) 频率约为 490 Hz,分辨率为 8 位。请注意,默认的 PWM 是通过 analogWrite() 函数访问的。

这对于许多项目来说是一个很好的起点,但对于高级项目,尤其是涉及电机控制的项目来说,这是不可取的。低频是可听见的,PWM 的 8 位分辨率还有改进的空间。当我们考虑到 C33 的 Renesas Arm Cortex 处理器的能力时,这一点尤其明显。该设备能够超越默认设置和熟悉的 analogWrite() 函数的限制,提供更强大的性能。

本工程简报介绍了一种解锁 C33 PWM 的方法。它提供了将 PWM 频率设置为任意值的能力,并能够使用浮点类型的占空比值。最棒的是,代码已经作为 Arduino IDE 的一部分安装好了。图 1 显示了设置中使用的硬件。

本页的概念在一篇新文章中得到了扩展,该文章探讨了安装在 Arduino UNO R4 Minima 和 WiFi 上的密切相关的 Renesas R7FA4M1AB3CFM#AA0。参考资料:适用于 Arduino UNO R4 Minima 和 UNO R4 WiFi 板的快速 PWM

1 :Arduino PORTENTA Pro C33 的 PWM 可以设置为任意频率,占空比设置为浮点百分比。

PORTENTA Pro C33 PWM 代码位于哪里?

要找到 PWM 代码,我们需要探索 Arduino IDE 的内部工作原理。作为起点,我们都知道在编译(验证)程序之前,必须识别特定的 Arduino 微控制器。这很重要,因为它指示 IDE 为选定的微控制器编译程序。经典的 blinky 程序是一个完美的例子。所有 Arduino 系列成员的高级 Arduino 代码都是相同的,而编译后的机器代码却非常不同,例如 Microchip ATmega(前身为 Atmel)和 Renesas Arm。

当您选择所需的 Arduino 板时,IDE 会被指示使用相关的硬件特定文件集。在 Windows 机器上,C33 的 PWM 文件名为 pwm.h 和 pwm.cpp。它们位于:

C:\Users\your_name\AppData\Local\Arduino15\packages\arduino\hardware\renesas_portenta\1.1.0

此 IDE 过程还涉及其他级别的复杂性。然而,这个过于简化的介绍对我们的讨论来说已经足够了。

如何更改 PORTENTA Pro C33 PWM 频率和位宽?

这个过程相对简单;我们只需要利用pwm.cpp和pwm.h文件中包含的预构建的PwmOut类。如下面的代码清单所示,我们首先包含pwm.h文件。下一步是实例化一个PwmOut的实例。在这个代码清单中,我们将实例命名为myPWM。请注意,我们通过将myPWM与特定的I/O引脚(在本例中为D6)关联来实例化它。最后一步是使用myPWM.begin();激活PWM实例。在没有其他操作的情况下,PWM将以默认的490 Hz频率和50%的占空比运行。

当你探索pwm.h和pwm.cpp文件时,你会发现其中包含了多种配置和调整PWM的方法。在本例中,我们使用语句myPWM.period_us(40);将PWM设置为以25 kHz运行。最后,我们使用语句myPWM.pulse_perc(D_perc);调整占空比。请注意,占空比百分比(D_perc)是一个浮点类型,允许对PWM占空比进行精细控制。在这个演示中,PWM从0%到100%的占空比缓慢过渡,然后再次缓慢返回,如视频1所示。

#include "pwm.h"
#define PWM_PIN D6

PwmOut myPWM(PWM_PIN);  // constructor associating the PWM with a particular pin

void setup() {
  pinMode(PWM_PIN, OUTPUT);
  Serial.begin(9600);
  myPWM.begin();
  myPWM.period_us(40);
}

void loop() {
  static float D_perc = 0;
  static bool state = 1;
  if (state) {
    D_perc += 0.25;
    if (D_perc > 100){
      state = 0;
      D_perc = 100;
    }
  } else {
    D_perc -= 0.25;
    if (D_perc < 0){
      state = 1;
      D_perc = 0;
    }
  }

  myPWM.pulse_perc(D_perc);
  Serial.println(D_perc);
  delay(100);
}

使用演示代码的结果

演示程序的结果包含在视频1中。这里我们看到Digilent Analog Discover的屏幕截图以及Arduino IDE的串行监视器数据。25 kHz信号(40 us)看起来非常稳定。可以看到占空比以每步0.25%的变化平稳过渡。

视频 1 :可以看到Arduino PORTENTA Pro C33产生了一个25 kHz的PWM,并且PWM以0.25%的增量平滑变化。

最后的思考

这肯定不是一个优化的解决方案。然而,实现相对容易,并且预计在未来的伺服电机控制文章中会有出色的表现。此外,占空比控制以浮点百分比表示,从教育的角度来看将有所帮助。