【Mini-F5375-OB开发板评测】步进电机的驱动和控制
本文介绍了灵动 Mini-F5375-OB 开发板实现 28BYJ-48 步进电机驱动,以及旋转角度、旋转速度的精确控制的项目设计。
项目介绍
- 灵动 Mini-F5375-OB 开发板结合 ULN2003 步进电机驱动板实现 28BYJ-48 步进电机的转动;
- 通过 4 相 8 拍调节,实现步数与旋转角度的转换,进而精确控制步进电机的旋转角度和速度(相位切换延时)。
28BYJ-48 步进电机
参数
参数名称 | 参数值 | 说明 |
---|---|---|
型号 | 28BYJ-48 | 一种常见的小型步进电机,广泛用于各种 DIY 和小型项目。 |
相数 | 4相 | 电机有4个绕组,每个绕组称为一相。 |
相电阻 | 300Ω | 与线圈匝数有关,匝数越多,相电阻值越大。 |
步距角 | 5.625°/步 | 每个脉冲使电机旋转的角度。28BYJ-48 电机的步距角为 5.625°/步,但实际使用中通常通过驱动器进行细分。 |
减速比 | 1:64 | 减速装置传递动力的比例,计算公式:减速比 = 输出轴每转步数 / 输入轴每转步数。 |
细分 | 8细分 | 通过驱动器(如 ULN2003)进行细分,实际步距角为 0.703125°/步(5.625°/8)。 |
起动转矩 | ≥300 PPS·g·cm | 使停止状态的步进电机启动的频率(脉冲频率)与负载转矩之间的关系。 |
起动频率 | ≥500 PPS | 指在空载情况下能够正常启动的脉冲频率。 |
定位转矩 | ≥300 g·cm | 电机各相绕组处于开路状态时,永磁材料的磁场产生的转矩。 |
绝缘耐压 | 600 VAC/s | 电机的耐电压和绝缘性能。 |
额定电压 | 5V | 电机的额定工作电压。 |
额定电流 | 100mA/相 | 每相绕组的最大电流。 |
转速 | 300RPM(无负载) | 电机在无负载情况下的最大转速。 |
扭矩 | 34.4mN·m(无负载) | 电机在无负载情况下的最大扭矩。 |
尺寸 | 48mm x 35mm x 35mm | 电机的尺寸(长 x 宽 x 高)。 |
重量 | 30克 | 电机的重量。 |
引脚数量 | 6个 | 电机有6个引脚,其中4个用于控制,2个用于电源。 |
控制方式 | 单四拍、双四拍、八拍 | 电机可以通过不同的控制方式驱动,影响步距角和运行平稳性。 |
驱动器
28BYJ-48 步进电机通常采用 ULN2003 驱动器驱动。
ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。
ULN2003A 由 7 组达林顿晶体管阵列和相应的电阻网络以及钳位二极管网络构成,具有同时驱动 7 组负载的能力,为单片双极型大功率高速集成电路。ULN2003 一般用于小型步进电机驱动。
详见:ULN2003A Datasheet - TI . 硬石科技 .
驱动方式
驱动方式 | 通电顺序 | 说明 |
---|---|---|
单四拍 | A-B-C-D-A | 每次只有一相绕组通电,每四步完成一个循环。电能消耗小,但输出力矩小,振动大。 |
双四拍 | AB-BC-CD-DA-AB | 每次有两相绕组同时通电,每四步完成一个循环。输出力矩大,但精度低,振动大。 |
八拍 | A-AB-B-BC-C-CD-D-DA-A | 结合了单拍和双拍的特点,每八步完成一个循环,步距角更小,运行更平稳。 |
八拍驱动模式控制顺序表
参数说明
- 步距角:28BYJ-48 电机的步距角为 5.625°/步;
- 细分:通常使用 8 细分,实际步距角为 0.703125°/步(
5.625 / 8
); - 总步数:电机完成一圈(360°)所需的步数为 512 步(
360 / 0.703125
).
考虑到步进电机齿轮设计公差等因素,单圈步数需根据实际情况调整。
硬件连接
MM32F5375 | ULN2003驱动板 | 28BYJ-48 步进电机 |
---|---|---|
PA0 | IN1 | 红 (A+) |
PA1 | IN2 | 蓝 (A-) |
PA2 | IN3 | 粉 (B+) |
PA3 | IN4 | 黄 (B-) |
5V | VCC | 电机电源正极 |
GND | GND | 电机电源负极 |
工程创建
复制官方 Demo 例程 GPIO_LED_Toggle
,并保存于同一文件夹,以便后续库文件的调用;
工程路径:LibSamples_MM32F5370_V0.10.3\Samples\LibSamples\GPIO\GPIO_StepMotor
.
流程图
工程代码
主要包括步进电机驱动函数、头文件、主函数三部分。
步进电机驱动函数
#include "hal_gpio.h"
#include "platform.h"
#include <stdlib.h>
void Stepper_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
}
const uint8_t phase_table[8][4] =
{
{1, 0, 0, 0}, // A
{1, 1, 0, 0}, // A+B
{0, 1, 0, 0}, // B
{0, 1, 1, 0}, // B+C
{0, 0, 1, 0}, // C
{0, 0, 1, 1}, // C+D
{0, 0, 0, 1}, // D
{1, 0, 0, 1} // D+A
};
void Stepper_Step(int32_t steps, uint16_t delay_ms)
{
static uint8_t phase = 0;
uint8_t dir = (steps >= 0) ? 1 : 0;
uint32_t step_count = abs(steps);
uint32_t i;
for (i = 0; i < step_count; i++)
{
phase = dir ? (phase + 1) % 8 : (phase + 7) % 8;
GPIO_WriteBit(GPIOA, GPIO_Pin_0, phase_table[phase][0] ? Bit_SET : Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, phase_table[phase][1] ? Bit_SET : Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_2, phase_table[phase][2] ? Bit_SET : Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_3, phase_table[phase][3] ? Bit_SET : Bit_RESET);
PLATFORM_DelayMS(delay_ms);
}
}
void Stepper_ReleaseTorque(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
}
void Stepper_RotateAngle(float angle, int8_t speed)
{
uint16_t ROUND_VALUE = 4096;
int32_t steps = (int32_t)(ROUND_VALUE * angle / 360.0f);
float step_delay_ms;
if (speed < 0 || speed > 10)
{
Stepper_ReleaseTorque();
return;
}
if (speed == 0)
{
Stepper_ReleaseTorque();
return;
}
step_delay_ms = (10 - 1) / 9 * (10 - speed) + 1;
Stepper_Step(steps, step_delay_ms);
}
步进电机驱动头文件
#ifndef __STEP_MOTOR_H
#define __STEP_MOTOR_H
#include "platform.h"
void Stepper_GPIO_Init(void);
void Stepper_ReleaseTorque(void);
void Stepper_Step(int32_t steps, uint16_t delay_ms);
void Stepper_RotateAngle(float angle, int8_t speed);
#endif
主函数
#include "platform.h"
#include "gpio_led_toggle.h"
#include "main.h"
#include "step_motor.h"
int main(void)
{
PLATFORM_Init();
PLATFORM_PrintInfo();
while (1)
{
Stepper_GPIO_Init();
Stepper_RotateAngle(180, 10);
Stepper_ReleaseTorque();
PLATFORM_DelayMS(1000);
Stepper_RotateAngle(-180, 10);
Stepper_ReleaseTorque();
PLATFORM_DelayMS(1000);
}
}
保存代码,重新构建工程,上传固件至板端,复位运行。
效果演示
正反各旋转 180 度,之后释放扭矩(防止发热),间隔 1 秒
总结
本文介绍了灵动 Mini-F5375-OB 开发板实现 28BYJ-48 步进电机驱动和旋转角度和旋转速度的精确控制,为 MM32F5 系列单片机的应用和快速开发提供了参考。