编写ESP32的交流斩波调光程序
时间: 2024-05-16 09:18:19 浏览: 126
以下是一个基本的ESP32的交流斩波调光程序,使用了ESP32的PWM控制器来控制交流电的亮度:
```C++
#include <Arduino.h>
#include <driver/ledc.h>
#define LEDC_TIMER_BIT 10
#define LEDC_BASE_FREQ 5000
#define LEDC_MAX_DUTY_CYCLE (1 << LEDC_TIMER_BIT)
#define PWM_PIN 18
#define AC_FREQUENCY 50
#define AC_PERIOD_MICROS (1000000 / AC_FREQUENCY)
void setup() {
Serial.begin(115200);
ledcSetup(0, LEDC_BASE_FREQ, LEDC_TIMER_BIT); // 初始化PWM控制器
ledcAttachPin(PWM_PIN, 0); // 将PWM控制器连接到GPIO18引脚
Serial.println("Ready!");
}
void loop() {
// 使LED灯逐渐亮起
for (int dutyCycle = 0; dutyCycle < LEDC_MAX_DUTY_CYCLE; dutyCycle++) {
ledcWrite(0, dutyCycle);
delay(10);
}
// 使LED灯逐渐变暗
for (int dutyCycle = LEDC_MAX_DUTY_CYCLE; dutyCycle >= 0; dutyCycle--) {
ledcWrite(0, dutyCycle);
delay(10);
}
}
```
在这个程序中,我们使用了ESP32的PWM控制器来控制GPIO18引脚的输出电平。我们设置了PWM控制器的基本频率为5000Hz,分辨率为10位。因此,我们可以控制LED灯的亮度在0到1023之间变化。
为了控制交流电的亮度,我们需要使用斩波技术。在每个交流周期内,我们只能让电流流过一半的周期。因此,我们需要在每个周期的前半段打开LED灯,然后在后半段关闭LED灯。
为了实现这个功能,我们可以在程序中添加一个定时器,用于在每个交流周期的前半段打开LED灯,并在后半段关闭LED灯。以下是修改后的代码:
```C++
#include <Arduino.h>
#include <driver/ledc.h>
#define LEDC_TIMER_BIT 10
#define LEDC_BASE_FREQ 5000
#define LEDC_MAX_DUTY_CYCLE (1 << LEDC_TIMER_BIT)
#define PWM_PIN 18
#define AC_FREQUENCY 50
#define AC_PERIOD_MICROS (1000000 / AC_FREQUENCY)
hw_timer_t * timer = NULL;
volatile bool halfCycleFlag = false;
void IRAM_ATTR onTimer() {
halfCycleFlag = true;
}
void setup() {
Serial.begin(115200);
ledcSetup(0, LEDC_BASE_FREQ, LEDC_TIMER_BIT); // 初始化PWM控制器
ledcAttachPin(PWM_PIN, 0); // 将PWM控制器连接到GPIO18引脚
// 初始化定时器
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, AC_PERIOD_MICROS / 2, true);
timerAlarmEnable(timer);
Serial.println("Ready!");
}
void loop() {
if (halfCycleFlag) {
// 切换LED灯的状态
static bool ledState = false;
ledcWrite(0, ledState ? 0 : LEDC_MAX_DUTY_CYCLE);
ledState = !ledState;
halfCycleFlag = false;
}
}
```
在这个程序中,我们使用了一个定时器来触发交流周期的开始。在定时器中断处理函数中,我们会将`halfCycleFlag`标志位置为`true`,表示当前交流周期的前半段已经结束。在主循环中,我们会检查这个标志位,如果为`true`,就切换LED灯的状态。这样,我们就实现了一个基本的斩波调光程序。
阅读全文