介绍
在鸿蒙(OpenHarmony)硬件开发中,PWM(Pulse Width Modulation,脉冲宽度调制) 是一种通过周期性脉冲信号的占空比(高电平时间占周期的比例)来模拟模拟信号或实现数字控制的技术,是物联网设备开发中常用的硬件功能。
重要概念
- 周期:一个脉冲信号的时间
- 频率:单位时间内经过周期次数,单位:
Hz,决定信号的周期(周期 = 1/频率) - 脉宽时间,高电平时间
- 占空比,一个周期内高电平时间(脉宽时间)与总周期的比值(通常用百分比表示)
原理
PWM 信号是一种周期性的 方波,通过调整 频率、占空比 实现控制
例如:
- 频率 1000Hz → 周期 1ms(1/1000 秒)。
- 占空比 50% → 高电平持续 0.5ms,低电平持续 0.5ms。
典型用途
在鸿蒙物联网设备(如 Hi3861、Hi3516 开发板)中,PWM 常用于以下场景:
控制蜂鸣器音调
通过不同频率的 PWM 信号驱动蜂鸣器,产生不同音调的声音(如报警提示、音乐播放)。调节 LED 亮度
利用人眼视觉暂留效应,通过改变占空比(如 10%~90%)调节 LED 平均亮度,实现呼吸灯效果。驱动电机/舵机
向电机或舵机发送特定占空比的 PWM 信号,控制转速或角度(如无人机、机械臂)。模拟模拟电压输出
配合低通滤波电路,将 PWM 信号转换为对应的模拟电压(如控制 DAC 芯片输出)。
控制方式
鸿蒙通过标准化接口封装了 PWM 硬件操作,核心函数包括:
IoSetFunc:将物理引脚配置为 PWM 功能(引脚需支持 PWM 复用)。PwmInit:初始化指定的 PWM 通道(如 PWM0、PWM1)。PwmStart:启动 PWM 输出,设置频率和占空比。PwmStop:停止 PWM 输出。
示例代码片段(控制蜂鸣器):
#include "wifiiot_pwm.h"
#include "wifiiot_gpio.h"
// 配置 GPIO12 为 PWM0 功能
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_PWM0_OUT);
// 初始化 PWM0 通道
PwmInit(WIFI_IOT_PWM_PORT_PWM0);
// 输出 1000Hz、50% 占空比的 PWM 信号(驱动蜂鸣器发声)
PwmStart(WIFI_IOT_PWM_PORT_PWM0, 1000, 500);
与其他硬件功能的区别
- GPIO:仅能输出高低电平(0 或 1),无法实现渐变控制;PWM 通过占空比调节可模拟“中间状态”。
- DAC:直接输出模拟电压,精度高但硬件成本高;PWM 基于数字电路实现,成本低、兼容性强,是多数场景的替代方案。
总之,PWM 是鸿蒙硬件开发中实现“渐变控制”“模拟信号输出”的核心技术,通过简单的数字信号即可实现丰富的硬件交互功能,是物联网设备开发的必备技能。
