OpenHarmony鸿蒙硬件-PwmStart()启动 PWM 信号输出

介绍

启动 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);

关键注意事项

  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 计算。你的示例中参数顺序可能颠倒,建议调整为:

// 正确逻辑:频率为 freqDivisor,占空比为 freqDivisor/2(50%)
PwmStart(WIFI_IOT_PWM_PORT_PWM0, freqDivisor, freqDivisor / 2);

这样就能输出占空比 50% 的 PWM 信号,避免因参数错误导致的功能异常。


原文出处:/show_1GW1wvWkNgfB.html