目的
通过使用 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 的串口监视器会输出以下结果