ESP32: BPI-BIT 开发板外设 蜂鸣器 学习(Arduino)


#1

目的

通过使用 bpi-bit 板子上的蜂鸣器,学习 PWM

软硬件

测试使用的开发板: bpi-bit

测试使用的软件:Arduino IDE 1.8.9

函数解析

double ledcSetup(uint8_t channel, double freq, uint8_t resolution_bits)设置 LEDC 通道对应的频率和计数位数(占空比分辨率),该方法返回最终频率

通道最终频率 = 时钟 / ( 分频系数 * ( 1 << 计数位数 ) );(分频系数最大为1024)

参数 功能
channel 为通道号,取值0 ~ 15
freq 期望设置频率
resolution_bits 计数位数,取值0 ~ 20(该值决定后面 ledcWrite 方法中占空比可写值,比如该值写10,则占空比最大可写1023 即 (1<<resolution_bits-1 )

void ledcAttachPin(uint8_t pin, uint8_t channel)将 Pin 脚与通道号相连接

void ledcWrite(uint8_t channel, uint32_t duty)指定通道输出一定占空比波形

代码讲解

将 16 位精度的 PWM ,换算成 8 位精度

void ledcAnalogWrite(uint8_t channel, uint32_t value)
{
    //value_MAX = 255
    uint32_t duty = (65535 / 255) * value;
    // write duty to LEDC
    ledcWrite(channel, duty);
}

使用示例

要对代码进行测试,只需使用Arduino IDE对其进行编译并上传到ESP32开发板即可

#include <Arduino.h>

#define LEDC_CHANNEL_0 0
#define LEDC_TIMER_16_BIT 16

#define Buzzer 25

#define brightness 10 

int BuzzerTestFreq = 0;   
int LEDC_BASE_FREQ = 200;

/*****************************************************************
 * Function        :ledcAnalogWrite                              *
 * Input Parameter :channel / value                              *
 * Output Parameter:None                                         *
 * Features        :Match value to channel and convert to duty   *                               
 ****************************************************************/
void ledcAnalogWrite(uint8_t channel, uint32_t value)
{
    //value_MAX = 255
    uint32_t duty = (65535 / 255) * value;
    // write duty to LEDC
    ledcWrite(channel, duty);
}

void setup()
{ 
    Serial.begin(115200);
}

void loop()
{

    ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_16_BIT);
    ledcAttachPin(Buzzer, LEDC_CHANNEL_0);
    LEDC_BASE_FREQ = LEDC_BASE_FREQ + 10;
    // set the brightness on LEDC channel 0
    ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
    delay(100);
    Serial.print("Freq:");
    Serial.print(LEDC_BASE_FREQ);
    Serial.print("           Duty:");
    Serial.print(brightness/2.55);
    Serial.println();
    ledcAnalogWrite(LEDC_CHANNEL_0, 0);
}

现象

蜂鸣器的音调会越来越高

在 Arduino IDE 的串口监视器会输出以下结果

参考资料

esp32-hal-ledc.h

esp32-hal-ledc.c

ESP32 概览 | 乐鑫


#2

这个贴子写得好,环境,硬件,代码,执行效果全有。


#3

666,这个 GIF 是怎么弄出来的?我也想弄一个这样的


#4

用一个 ScreenToGif 的软件