OpenHarmony鸿蒙硬件-PwmStart()启动 PWM 信号输出 作者:马育民 • 2025-09-29 12:59 • 阅读:10009 # 介绍 启动 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](https://www.malaoshi.top/show_1GW1wuP89JXG.html "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()` 需配合引脚配置和初始化函数使用,完整流程如下(以控制蜂鸣器为例): ```c #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); ``` ### 关键注意事项 1. **调用顺序**:必须先通过 `IoSetFunc()` 配置引脚为 PWM 功能,再调用 `PwmInit()` 初始化通道,最后才能用 `PwmStart()` 输出信号,否则会失败。 2. **占空比范围**:必须 `duty ≤ freq`,否则函数返回错误(如 `freq=1000` 时,`duty` 最大为 1000,对应占空比 100%)。 3. **频率合理性**:不同硬件支持的频率范围不同(如 Hi3861 推荐 10Hz~1MHz),过高或过低的频率可能导致信号异常。 4. **多通道独立控制**:多个 PWM 通道可独立启动,例如同时用 PWM0 控制蜂鸣器、PWM1 控制 LED 亮度,互不干扰。 ### 常见用途 - **蜂鸣器发声**:通过不同 `freq` 输出不同音调(如 440Hz 对应 A 调)。 - **LED 亮度调节**:改变 `duty` 调整平均亮度(如 `duty=100` 对应 10% 亮度)。 - **电机调速**:向电机驱动器发送不同占空比的信号,控制转速。 `PwmStart()` 是鸿蒙 PWM 控制的核心函数,通过灵活配置频率和占空比,可实现丰富的硬件交互功能。 ### 总结 `PwmStart` 的关键是确保 **`duty ≤ freq`**,且占空比通过 `duty/freq` 计算。你的示例中参数顺序可能颠倒,建议调整为: ```c // 正确逻辑:频率为 freqDivisor,占空比为 freqDivisor/2(50%) PwmStart(WIFI_IOT_PWM_PORT_PWM0, freqDivisor, freqDivisor / 2); ``` 这样就能输出占空比 50% 的 PWM 信号,避免因参数错误导致的功能异常。 原文出处:http://www.malaoshi.top/show_1GW1wvWkNgfB.html