esp32 idf 热敏打印机步进电机驱动

在前一篇文章中我基于JX-2R-01热敏打印机的数据手册和相关参考资料对热敏打印机头进行了初步的了解,具体可以参考上篇文章:基于JX-2R-01 的热敏打印机芯学习

下面就首先针对步进电机的驱动进行简要讲解及代码分享。

驱动原理

在这里插入图片描述
首先从表格中可以看出其输入电压位3.5~8.5V。相电流为0.357A,驱动方式为1-2相驱动。网上的解释1-2相驱动是1/2步进细分,我个人的理解是A、B、 A ‾ \overline{A} A B ‾ \overline{B} B,每步只改变一个的状态,具体可以从下图电机的激励时序图以及后文的电机的激励时序数组看出。

下图时电机的激励时序图:
在这里插入图片描述
从激励时序图中可以看出,电机每八步为一个周期。每走四步,电机走动一点行的距离。

电路方案

在这里插入图片描述
这里我们电机驱动采用的是HR8833芯片,它有两路H桥驱动,每个桥包含整流电路和限流电路,可以驱动两路刷式直流电机,或者一个双极步进电机。输出可以并用,最大提供3A驱动输出。宽电压供电,2.7V-15V。内部关断功能包含过流保护,短路保护,欠压锁定保护和过温保护,并提供一个错误输出管脚。具体的引脚定义如下图:
在这里插入图片描述
该芯片还能够通过改变检流电阻,从而控制输出电流:
在这里插入图片描述
电流过大,步进电机运行时的噪声越大;电流过小,则步进电机转不动。我这里暂时接的是0欧电阻,电机可以转动,但噪声较大。根据相电流为0.357A计算,电阻大概应该可以接500m欧的,电机噪音可能会有所改善但我暂时还没测试。

代码编写

主控芯片采用ESP32S3

  • 首先定义电机的激励时序数组
const uint8_t motorTable[][4] =
{
    {1, 0, 0, 0},
    {1, 0, 0, 1},
    {0, 0, 0, 1},
    {0, 0, 1, 1},
    {0, 0, 1, 0},
    {0, 1, 1, 0},
    {0, 1, 0, 0},
    {1, 1, 0, 0}
};
  • 对相关gpio引脚进行初始化
void Moto_Gpio_Init(void)
{
    //zero-initialize the config structure.
    gpio_config_t io_conf = {};
    //disable interrupt
    io_conf.intr_type = GPIO_INTR_DISABLE;
    //set as output mode
    io_conf.mode = GPIO_MODE_OUTPUT;
    //bit mask of the pins that you want to set,e.g.GPIO18/19
    io_conf.pin_bit_mask = GPIO_MOTO_PIN_SEL;
    //disable pull-down mode
    io_conf.pull_down_en = 0;
    //disable pull-up mode
    io_conf.pull_up_en = 0;
    //configure GPIO with the given settings
    gpio_config(&io_conf);

    gpio_set_level(GPIO_AP, 0);
    gpio_set_level(GPIO_BP, 0);
    gpio_set_level(GPIO_AM, 0);
    gpio_set_level(GPIO_BM, 0);
    gpio_set_level(GPIO_MOTO_ENABLE, 0);
}
  • 定义设置电机状态和电机停止函数
void Motor_Run(uint8_t motor)
{
    gpio_set_level(GPIO_AP, motorTable[motor][0]);
    gpio_set_level(GPIO_BP, motorTable[motor][1]);
    gpio_set_level(GPIO_AM, motorTable[motor][2]);
    gpio_set_level(GPIO_BM, motorTable[motor][3]);
}

void Motor_Stop(void)
{
    gpio_set_level(GPIO_AP, 0);
    gpio_set_level(GPIO_AM, 0);
    gpio_set_level(GPIO_BP, 0);
    gpio_set_level(GPIO_BM, 0);
}
  • 定义电机转动函数,其中times为电机运行的步数。
void Motor_Run_Circle(uint8_t times)
{
    static uint8_t current_Motor = 0;
    for(int i = 0; i < times; i++)
    {
        Motor_Run(current_Motor);
        vTaskDelay(20 / portTICK_PERIOD_MS);
        current_Motor++;
        if(current_Motor == 8)
        {
            current_Motor = 0;
        }
    }
    Motor_Stop();
}

详细代码可以参考我的GitHub:thermal_printer

Bilibili:通信电子小白
微信公众号:
在这里插入图片描述

下面是我创建的QQ群,欢迎大家进群交流呀!
QQ群:752236617

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于ESP32-IDF驱动两相四线步进电机,您可以使用ESP-IDF的GPIO控制来实现。 步进电机通常有四个线,分别是两个相的A相和B相。ESP32的GPIO引脚可以用来控制步进电机的不同线路。以下是一个简单的示例代码: ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #define A_PHASE_PIN GPIO_NUM_12 #define B_PHASE_PIN GPIO_NUM_13 #define A_ENABLE_PIN GPIO_NUM_14 #define B_ENABLE_PIN GPIO_NUM_15 void step_forward() { gpio_set_level(A_ENABLE_PIN, 1); gpio_set_level(B_ENABLE_PIN, 1); // 步进电机的正转顺序 gpio_set_level(A_PHASE_PIN, 1); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(A_PHASE_PIN, 0); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(B_PHASE_PIN, 1); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(B_PHASE_PIN, 0); gpio_set_level(A_ENABLE_PIN, 0); gpio_set_level(B_ENABLE_PIN, 0); } void step_backward() { gpio_set_level(A_ENABLE_PIN, 1); gpio_set_level(B_ENABLE_PIN, 1); // 步进电机的反转顺序 gpio_set_level(B_PHASE_PIN, 1); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(B_PHASE_PIN, 0); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(A_PHASE_PIN, 1); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(A_PHASE_PIN, 0); gpio_set_level(A_ENABLE_PIN, 0); gpio_set_level(B_ENABLE_PIN, 0); } void app_main() { gpio_pad_select_gpio(A_PHASE_PIN); gpio_pad_select_gpio(B_PHASE_PIN); gpio_pad_select_gpio(A_ENABLE_PIN); gpio_pad_select_gpio(B_ENABLE_PIN); gpio_set_direction(A_PHASE_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(B_PHASE_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(A_ENABLE_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(B_ENABLE_PIN, GPIO_MODE_OUTPUT); while (1) { step_forward(); vTaskDelay(1000 / portTICK_PERIOD_MS); step_backward(); vTaskDelay(1000 / portTICK_PERIOD_MS); } } ``` 上述代码中,通过设置不同的GPIO引脚的电平状态,可以控制步进电机的转动方向和使能状态。具体的转动顺序可以根据步进电机的型号和要求进行调整。 注意,该示例代码仅供参考,您需要根据实际情况进行相应的修改和适配。 希望这对您有所帮助!如有任何问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zxfeng~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值