ESP32之PWM输出
创作时间:
作者:
@小白创作中心
ESP32之PWM输出
引用
CSDN
1.
https://m.blog.csdn.net/weixin_56634270/article/details/146042024
许多设备的控制都依赖于PWM波的精确调整,例如,电机速度控制、LED亮度调节、步进电机驱动等都离不开PWM波。ESP32官方为我们提供了便捷的PWM使用方法,那么我们就以输出50%占空比的PWM波为例来了解一下如何进行PWM的输出操作。
首先,老规矩我们还是来看一下官方的实现方案是什么如何进行操作。请看根据官方的文档,文档中写明了需要通过定时器配置,通道配置,改变PWM信号三个步骤来实现PWM波形的输出。
那么我们按照官方的文档首先进行的步骤就是定时器的配置:
配置定时器:
分辨率:13bit
频率:4000Hz
速度模式:低速
定时器:Timer_0
时钟:自动时钟
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_13_BIT,
.freq_hz = 4000,
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER_0,
.clk_cfg=LEDC_AUTO_CLK
};
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
第二步我们应该进行的是通道配置之:
通道:通道0
占空比:0(后面会设置目前先设置为0)
gpio_num(引脚号):整个值具体的自己传
速度模式:低速模式
始终选择:Time0
ledc_channel_config_t ledc_channel = {
.channel = LEDC_CHANNEL_0,
.duty = 0,
.gpio_num = gpio_num,
.speed_mode = LEDC_LOW_SPEED_MODE,
.hpoint = 0,
.timer_sel = LEDC_TIMER_0
};
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
第三步我们进行改变PWM信号的配置:
根据官方的文档呢我们应该进行的操作是首先设置占空比
我们应该首先设置占空比然后再更新占空比
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, rate));
ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
然后把这玩意统一一下完整一点的代码就是:
这里的最大占空比是通过官方的2的13次方得出的分辨率为13。
typedef enum{
MIN_PWM_RATE=0,
LOW_PWM_RATE=1024, //25%
MID_PWM_RATE=4096, //50%
HIGH_PWM_RATE=8192, //75%
MAX_PWM_RATE=8192 //MAX PWM_RATE = 2 ** 13 = 8192
}PWM_RATE_T;
void PwmDev_Init(int gpio_num,PWM_RATE_T rate)
{
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_13_BIT,
.freq_hz = 4000,
.speed_mode = LEDC_LOW_SPEED_MODE,
.timer_num = LEDC_TIMER_0,
.clk_cfg=LEDC_AUTO_CLK
};
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
ledc_channel_config_t ledc_channel = {
.channel = LEDC_CHANNEL_0,
.duty = 0,
.gpio_num = gpio_num,
.speed_mode = LEDC_LOW_SPEED_MODE,
.hpoint = 0,
.timer_sel = LEDC_TIMER_0
};
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, rate));
ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
}
extern "C" void app_main(void)
{
PwmDev_Init();
while(1)
{
}
}
ok,最后的实现效果如下
热门推荐
高中化学实验改进与创新案例集
汉字"宇"的详细解释:从屋檐到宇宙的文化之旅
皇室战争中顶级符文巨人卡组策略
比光还快:超光速粒子挑战现代物理学
牛肉面的历史渊源与文化背景探究
成人自考本科之路,迈向考研的坚实阶梯
种植牙的新方法有哪些?探索新技术与优势解析
癌中之王不再无解!纳米刀技术为胰腺癌患者带来新希望
美国校园枪击案50年激增12倍,儿童受害率增4倍!
那些年的“靖哥哥”和“蓉儿”
DeepSeek算命爆火,从中医到AI,五行学说如何影响你的健康与命运?
探索五行理论:茶金木水火土各自起源与意义解析
《柳叶刀》研究:胰岛素泵降低糖尿病患者低血糖风险并提升生活质量
杭州火车站有哪些?杭州市12座主要火车站一览
行业争抢的高纯石英矿,可能在这里
玉手镯的寓意、象征及其文化背景:探索这一古老饰品的深层含义
学历的真实数据分析是什么
这种心态看似自律,但可能会让你暴饮暴食,越来越胖
周易火雷噬嗑卦详解
打呼噜是病吗?需要治疗吗?
如何选择具有投资价值的股票?这些具有投资价值的股票有哪些特征?
中国队迎战叙利亚:世界杯预选赛关键战役前瞻
黑曜石的用途
爸妈矮,孩子注定矮吗?医生:两个生长时期的干预很重要
正念冥想与催眠:异同与应用
厦门新增9家乙肝临床治愈门诊,海沧首个就在厦门长庚医院
个人工资管理如何规划预算?
被痛批的“远洋捕捞”,到底怎么治理
江苏公办二本大学排名及分数线(2025年高考参考)
二手车转让如何开票?一文详解二手车交易发票开具流程