什么是快速 PWM ?
快速PWM是一个俗称,指的是基于Arduino的技术,用于提高脉宽调制器(PWM)的频率。该PWM频率从默认的约490 Hz更改为任意频率,通常是更高的频率。
本工程简报演示了如何将快速PWM技术应用于新的Arduino UNO R4 Minima和UNO R4 WiFi。示例代码解锁了适用于多种应用的硬件外设,包括50 Hz的RC伺服器,以及工作在kHz范围内的电机驱动器。
注意 :本文档描述了pwm.h API的局限性。使用瑞萨灵活软件包(FSP)可能会有更优雅的解决方案。在两种解决方案中,pwh.h使用起来要简单得多。请继续关注本页面的更新。
技术提示 :本文脱离了程序员友好的Arduino应用程序编程接口(API),如analogWrite()函数,深入探讨了底层硬件和软件。如果您时间紧迫,请向下滚动以找到Arduino R4 WiFi的软件清单1,该软件在端口D3、D5、D6、D9、D10和D11上实现了快速PWM。请注意,这些选定的引脚是Arduino UNO默认的PWM引脚,如图1中的波浪符号所示,例如~3。
图 1 :Arduino R4 Minima(左)和Arduino R4 WiFi(右)的并排比较。在Arduino R4 WiFi上可以看到WiFi收发器和12x8 LED矩阵。
技术提示 :如果您是Arduino和PWM技术的新手,请参考这篇Arduino文章,它提供了PWM的扎实介绍,并探讨了适用于较旧的ATmega328p系列微控制器的快速PWM技术。
什么是 Arduino UNO R4 Minima 和 R4 WiFi 开发板?
如图1所示,Arduino R4 Minima和R4 WiFi是Arduino经典微控制器系列的最新版本。它们在物理上与过去15年设计的许多扩展板兼容。Arduino R4 WiFi包括额外的无线WiFi模块和板载12x8 LED矩阵。两款Arduino R4模块都采用了瑞萨R7FA4M1AB3CFM#AA0 32位CORTEX M4微控制器,封装为64LQFP。请注意,Arduino Professional Portenta C33使用了相关但更强大的瑞萨Cortex M33微控制器。这一点很重要,因为本工程简报中的PWM讨论与C33的PWM操作密切相关。
技术提示 :要特别注意匹配微控制器和外设I/O引脚的电压。它们有两种版本,包括5.0 VDC和3.3 VDC设备。这些电压通常不兼容。不匹配可能会损坏您的扩展板或微控制器。
快速 PWM 介绍
值得称赞的是,Arduino为其基于ATmega328p的经典UNO微控制器系列保持了向后兼容性。Arduino软件抽象层(Arduino API)提供了熟悉的外观和感觉。硬件保持兼容,包括5 VDC接口。这是一个很棒的功能,因为15年前编写的代码可以在新的UNO R4设备上运行。
与此同时,新的R4设备在复杂性上提高了几个数量级,其性能即使在十年前的低成本下也是无法实现的。原始的8位微控制器被新的32位Arm Cortex-M4核心和浮点单元(FPU)所超越。这种处理能力伴随着同样令人印象深刻的基于硬件的外设。
问题在于,这种能力大部分被锁定在熟悉且易于使用的Arduino API中。例如,R4的默认PWM为490 Hz,接近原始UNO的1 kHz PWM信号。默认的8位PWM仍然使用analogWrite()函数激活,并在引脚D2、D5、D6、D19、D10和D11上提供PWM信号。
以前增强 PWM 性能的解决方案
过去,UNO程序员能够通过所谓的“快速PWM”操作来提高PWM性能。这些例程不是Arduino API的一部分,而是需要直接操作ATmega328p的特殊功能寄存器(SFR)。换句话说,代码不是“Arduino可移植的”,因为它依赖于特定的微控制器。例如,带有ATmega4809微控制器的Arduino Nano Every与旧的Atmega328p接近,但不兼容。因此,ATmega328p的快速PWM例程无法正常工作,需要如本文所述的解决方法。本文的其余部分致力于寻找类似但更优雅的解决方法,以提高Arduino UNO R4的PWM性能。
Arduino UNO R4 Minima 和 WiFi 的 PWM 硬件资源
Arduino R4 Minima和WiFi上搭载的Renesas R7FA4M1AB3CFM#AA0微控制器是一款功能强大的通用微控制器。它包括控制无刷直流电机(BLDC)的配置。因此,它包含了高性能的PWM外设。总共有八个通用PWM定时器(GPT),其中两个是32位设备,其余是16位设备。
有多种方法可以描述微控制器的I/O引脚,包括信号名称(如GTIOC0A)、端口名称(如P107)或与LFQP94封装相关的物理引脚(如#41)。前两种方法在图2的矩阵中显示,而物理引脚号被转换为Arduino端口名称。请注意,给定的信号可能与选定的端口相关联。程序员负责将给定信号与物理端口关联。换句话说,几乎每个引脚都与一个多路复用器(MUX)相关联,程序员必须通过编程相关的SFR来命令MUX。
虽然程序员可以自由选择将PWM信号发送到哪里,但他们受到Arduino R4 Minima和WiFi的PCB布线的限制。这反映在图2中,该图显示了微控制器到Arduino I/O的连接。例如,Arduino R4 WiFi的黄色高亮部分显示了默认D2、D5、D6、D9、D10和D11 PWM输出所需的硬件PWM映射。此配置的代码包含在清单1中。
重要的是要认识到,Renesas R7FA4M1AB3CFM#AA0仅限于八个硬件PWM。这些在图2中显示为GPT0到GPT7。在内部,每个PWM定时器的输出可以发送到GTIOCXA或GTIOCXB网络。这些信号随后可以与两个物理微控制器端口相关联。这些引脚可能在Arduino UNO R4 PCB上可访问,也可能不可访问。
这最好由Arduino R4 Minima上的GPT1资源表示。在微控制器内部,PWM可以发送到GTIOC1A或GTIOC1B。这反过来可以分别发送到P105/P109或P104/P110。然后,Arduino程序员将GPT1资源分配给D2、D11、D3或D12。其他资源(如GTIOC7A)可以分配给Arduino D8或D9。在所有情况下,基于硬件的PWM都发送到一个且仅一个位置。一些信号(如GPT6)不容易被Arduino用户使用。
**图2:此矩阵显示了Arduino UNO R4 WiFi和UNO Minima的快速PWM选项。Arduino UNO R4 WiFi的高亮部分反映在本文中的代码清单中。
技术提示 :PCB布局是一门艺术。在设计通用开发板(如Arduino R4)时,有许多相互竞争的要求。这反映在图2中,该图将GPT PWM定时器映射到Arduino物理I/O(例如D3)。请记住,每个微控制器信号可以路由到两个不同的I/O引脚。例如,GTIOC1A可以路由到P105或P109。Minima可以使用D2或D11这两个引脚,而WiFi只能使用D3引脚。
需要注意的是,激活硬件PWM可能会干扰其他Arduino功能。设计时需要仔细排查问题。
技术提示 :尝试将GPT资源分配给多个引脚或不适当的引脚将导致运行时错误。微控制器将忽略该请求或进入“中断故障或裸机(无操作系统)环境”。
如何在 Arduino UNO R4 上使用快速 PWM
请记住,API用于简化或抽象底层的复杂性。Arduino语言本身就是一个优秀的API示例,它让一代学生和艺术家能够利用微控制器的强大功能。我们将使用另一个API来解锁Arduino Uno R4的快速PWM。
API定义在pwm.h和pwm.cpp文件中,这些文件位于PC上存储的Arduino15文件的深处。对于Windows机器,它们位于:
C:\Users\user_name\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.2.0\cores\arduino
C++ 解决方案
这是一个C++解决方案,需要我们首先根据所需的Arduino引脚分配实例化一个PWM对象。
第一步是包含所需的文件,然后实例化一个PWM对象:
#include “pwm.h”
PwmOut objPWMD3(PWM_D3_PIN);
然后我们将对象初始化为所需的频率和占空比:
objPWMD3.begin(25000.0f, 0.0f);
然后我们可以使用pulse_perc方法更改PWM占空比:
objPWMD3.pulse_perc(D_perc);
这些想法体现在用于配置Arduino UNO R4 WiFi的D3、D5、D6、D9、D10和D11端口的清单1中。请注意,由于引脚分配不同,代码在Minima上无法按原样运行。请参考图2并进行相应调整。请注意,Minima无法同时在引脚D3和D11上进行快速PWM操作。
/******************************************************************
* This code is applicable to the Arduino UNO R4 WiFi.
*
* **** It WILL NOT work in the Arduino UNO R4 Minima! ****
*
* Refer to the Figure 2 pin assignment to modify for use in the Minima.
/*****************************************************************/
#include "pwm.h"
#define PWM_D3_PIN D3
#define PWM_D5_PIN D5
#define PWM_D6_PIN D6
#define PWM_D9_PIN D9
#define PWM_D10_PIN D10
#define PWM_D11_PIN D11
PwmOut objPWMD3(PWM_D3_PIN); // Instantiate the PWM objects
PwmOut objPWMD5(PWM_D5_PIN);
PwmOut objPWMD6(PWM_D6_PIN);
PwmOut objPWMD9(PWM_D9_PIN);
PwmOut objPWMD10(PWM_D10_PIN);
PwmOut objPWMD11(PWM_D11_PIN);
void setup() {
Serial.begin(115200);
pinMode(PWM_D3_PIN, OUTPUT); // Configure the PWM I/O pin
pinMode(PWM_D5_PIN, OUTPUT);
pinMode(PWM_D6_PIN, OUTPUT);
pinMode(PWM_D9_PIN, OUTPUT);
pinMode(PWM_D10_PIN, OUTPUT);
pinMode(PWM_D11_PIN, OUTPUT);
objPWMD3.begin(25000.0f, 0.0f); // Instantiate the PWM objects with a
// frequency of 25 kHz and a 0% duty cycle
objPWMD5.begin(25000.0f, 0.0f);
objPWMD6.begin(25000.0f, 0.0f);
objPWMD9.begin(25000.0f, 0.0f);
objPWMD10.begin(25000.0f, 0.0f);
objPWMD11.begin(25000.0f, 0.0f);
}
void loop() { // Ramp between 0.0 and 100.0
static float D_perc = 0;
static bool state = 1;
if (state) {
D_perc += 0.1;
if (D_perc > 100) {
state = 0;
D_perc = 100;
}
} else {
D_perc -= 0.1;
if (D_perc < 0) {
state = 1;
D_perc = 0;
}
}
objPWMD3.pulse_perc(D_perc); // Set the duty cycle based on the ramp
objPWMD5.pulse_perc(D_perc);
objPWMD6.pulse_perc(D_perc);
objPWMD9.pulse_perc(D_perc);
objPWMD10.pulse_perc(D_perc);
objPWMD11.pulse_perc(D_perc);
Serial.println(D_perc);
delay(20);
}
代码清单 1 :用于在引脚 D2、D5、D6、D9、D10 和 D11 上配置快速 PWM 的 Arduino UNO R4 WiFi 特定代码
结果
使用 Digilent Analog Discovery 测试了 PWM 操作,如图 3 所示。在此示例中,Discovery 被用作多通道逻辑分析仪。
结果如图 4 所示。在此示例中,图 2 中黄色高亮的 Arduino 引脚被编码到代码清单 1 中。结果是在引脚 D2、D5、D6、D9、D10 和 D11 上运行的六个独立的 25 kHz PWM 信号。
图 3 :使用 Digilent Analog Discovery 测试 Arduino UNO R4 WIFI 的各种 PWM 组合。
图 4 :Arduino UNO R4 WiFi 被配置为在引脚 D3、D5、D6、D9、D10 和 D11 上生成 6 个 PWM 信号。在此示例中,每个 PWM 的频率为 25 kHz。
结论
Arduino UNO R4 Minima 和 WiFi 代表了从 Arduino UNO R3 向前迈出的重要一步。新设备配备强大的32位Arm Cortex M4处理器,以及同样令人印象深刻的硬件外设,包括本文中介绍的GPT PWM定时器。您计算机Arduino15文件夹中包含的pwm.h API是解锁硬件功能的关键。通过正确关注引脚分配,我们可以提高Arduino UNO R4 Minima和WiFi的多功能性。
此外,如果您能够成功将此技术应用于您的项目中,请告知我们。
有用的链接
请点击以下链接获取相关和有用的信息:
- DigiKey的产品选择指南
- Arduino教育内容。
- UNO R4 Minima | Arduino文档
- UNO R4 WiFi | Arduino文档
- RA4M1 - 48 MHz Arm Cortex-M4 32位微控制器



