完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ESP32 pwm电机应用 (idf开发)
前言 最近准备做esp32的麦克纳姆轮小车,板子都画好了,正在软件调试,突然发现io口选错了,esp32上的flash引脚是不能使用的。 但是多亏了esp32的GPIO-Matrix功能,对pcb-layout是非常的友好,随便改改就好了。 ESP32 MCPWM的架构 可以看出有两个mcpwm单元,一个单元可以产生3对pwm,而且还可以驱动无刷电机(esp32还是非常强大的啊!!) 但是在网上copy代码的时候发现基本都是使用其中一个单元的一对pwm,我使用的是a4950四个轮子要使用到4对pwm。 于是对网上的代码上更改发现有点坑,有看了esp-idf编程指南才发现错误。 意思就是每个定时器对应一个mcpwm单元里的一对输出,一个定时器0只可以对应mcpwm0的pwm0a,pwm0b和mcpwm1的pwm0a,pwm0b,对应在网上copy来的代码上改的时候就直接全使用一个定时器了,还以为都一样。 下面给出我的代码,因为我用麦克纳姆轮还要四个 #include “freertos/FreeRTOS.h” #include “freertos/task.h” #include “esp_attr.h” #include “driver/mcpwm.h” #include “soc/mcpwm_reg.h” #include “soc/mcpwm_struct.h” void mcpwm_example_servo_control(void *arg) { //initialize MCPWM gpio mcpwm_example_gpio_initialize(); //Configure MCPWM module mcpwm_config_t pwm_config; pwm_config.frequency = 10000; pwm_config.cmpr_a = 30.0; pwm_config.cmpr_b = 60.0; pwm_config.counter_mode = MCPWM_UP_COUNTER; pwm_config.duty_mode = MCPWM_DUTY_MODE_0; //initialize MCPWM module mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_1, &pwm_config); mcpwm_init(MCPWM_UNIT_1,MCPWM_TIMER_0, &pwm_config); mcpwm_init(MCPWM_UNIT_1,MCPWM_TIMER_1, &pwm_config); vTaskDelete(NULL); //删除任务自身 } void app_main(void) { xTaskCreate(mcpwm_example_servo_control, “mcpwm_example_servo_control”, 4096, NULL, 5, NULL); } 因为我使用的不需要调频率,只用改变占空比就行,继续看esp-idf编程指南,调用相应的api即可。 有什么问题,可以评论讨论一下,新手一个各位大佬多指教!! |
|
|
|
只有小组成员才能发言,加入小组>>
2388 浏览 0 评论
8918 浏览 4 评论
36496 浏览 19 评论
4986 浏览 0 评论
24319 浏览 34 评论
1379浏览 2评论
1633浏览 1评论
2022浏览 1评论
1445浏览 0评论
392浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 11:58 , Processed in 1.424349 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号