在前一篇文章中我基于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