// 用 ESP32 的 LEDC 外设模块专用于输出 PWM 波形(需要esp32库)
// 宏定义 GPIO 输出引脚
#define FREQ 2000 // 频率
#define CHANNEL1 0 // 通道
#define RESOLUTION 8 // 分辨率
#define LED1 47 // LED 引脚
// ADC
// 宏定义 GPIO 输出引脚
#define POT 4
#define LED2 14
#define CHANNEL2 1
// 初始化电位计输入信号
int pot_value;
// 用 analogRead和write读取adc并设置led亮度,需要led_value变量
int led_value;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//setFunc1();
setFunc2();
//setAdc1();
//setAdc2();
}
void loop()
{
//execFunc1();
execFunc2();
//execAdc1();
//execAdc2();
}
// 用 analogRead和write读取adc并设置led亮度
void setAdc1()
{
pinMode(POT, INPUT);
pinMode(LED2, OUTPUT);
}
void execAdc1()
{
// 读取电位计模拟输入值
pot_value = analogRead(POT);
///pot_value = rand() % 4023 + 1; //产生1~4023的随机数
// 打印模拟值在串口屏上
Serial.println((String)"in:"+pot_value);
// 把电位计模拟输入值转换为 LED 的模拟输出值。
led_value = pot_value / 16;
Serial.println((String)"out:"+led_value);
analogWrite(LED2, led_value);
delay(100);
}
// 用esp32库读取adc并设置led亮度
void setAdc2()
{
// 设置 ADC 分辨率
analogReadResolution(12);
// 配置衰减器
analogSetAttenuation(ADC_11db);
// 建立 LEDC 通道,配置 LEDC 分辨率
ledcSetup(CHANNEL2, 1000, 12);
// 关联 GPIO 口与 LEDC 通道
ledcAttachPin(LED2, CHANNEL2);
}
void execAdc2()
{
// 读取电位计模拟输入值
pot_value = analogRead(POT);
// 打印模拟值在串口屏上
Serial.println((String)"in:"+pot_value);
// 输出 PWM
ledcWrite(CHANNEL2, pot_value);
delay(100);
}
void setFunc1()
{
// Arduino 自带的 analogWrite(pin, value) 函数输出 PWM
// 配置 GPIO 输出引脚
pinMode(LED1, OUTPUT);
}
void execFunc1()
{
/* 通过 Arduino 输出 PWM 有两种方法,
第一种就是使用 Arduino 自带的 analogWrite(pin, value) 函数输出 PWM,
其中的两个参数:
pin:要写入的 Arduino 引脚, 允许的数据类型:int.
value:占空比:介于 0(始终关闭)和 255(始终开启)之间。允许的数据类型:int.
*/
// 实现渐亮效果
for(int i=0;i<256;i++) {
// 设置亮度模拟值
analogWrite(LED1, i);
// 延时 10ms
delay(10);
}
// 实现渐灭效果
for(int i=255;i>=0;i--) {
// 设置亮度模拟值
analogWrite(LED1, i);
// 延时 10ms
delay(10);
}
}
void setFunc2()
{
// 用 ESP32 的 LEDC 外设,在 ESP32 上有一个 LEDC 外设模块专用于输出 PWM 波形。
ledcSetup(CHANNEL1, FREQ, RESOLUTION); // 设置通道
ledcAttachPin(LED1, CHANNEL1); // 将通道与对应的引脚连接
Serial.println("set");
}
void execFunc2()
{
Serial.println("exec");
// 逐渐变亮
for (int i=0;i<pow(2, RESOLUTION); i++)
{
ledcWrite(CHANNEL1, i); // 输出PWM
delay(5);
}
// 逐渐变暗
for (int i=pow(2, RESOLUTION)-1;i>=0;i--)
{
ledcWrite(CHANNEL1, i); // 输出PWM
delay(5);
}
}