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即可。
有什么问题,可以评论讨论一下,新手一个各位大佬多指教!!