1. PWM简介
1) PWM原理
PWM (Pulse Width Modulation) 就是脉冲宽度调制,它是利用微处理器的数字输出来对模拟电路进行控制的一种技术。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
PWM 信号中,时间周期和频率始终是固定的。只有脉冲 ON 的时间和 OFF 的时间(占空比)不同。脉冲宽度越大即占空比越大,提供给 LED 灯的平均电压越大,LED 灯的亮度就高。反之脉冲宽度越小,则占空比越小,LED 灯的亮度越低。
2) PKE8720DF-C13-F10开发板PWM配置
下图是 PKE8720DF-C13-F10 开发板的引脚定义。可以看到共有 11 个引脚可用于 PWM,占空比可以配置成 0~100% 。
PKE8720DF-C13-F10开发板详细信息以及Arduino IDE配置方法可以参考之前的文章:使用PKE8720DF-C13-F10实现Arduino example——Button_deer_vickey的博客-CSDN博客
2. Arduino IDE——PWM信号控制4个LED使用不同的频率闪烁
1) 所需材料
- 1 × PKE8720DF-C13-F10开发板
- 1 × USB转type-C数据线
- 4 × LED
- 8 × 杜邦线
2) 电路连接
- 4 个 LED 的短脚分别通过杜邦线连接到开发板的 GND
- 4 个 LED 的长脚分别通过杜邦线连接到开发板的 PB20、PB21、PB22、PB23
3) 代码解析
完整的源代码可以在下面的链接中下载:https://download.csdn.net/download/deer_vickey/88241321
include files
PWM的接口定义在下面的头文件中,相关函数可以在ambd_arduino源代码中查询,github下载地址:GitHub - ambiot/ambd_arduino: AmebaD Arduino third-party package SDK
#include "device.h"
#include "pwmout_api.h"
definitions and global variables
-
pwm_led_pin[4] 定义了实验中使用的 PWM 引脚,分别是 PB20、PB21、PB22、PB23
-
PWM_PERIOD 和 PWM_STEP 表示周期和步长,分别为 20 ms 和 1 ms
-
pwms[4] 是每个 PWM 引脚不同的脉冲宽度,分别为 0ms、5ms、10ms、15ms
pwmout_t pwm_led[4];
PinName pwm_led_pin[4] = {PB_20, PB_21, PB_22, PB_23};
#define PWM_PERIOD 20000
#define PWM_STEP (PWM_PERIOD/20)
int pwms[4]={0, PWM_PERIOD/4, PWM_PERIOD/2, PWM_PERIOD/4*3};
int steps[4]={PWM_STEP, PWM_STEP, PWM_STEP, PWM_STEP};
setup()
- 对 4 个 PWM pin 进行初始化,并且设置对应的周期为 20ms
void setup() {
// put your setup code here, to run once:
for (i = 0; i < 4; i++) {
pwmout_init(&pwm_led[i], pwm_led_pin[i]);
pwmout_period_us(&pwm_led[i], PWM_PERIOD);
}
}
loop()
- 调用 pwmout_pulsewidth_us 函数设定 4 个引脚输出的初始 PWM 脉冲宽度,脉冲宽度为 pwms[4]中定义的 0ms、5ms、10ms、15ms,占空比分别为0%、25%、50%、75%
- 脉冲宽度先以 1ms 的步长逐渐增加,增大到与周期相等时,将步长设置为 -1ms,逐渐减小;当脉冲宽度减小到 0 的时候,再将脉冲宽度设为 1ms,逐渐增加。不断循环此过程,从而实现 LED 灯亮度强弱的逐渐变化。
void loop() {
// put your main code here, to run repeatedly:
for (i = 0; i < 4; i++) {
pwmout_pulsewidth_us(&pwm_led[i], pwms[i]);
pwms[i] += steps[i];
if (pwms[i] >= PWM_PERIOD) {
steps[i] = -PWM_STEP;
pwms[i] = PWM_PERIOD;
}
if (pwms[i] <= 0) {
steps[i] = PWM_STEP;
pwms[i] = 0;
}
}
delay(200);
}
4) 实验结果
烧录 image 之后可以看到 4 个 LED 灯以不同的频率闪烁,展示出了 4 位流水空气灯的效果。
20230822_Arduino_PWM