Arduino for PKE8720DF-C13-F10——PWM实现4位流水呼吸灯

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值