嵌入式人工智能ESP32(4-PWM呼吸灯)

1、PWM基本原理

PWMPulse-width modulation)是脉冲宽度调制的缩写。脉冲宽度调制是一种模拟信号电平数字编码方法。脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则,可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应幅值和频率的波形。实现模拟电路的数字化控制可显著降低系统成本和功耗。许多微控制器和数字信号处理器 (DSP) 已包括了 PWM控制器芯片,因此可以更轻松地实施数字化控制。PWM信号是通过调节占空比的变化来调节信号、能量等的变化。

PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。

单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平,假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。

电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。

比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V。

PWM的调节作用来源于对"占周期"的宽度控制,"占周期"变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,"占周期"变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降。也就是,**在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压。**PWM就是通过这种原理实现D/A转换的。

嵌入式人工智能(9-基于树莓派4B的PWM-LED呼吸灯)_树莓派4b控制pwm-CSDN博客

2、 PWM信号的生成

上图显示了比较器使用两个输入PWM信号所生成的 PWM输出波形 (红线): 正弦波 (黑 线) 和输入信号 (灰线)。0.5 VDC 输入信 号是电压基准,通过与正弦波比较生成 PWM 波形。使用 0.5 VDC 稳态基准电压, 可生成 50% 占空比的 PWM 波形。

如果基准电压降至 0.25 VDC, 那么将生成更高占空比的 PWM波形

3、ESP32的PWM官方示例

可以在所有输出引脚上启用PWM。基本频率可以在1Hz到40MHz的范围内,但存在折衷;随着基频增加,占空比分辨率降低。

python 复制代码
from machine import Pin, PWM

pwm0 = PWM(Pin(0))         # create PWM object from a pin
freq = pwm0.freq()         # get current frequency (default 5kHz)
pwm0.freq(1000)            # set PWM frequency from 1Hz to 40MHz

duty = pwm0.duty()         # get current duty cycle, range 0-1023 (default 512, 50%)
pwm0.duty(256)             # set duty cycle from 0 to 1023 as a ratio duty/1023, (now 25%)

duty_u16 = pwm0.duty_u16() # get current duty cycle, range 0-65535
pwm0.duty_u16(2**16*3//4)  # set duty cycle from 0 to 65535 as a ratio duty_u16/65535, (now 75%)

duty_ns = pwm0.duty_ns()   # get current pulse width in ns
pwm0.duty_ns(250_000)      # set pulse width in nanoseconds from 0 to 1_000_000_000/freq, (now 25%)

pwm0.deinit()              # turn off PWM on the pin

pwm2 = PWM(Pin(2), freq=20000, duty=512)  # create and configure in one go
print(pwm2)                               # view PWM settings

4、实验代码

呼吸灯的实现,由亮到暗,再由暗到亮,呼吸。

python 复制代码
from machine import Pin, PWM
import time

pwm_led = PWM(Pin(19), freq=100000, duty=1023)

while True:
    for i in range(0,1023,1):
        pwm_led.duty(i)
        time.sleep(0.003)
    for i in range(1023,-1,-1):
        pwm_led.duty(i)
        time.sleep(0.003)
相关推荐
李永奉10 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
数字新视界14 小时前
机房动环监控的智能化管理与安全提升探索
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
云边云科技_云网融合16 小时前
零售餐饮门店网络搭建:POS 交易稳定保障、IoT 设备联网运维、门店带宽优化、多终端并发适配
网络·物联网·零售
Oflycomm18 小时前
物联网终端的“不可能三角”:小尺寸、低功耗、高稳定性如何兼得?
物联网·低功耗·嵌入式开发·无线模组
深圳海导科技18 小时前
单北斗车载定位:国产车辆高精度导航技术|深圳海导科技navynav
人工智能·物联网
星恒讯工业路由器20 小时前
市政监控进入5G RedCap时代:轻量化5G如何解决户外监控联网难题
网络·物联网·5g·智能路由器·工业路由器·5g redcap·市政监控
zcmodeltech21 小时前
冷链物流沙盘模型控制系统设计——基于STM32与Modbus RTU的冷藏车、冷库全流程动态展示方案
数据结构·stm32·单片机·嵌入式硬件·物联网·能源
智码看视界1 天前
Edge AI 与 IoT 全栈系列:Edge AI 全栈 2:ESP32 + MQTT + Flink 实时 IoT 数据管道
物联网·flink·esp32·全栈开发·iot平台·实时流处理·edgeai
盛世宏博智慧档案1 天前
基于PLC与物联网网关的档案库房温湿度超标自动联动控制实现思路(含拓扑图与协议对接)
大数据·人工智能·物联网
做萤石二次开发的哈哈1 天前
萤石蓝海AIoT工作台新增需求PRD自动生成+技术设计文档可视化:AI先澄清需求再写代码,项目返工率大幅下降
人工智能·物联网·萤石开放平台·蓝海aiot一站式工作台·aiot开发