我最近购买了 piezzo 蜂鸣器,并尝试将它与我的树莓派 pico 一起使用。我编写了这段代码(基于文档)来使用 pwm 生成频率。
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
#include "hardware/gpio.h"
typedef uint16_t u16;
typedef uint32_t u32;
void play_tone(u32 freq);
void stop_playing();
const u16 BUZZER = 0;
int main()
{
stdio_init_all();
gpio_init(BUZZER);
gpio_set_function(BUZZER, GPIO_FUNC_PWM);
while (1)
{
play_tone(3000);
sleep_ms(200);
stop_playing();
sleep_ms(200);
play_tone(4000);
sleep_ms(800);
stop_playing();
sleep_ms(8000);
}
return 0;
}
void play_tone(u32 freq)
{
//get slice number
uint slice_num = pwm_gpio_to_slice_num(BUZZER);
//set divider
u32 f_sys = clock_get_hz(clk_sys);
float divider = f_sys / 1000000UL;
pwm_set_clkdiv (slice_num, divider);
//set number of cycles
u32 numberOfCycles = 1000000UL/freq -1;
pwm_set_wrap(slice_num, numberOfCycles);
// Set output high for half of cycles
pwm_set_chan_level(slice_num, 0, (numberOfCycles+1)/2-1);
// Set the PWM running
pwm_set_enabled(slice_num, true);
}
void stop_playing()
{
uint slice_num = pwm_gpio_to_slice_num(BUZZER);
pwm_set_enabled(slice_num, false);
}
有两种功能,一种是开始播放,一种是停止。还有一个简单的循环应该播放两个音调,然后等待 8 秒。
但是它并没有像我预期的那样工作。有时它会开始播放一些随机的高频而不是停止播放。我也尝试过使用 LED,当我调用 stop_playing 时,它有时也会开始以随机亮度发光。我还尝试了一些不同的 gpios。
我真的很困惑,因为我的 pico 每个周期的行为都不同,即使每次都是相同的代码。我的 pico 是否损坏了,还是我对 pwm 有误解?
如果你需要,我也可以给你发视频。