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%的增量平滑变化。
最后的思考
这肯定不是一个优化的解决方案。然而,实现相对容易,并且预计在未来的伺服电机控制文章中会有出色的表现。此外,占空比控制以浮点百分比表示,从教育的角度来看将有所帮助。