ESP32 pwm电机应用 (idf开发)

ESP32 pwm电机应用 (idf开发)

前言

最近准备做esp32的麦克纳姆轮小车,板子都画好了,正在软件调试,突然发现io口选错了,esp32上的flash引脚是不能使用的。

但是多亏了esp32的GPIO-Matrix功能,对pcb-layout是非常的友好,随便改改就好了。

image-20210530195345548

ESP32 MCPWM的架构

MCPWM Block Diagram

Example of Brushless DC Motor Control with MCPWM

MCPWM Overview

可以看出有两个mcpwm单元,一个单元可以产生3对pwm,而且还可以驱动无刷电机(esp32还是非常强大的啊!!)

但是在网上copy代码的时候发现基本都是使用其中一个单元的一对pwm,我使用的是a4950四个轮子要使用到4对pwm。

于是对网上的代码上更改发现有点坑,有看了esp-idf编程指南才发现错误。

image-20210530200037272

意思就是每个定时器对应一个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即可。

image-20210530201655098

image-20210530201646967

有什么问题,可以评论讨论一下,新手一个各位大佬多指教!!

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要控制步进电机,需要使用一个驱动器和一个控制器。可以使用ESP32PWM输出来控制步进电机的速度和方向。 以下是使用Micropython控制步进电机的步骤: 1.连接步进电机 将步进电机的四根线连接到驱动器的输出端口。通常情况下,步进电机的线被标记为A,A-,B和B-。将它们连接到驱动器的输出端口,确保将它们正确连接。 2.编写代码 使用Micropython编写代码来控制步进电机。以下是一个简单的示例代码: ```python from machine import Pin, PWM import time # 设置引脚 p1 = Pin(27, Pin.OUT) p2 = Pin(26, Pin.OUT) p3 = Pin(25, Pin.OUT) p4 = Pin(33, Pin.OUT) # 设置PWM引脚 pwm = PWM(Pin(12)) # 设置步进电机序列 seq = [ [1,0,0,0], # 1010 [1,1,0,0], # 1110 [0,1,0,0], # 0110 [0,1,1,0], # 0101 [0,0,1,0], # 0011 [0,0,1,1], # 0010 [0,0,0,1], # 0001 [1,0,0,1] # 1001 ] # 设置速度和方向 speed = 500 direction = 1 # 步进电机控制函数 def step_motor(step): p1.value(seq[step][0]) p2.value(seq[step][1]) p3.value(seq[step][2]) p4.value(seq[step][3]) # 步进电机运行函数 def run_motor(): for i in range(8): step_motor(i) time.sleep_ms(speed) # 设置PWMpwm.duty(50) # 运行步进电机 while True: run_motor() ``` 3.运行代码 将代码上传到ESP32并运行。步进电机应该开始转动,速度和方向取决于代码中设置的值。 需要注意的是,步进电机的控制方式和驱动器的设置可能因具体型号而异。因此,在编写代码之前,需要确保已经阅读了步进电机和驱动器的说明书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒饭多加个蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值