前言
本节我们来对比PWM和频率控制BPI-BIT开发板上面的蜂鸣器产生的不同效果。
软硬件
测试使用的开发板: BPI-BIT
测试使用的软件: platformIO
示例代码
PWM控制蜂鸣器
#include <Arduino.h>
#define buzzer 25
//我们将使用通道0和8位分辨率作为占空比。对于频率,我们将仅设置2000 Hz以进行初始设置。
int freq = 2000;
int channel = 0;
int resolution = 8;
void setup()
{
//使用ledcSetup功能设置PWM,该功能接收PWM通道,频率和占空 比分辨率作为输入。
ledcSetup(channel, freq, resolution);
//我们将通过调用ledcAttachPin函数将PWM通道连接到BPI-BIT的实际GPIO 。这接收GPIO和通道作为输入。我将使用BPI-BIT的 GPIO 25。
ledcAttachPin(buzzer, channel);
}
void loop()
{
//我们调用ledcWriteTone函数,将PWM通道和要设置的频率作为输入。我们将其设置为2000Hz,作为初始配置。
ledcWriteTone(channel,freq);//固定频率
//我们将执行一个for循环,该循环从0的PWM开始,并在每次迭代时将其增加10。由于我们指定了8位的分辨率,因此我们可以在0到255之间改变占空比。
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle = dutyCycle + 10)
{
//要设置占空比,我们只需要调用ledcWrite函数,将要设置的通道和占空比值作为输入传递即可。
ledcWrite(channel,dutyCycle);
delay(1000);
}
}
频率控制蜂鸣器
#include <Arduino.h>
#define buzzer 25
int freq = 2000;
int channel = 0;
int resolution = 8;
void setup()
{
ledcSetup(channel, freq, resolution);
ledcAttachPin(buzzer, channel);
}
void loop()
{
//将占空比固定为125(大约50%)开始
ledcWrite(channel,125);//固定占空比
//我们将执行与上一个相似的for循环,但是这次以0 Hz的频率开始,并将其增加250,直到10000 Hz。
for(int freq = 255; freq <10000; freq = freq + 250)
{
//要设置频率,我们只需要调用ledcWriteTone函数,将要设置的通道和频率作为输入传递即可。
ledcWriteTone(channel,freq);
delay(1000);
}
}
效果对比
PWM控制蜂鸣器
频率控制蜂鸣器
总结
PWM的变化使蜂鸣器发出的音量大小发生变化,而音调未发生变化。频率的变化使蜂鸣器发出的音调发生了变化,而音量大小不变。