介绍
启动 PWM 信号输出
头文件
\\base\iot_hardware\interfaces\kits\wifiiot_lite\wifiiot_pwm.h
#include "wifiiot_pwm.h"
定义
/**
* @brief 启动指定 PWM 通道的信号输出
* @param port:PWM 通道(来自 WifiIotPwmPort 枚举,如 WIFI_IOT_PWM_PORT_PWM0)
* @param duty:占空比数值(范围:0 ~ freq),表示高电平时间占比
* @param freq:输出频率(单位:Hz),决定 PWM 信号的周期(周期 = 1/freq)
* @return 0 表示成功,非 0 表示失败(如参数无效、通道未初始化等)
*/
unsigned int PwmStart(WifiIotPwmPort port, unsigned short duty, unsigned short freq);
参数
port(PWM 通道)
必须是 WifiIotPwmPort 枚举值(如WIFI_IOT_PWM_PORT_PWM0),指定要输出信号的 PWM 硬件通道。
例如:WIFI_IOT_PWM_PORT_PWM0表示使用第 0 号 PWM 通道。duty(占空比数值)
决定一个周期内高电平的持续时间,需满足0 ≤ duty ≤ freq:- 占空比百分比 =(
duty/freq)× 100% - 例如:
freq=1000、duty=500→ 占空比 50%(高电平持续 0.5ms,低电平持续 0.5ms)。
- 占空比百分比 =(
freq(频率,单位 Hz)
定义 PWM 信号的周期,即每秒输出的脉冲数量。- 频率越高,周期越短(如 1000Hz 对应周期 1ms)。
- 取值范围由硬件决定(通常支持 1Hz ~ 1MHz,超出范围会启动失败)。
说明
使用流程
PwmStart() 需配合引脚配置和初始化函数使用,完整流程如下(以控制蜂鸣器为例):
#include "wifiiot_pwm.h"
#include "wifiiot_gpio.h"
#include "ohos_init.h"
#include "unistd.h"
void PwmExample(void) {
// 1. 配置物理引脚为 PWM 功能(PWM0 通常对应 GPIO12)
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_PWM0_OUT);
// 2. 初始化 PWM0 通道
PwmInit(WIFI_IOT_PWM_PORT_PWM0);
// 3. 启动 PWM 输出:频率 2000Hz,占空比 30%
unsigned int freq = 2000; // 频率 2000Hz(周期 0.5ms)
unsigned int duty = 600; // 占空比 30%(600/2000)
int ret = PwmStart(WIFI_IOT_PWM_PORT_PWM0, freq, duty);
if (ret != 0) {
printf("PWM 启动失败!错误码:%d\n", ret);
return;
}
// 持续输出 3 秒
usleep(3000000);
// 4. 停止 PWM 输出(可选)
PwmStop(WIFI_IOT_PWM_PORT_PWM0);
}
// 注册入口函数
SYS_RUN(PwmExample);
关键注意事项
调用顺序:必须先通过
IoSetFunc()配置引脚为 PWM 功能,再调用PwmInit()初始化通道,最后才能用PwmStart()输出信号,否则会失败。占空比范围:必须
duty ≤ freq,否则函数返回错误(如freq=1000时,duty最大为 1000,对应占空比 100%)。频率合理性:不同硬件支持的频率范围不同(如 Hi3861 推荐 10Hz~1MHz),过高或过低的频率可能导致信号异常。
多通道独立控制:多个 PWM 通道可独立启动,例如同时用 PWM0 控制蜂鸣器、PWM1 控制 LED 亮度,互不干扰。
常见用途
- 蜂鸣器发声:通过不同
freq输出不同音调(如 440Hz 对应 A 调)。 - LED 亮度调节:改变
duty调整平均亮度(如duty=100对应 10% 亮度)。 - 电机调速:向电机驱动器发送不同占空比的信号,控制转速。
PwmStart() 是鸿蒙 PWM 控制的核心函数,通过灵活配置频率和占空比,可实现丰富的硬件交互功能。
总结
PwmStart 的关键是确保 duty ≤ freq,且占空比通过 duty/freq 计算。你的示例中参数顺序可能颠倒,建议调整为:
// 正确逻辑:频率为 freqDivisor,占空比为 freqDivisor/2(50%)
PwmStart(WIFI_IOT_PWM_PORT_PWM0, freqDivisor, freqDivisor / 2);
这样就能输出占空比 50% 的 PWM 信号,避免因参数错误导致的功能异常。