11

无垠的广袤 · 6月2日

【Mini-F5375-OB开发板评测】步进电机的驱动和控制

【Mini-F5375-OB开发板评测】步进电机的驱动和控制

本文介绍了灵动 Mini-F5375-OB 开发板实现 28BYJ-48 步进电机驱动,以及旋转角度、旋转速度的精确控制的项目设计。

项目介绍

  • 灵动 Mini-F5375-OB 开发板结合 ULN2003 步进电机驱动板实现 28BYJ-48 步进电机的转动;
  • 通过 4 相 8 拍调节,实现步数与旋转角度的转换,进而精确控制步进电机的旋转角度和速度(相位切换延时)。

28BYJ-48 步进电机

28byj-48_show.jpg

参数

参数名称参数值说明
型号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_module_show.jpg

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结合了单拍和双拍的特点,每八步完成一个循环,步距角更小,运行更平稳。

八拍驱动模式控制顺序表

48_sequence_table.jpg

参数说明

  • 步距角:28BYJ-48 电机的步距角为 5.625°/步;
  • 细分:通常使用 8 细分,实际步距角为 0.703125°/步(5.625 / 8);
  • 总步数:电机完成一圈(360°)所需的步数为 512 步(360 / 0.703125).
考虑到步进电机齿轮设计公差等因素,单圈步数需根据实际情况调整。

硬件连接

MM32F5375ULN2003驱动板28BYJ-48 步进电机
PA0IN1红 (A+)
PA1IN2蓝 (A-)
PA2IN3粉 (B+)
PA3IN4黄 (B-)
5VVCC电机电源正极
GNDGND电机电源负极

工程创建

复制官方 Demo 例程 GPIO_LED_Toggle ,并保存于同一文件夹,以便后续库文件的调用;

工程路径:LibSamples_MM32F5370_V0.10.3\Samples\LibSamples\GPIO\GPIO_StepMotor .

流程图

flowchart_step_motor_run.jpg

工程代码

主要包括步进电机驱动函数、头文件、主函数三部分。

步进电机驱动函数

#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 秒

step_motor_run.gif

总结

本文介绍了灵动 Mini-F5375-OB 开发板实现 28BYJ-48 步进电机驱动和旋转角度和旋转速度的精确控制,为 MM32F5 系列单片机的应用和快速开发提供了参考。

推荐阅读
关注数
936
内容数
32
搭载安谋科技自研“星辰”STAR-MC1处理器,基于Armv8-M架构,专为电机控制、数字能源等实时控制应用打造
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息