树莓派 pico pwm 的行为很奇怪

时间:2021-07-02 14:09:00

标签: c microcontroller pwm raspberry-pi-pico

我最近购买了压电蜂鸣器,并尝试将它与我的 raspberry pi 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 有误解?

如果你需要,我也可以给你发视频。

0 个答案:

没有答案