需要掌握: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);