OpenHarmony鸿蒙硬件-PwmStart()启动 PWM 信号输出-蜂鸣器 作者:马育民 • 2025-09-29 21:49 • 阅读:10007 需要掌握:[OpenHarmony API-PwmStop()停止 PWM 通道输出](https://www.malaoshi.top/show_1GW1wvdPezSb.html "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` 决定“蜂鸣器发出什么音调”; 通过调整这三个参数,可实现蜂鸣器的音调切换、音量调节和断续发声等功能。 # 例子 ```c #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); ``` 原文出处:http://www.malaoshi.top/show_1GW1x3wUy4B9.html