esp32 idf pwm
时间: 2025-01-03 07:32:34 浏览: 8
### ESP32 使用 IDF 进行 PWM 配置
#### LEDC 模块概述
LEDC (LED Control) 是一种用于生成可调占空比和频率的 PWM 信号模块。该模块不仅限于控制 LED,还可以应用于其他需要精确脉宽调制的应用场景中[^1]。
#### 定时器配置
为了设置合适的 PWM 波形,在初始化过程中需先创建并配置定时器参数。这涉及到设定最大计数值以及基础频率等属性:
```c
ledc_timer_config_t timer_conf = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.duty_resolution = LEDC_TIMER_8_BIT, // 设置分辨率
.timer_num = LEDC_TIMER_0, // 选择定时器编号
.freq_hz = 5000, // 设定目标频率(Hz)
.clk_cfg = LEDC_AUTO_CLK // 自动选择时钟源
};
// 应用上述配置至硬件
ESP_ERROR_CHECK( ledc_timer_config(&timer_conf) );
```
#### 渠道分配与初始状态设定
完成定时器建立之后,则要指定具体哪一个 GPIO 脚作为输出端口,并赋予初步的工作条件:
```c
ledc_channel_config_t channel_conf = {
.gpio_num = GPIO_NUM_17, // 绑定GPIO管脚号
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0, // 分配给哪个通道
.intr_type = LEDC_INTR_DISABLE, // 中断类型禁用
.timer_sel = LEDC_TIMER_0, // 关联之前定义好的定时器
.duty = 0 // 初始占空比设为零
};
// 将此渠道加入到 LECD 控制体系里去
ESP_ERROR_CHECK( ledc_channel_config(&channel_conf) );
```
#### 动态调整 PWM 占空比
一旦完成了基本框架搭建工作以后,便可以利用 API 函数随时修改当前正在运作中的 PWM 流量大小了;这里提供两种方式——直接编程更改或是借助内置斜坡发生器实现平滑过渡效果[^3]。
##### 方法一:通过软件即时更新
这种方式允许应用程序灵活快速地响应需求变化而无需额外资源消耗:
```c
uint32_t new_duty_cycle = ... ; // 新期望值
ESP_ERROR_CHECK(
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, new_duty_cycle));
ESP_ERROR_CHECK(
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
```
##### 方法二:启用硬件渐层模式
当追求更细腻自然的变化过程时可以选择这种方法,它会按照预设的速度逐步达到最终的目标水平:
```c
ledc_fade_func_install(0); // 启用淡入/淡出服务函数
ESP_ERROR_CHECK(
ledc_set_fade_with_time(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, target_value, duration_us));
ESP_ERROR_CHECK(
ledc_fade_start(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_FADE_WAIT_DONE));
```
阅读全文