完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ESP32 上 LEDC 主要用于 LED 灯的调光电路. LED 控制电路的驱动电平有两种, 高电平驱动或者低电平驱动. 通过控制输出 PWM 的占空比, 可达到调光的目的. 今天分享的是如何解决低电平驱动的 LED 控制电路中, 由于初始化 LEDC 导致灯闪烁的问题. 灯闪烁的原因是初始化 LEDC 瞬间, 通道会出现 54us 的低电平.
首先看 LEDC 硬件的组成: 1. LEDC timer: 对 LEDC 时钟计数, 计数的范围是 0 ~ (2^n -1) (其中 n 通过 duty_resolution 寄存器来进行配置). 这也是 LEDC 输出信号的周期. 2. LEDC Channel: 将通道的 duty 值与 timer 中的计数值进行比较, 然后根据比较结果输出 PWM 信号. 在初始化 LEDC 时, 对 LEDC Timer 和 LEDC Channel 均需要进行配置. 但需要注意的是 LEDC Channel 配置, 需要等待 LEDC Timer 计数值溢出之后才会生效. 正常的初始化流程是先初始化 LEDC Timer, 接着初始化 LEDC Channel. e.g.:Code: Select all ledc_timer_config_t ledc_timer = { .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 5000, .speed_mode = LEDC_HIGH_SPEED_MODE, .timer_num = LEDC_TIMER_0, }; ledc_channel_config_t ledc_channel = { .channel = LEDC_HS_CH0_CHANNEL, .duty = 0x1 << (LEDC_TIMER_13_BIT), .gpio_num = GPIO_NUM_18, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0, }; ledc_timer_config(&ledc_timer); ledc_channel_config(&ledc_channel); 在低电平驱动的 LEDC 控制电路中, 需要初始化 LEDC 的整个过程 LEDC 的输出信号一直是高电平. 但是实际上初始化时, 即使 LEDC Channel 的输出占空比是 100%, LEDC 仍会输出 54us 的低脉冲, 如下图: 上面提到过, LEDC Chennel 的配置需要等到 LEDC Timer 计数值溢出之后才会更新. 在配置完 LEDC Chennel 的时候, LEDC Timer 计数值并未溢出, 这个时候 LEDC 输出的将是 IDLE 电平(默认是 0), 等到 LEDC Timer 计数值溢出后, 再根据 LEDC Channel 的配置来输出电平. 解决方案是将 LEDC IDLE 电平配置成高电平. ledc_timer_config_t ledc_timer = { .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 5000, .speed_mode = LEDC_HIGH_SPEED_MODE, .timer_num = LEDC_TIMER_0, }; ledc_channel_config_t ledc_channel = { .channel = LEDC_HS_CH0_CHANNEL, .duty = 0x1 << (LEDC_TIMER_13_BIT), .gpio_num = GPIO_NUM_18, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0, }; ledc_timer_config(&ledc_timer); ledc_stop(LEDC_HS_MODE, LEDC_HS_CH0_CHANNEL, 1); //主要的作用是将 IDLE 电平配置成高电平. ledc_channel_config(&ledc_channel); ledc_update_duty(LEDC_HS_MODE, LEDC_HS_CH0_CHANNEL); 此时输出波形是: 这时候 LEDC 初始化时不会再出现低脉冲了. |
|
相关推荐
1个回答
|
|
ESP32 LEDC(LED控制)初始化时GPIO输出短暂低电平的原因可能与以下几个方面有关:
1. **硬件设计**:LEDC通道在初始化时,硬件设计上可能存在一个短暂的低电平输出,以确保电路稳定和初始化过程的正确性。 2. **软件初始化过程**:在软件初始化LEDC通道时,可能需要设置一些初始状态,这可能包括将GPIO设置为低电平,以确保在PWM信号开始之前,LED处于关闭状态。 3. **LEDC定时器和通道配置**:LEDC定时器在初始化时会设置一个周期,这个周期内可能包含一个短暂的低电平脉冲,用于同步或者初始化LED的状态。 4. **占空比设置**:在LEDC初始化过程中,占空比(duty)可能被设置为0,这意味着在PWM信号的第一个周期内,输出信号为低电平,直到占空比被调整到所需的值。 5. **电源和信号完整性问题**:在某些情况下,电源波动或信号完整性问题可能导致GPIO在初始化时出现短暂的低电平。 6. **GPIO配置**:ESP32的GPIO在初始化时可能需要从一种状态转换到另一种状态,这个转换过程可能涉及到短暂的低电平。 为了解决这个问题,可以采取以下措施: - **延时处理**:在LEDC初始化之后,添加一个小的延时,以确保LEDC通道稳定并开始输出预期的PWM信号。 - **调整初始化代码**:检查并调整LEDC初始化代码,确保在初始化过程中GPIO的状态转换是平滑的,避免出现不必要的低电平脉冲。 - **硬件检查**:检查电路设计,确保没有硬件问题导致GPIO在初始化时输出低电平。 - **固件更新**:如果问题与ESP32的固件有关,可以尝试更新固件到最新版本,看是否解决了这个问题。 - **使用外部电路**:在某些情况下,使用外部电路(如MOSFET或晶体管)来控制LED的开关,可以避免由于GPIO初始化导致的闪烁问题。 通过这些方法,可以减少或消除由于LEDC初始化导致的LED闪烁问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
408浏览 6评论
340浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
324浏览 5评论
326浏览 4评论
311浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-18 06:18 , Processed in 0.745115 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号