【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
pwm其实用的还是挺多的,尤其是很多和电机相关的地方,都是和pwm搭边的。舵机的话,就是发pwm控制,不同的空占比,可以调节不同的旋转角度。而如果换成普通电机,中间接好驱动电路的话,不同的pwm方波,那么电机就以不同的速度驱动起来。这些都是pwm的用途。那么不是电机的场景,我们就可以换成led灯。根据不同的空占比,就可以制造出呼吸灯的效果。这也是pwm可以产生的另外一个效果。

1、准备gpio
这个gpio,esp32上面很多pin,我们随便插一个即可,比如gpio 14。
2、准备好元器件
主要的元器件就是led灯、esp32模块、面包板、杜邦线。其中因为涉及到面板的缘故,所以杜邦线尽量使用那种母转公的杜邦线。
3、连接电路
这部分不复杂,就是从gpio 14连出来,接到led上,然后再接到gnd。注意,led插入到面包板的时候,控制到方向,否则可能出现led灯不亮的情况,到时候查起来就比较麻烦。
4、ai生成代码
这部分关于led灯呼吸的内容,esp32有现成的结构体和函数。但是这些统统都不需要自己去学习,我们需要做的就是告诉ai,用esp32的gpio14制造一个呼吸灯的效果,接下来等着ai实现代码即可。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#include "driver/gpio.h"
// Breathing LED Configuration
#define LED_GPIO 14 // GPIO14 for LED
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // 0-8191
#define LEDC_FREQ_HZ 5000 // 5kHz PWM frequency
void breathing_led_task(void *arg)
{
// Configure LED PWM timer
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_DUTY_RES,
.freq_hz = LEDC_FREQ_HZ,
.speed_mode = LEDC_MODE,
.timer_num = LEDC_TIMER,
.clk_cfg = LEDC_AUTO_CLK,
};
ledc_timer_config(&ledc_timer);
// Configure LED PWM channel
ledc_channel_config_t ledc_channel = {
.channel = LEDC_CHANNEL,
.duty = 0,
.gpio_num = LED_GPIO,
.speed_mode = LEDC_MODE,
.hpoint = 0,
.timer_sel = LEDC_TIMER,
};
ledc_channel_config(&ledc_channel);
printf("Breathing LED on GPIO%d started\n", LED_GPIO);
while (1)
{
// Fade in: 0 to max brightness
for (int duty = 0; duty <= 8191; duty += 5)
{
ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
vTaskDelay(2 / portTICK_PERIOD_MS);
}
// Fade out: max brightness to 0
for (int duty = 8191; duty >= 0; duty -= 5)
{
ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
vTaskDelay(2 / portTICK_PERIOD_MS);
}
}
}
void app_main(void)
{
printf("ESP32 Breathing LED Demo\n");
printf("LED GPIO: %d\n", LED_GPIO);
// Start breathing LED task
xTaskCreate(breathing_led_task, "breathing_led", 2048, NULL, 5, NULL);
}
5、编译、调试和学习
有了代码,就可以编译、下载和调试了。这是最基础的。代码不能编译,或者编译出错,代码的价值就很低了。等确认好效果之后,就可以学习这份代码了。听上去这有点匪夷所思,但是目前ai code盛行的当下,这么做反而是效率最高的方式。