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

需要掌握:OpenHarmony API-PwmStop()停止 PWM 通道输出

介绍

控制蜂鸣器时,PwmStart() 函数的参数直接决定了蜂鸣器的发声频率和音量/持续状态

头文件

\\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 通道
  • 作用:选择连接蜂鸣器的 PWM 硬件通道(如 WIFI_IOT_PWM_PORT_PWM0)。
  • 蜂鸣器关联:蜂鸣器的物理引脚需通过 IoSetFunc() 配置为该 PWM 通道的输出功能(例如,蜂鸣器接在 GPIO12 上,需将其配置为 PWM0 输出)。
  • 示例:WIFI_IOT_PWM_PORT_PWM0 表示使用第 0 号 PWM 通道控制蜂鸣器。
duty:控制蜂鸣器的音量/发声持续时间
  • 作用:定义 PWM 信号的占空比(高电平时间占周期的比例),影响蜂鸣器的音量或振动持续状态。
  • 蜂鸣器关联:
    • 占空比 =(duty / freq)× 100%
    • 例如:freq=1000、duty=500 → 占空比 50%(高电平与低电平各占一半时间)。
    • 对无源蜂鸣器:占空比接近 50% 时音量最大;过小或过大可能导致音量降低。
    • 对有源蜂鸣器:占空比主要影响“发声/静音”的时间比例(如 10% 占空比可实现断续发声)。
    • 因为上面原因,所以:通常 duty = freq / 2
freq:控制蜂鸣器的发声频率(音调)
  • 作用:定义 PWM 信号的频率(单位:Hz),直接决定蜂鸣器发出的音调高低。
  • 蜂鸣器原理:蜂鸣器通过高频振动发声,freq 越高,振动越快,音调越高;freq 越低,音调越低。
  • 范围限制:蜂鸣器有固有频率范围(通常 100Hz~5kHz),超出范围可能无法发声或声音异常。

注意

必须 duty ≤ freq

总结

在蜂鸣器控制中:

  • port 决定“用哪个硬件通道控制蜂鸣器”;
  • duty 决定“蜂鸣器的音量大小或发声模式”。
  • freq 决定“蜂鸣器发出什么音调”;

通过调整这三个参数,可实现蜂鸣器的音调切换、音量调节和断续发声等功能。

例子

#include "wifiiot_pwm.h"
#include "wifiiot_gpio.h"
#include "ohos_init.h"
#include "unistd.h"

void BeeperControl(void) {
    // 1. 配置蜂鸣器引脚为 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 控制蜂鸣器:发出 440Hz(A调)、50%占空比(最大音量)
    PwmStart(WIFI_IOT_PWM_PORT_PWM0, 440, 220);  // freq=440, duty=220(50%)
    usleep(1000000);  // 持续发声 1 秒

    // 4. 改变频率:发出 523Hz(C调)
    PwmStart(WIFI_IOT_PWM_PORT_PWM0, 523, 261);  // 占空比保持 50%
    usleep(1000000);  // 持续发声 1 秒

    // 5. 停止发声
    PwmStop(WIFI_IOT_PWM_PORT_PWM0);
}

SYS_RUN(BeeperControl);

原文出处:/show_1GW1x3wUy4B9.html