找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1007

积分

0

好友

145

主题
发表于 5 天前 | 查看: 22| 回复: 0

步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。

基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步,因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。

img

主要分类

目前市面上主要的步进电机,按照绕组来分,共有二相、三相和五相等系列。最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好。

该种电机的基本步距角为1.8°/步,配上半步驱动器后,步距角减少为0.9°,配上细分驱动器后其步距角可细分达256倍(0.007°/微步)。由于摩擦力和制造精度等原因,实际控制精度略低。同一步进电机可配不同细分的驱动器以改变精度和效果。

目前主流的步进电机一般是42步进电机和57步进电机。42步进电机的“42”,是指其外形长宽各为42mm。高一点的电机力矩通常更大,基本步距角一般为1.8°。42步进电机在3D打印以及各类DIY项目(如写字机)中应用非常广泛。

42步进电机:
img

57步进电机:
img

步进电机结构拆解

实际上,步进电机内部的结构主要是由许多小齿交错而成的,每交错一次步距角就可以缩小一倍。步距角越小则步进电机越精密,旋转一圈所需要的脉冲也就越多。目前市面上不管是42电机、57电机,亦或是86电机,其基本步距角通常都是1.8°。

混合式42步进电机爆炸视图:
img

42步进电机实物拆卸图:
img

42步进电机内部齿图:
img
img

TB6600驱动器简介

步进电机驱动器种类繁多,例如28步进电机驱动器ULN2003、A4988以及我们将要使用的TB6600等。

img

驱动器的内部原理较为复杂,不过我们无需深入理解其所有细节也能熟练使用。我们只需要了解每个端口的功能和正确接法即可。

TB6600驱动器手册地址:http://u3v.cn/63i7HW

img

电路接线图示

端口功能讲解

如下图所示,TB6600驱动器一共有12个端口以及一排拨码开关。

12个端口分别为:电机使能信号(EN+/EN-)、方向控制信号(DIR+/DIR-)、步进脉冲信号(PUL+/PUL-)、电机两相(A+,A-,B+,B-)以及驱动电源(V+,V-)。

拨码开关中,SW1-SW3用于设置细分,SW4-SW6用于设置电流。

img

(1)电机使能信号(EN+)(EN-):全名Enable。此信号相当于一个软件开关,用于控制电机是否具备旋转能力。当电机失能时,无论进行何种操作,电机均无反应。

(2)方向控制信号(DIR+)(DIR-):全名Direction。通过控制此端口的高低电平,可以改变电机的旋转方向。利用此特性,可以实现按键控制方向等功能。

(3)步进脉冲信号(PUL+)(PUL-):全名Pulse。这是控制步进电机运动的核心信号。驱动器内部的芯片会根据接收到的脉冲信号,转换成驱动电机旋转的相序信号。可以说,没有脉冲信号,电机就无法步进。

(4)电机两相(A+,A-,B+,B-):目前市面上主流的步进电机多为两相,因其在保证精度的同时更具成本优势。

(5)拨码开关:SW1-SW3用于设置细分倍数(如1,2,4,8,16等),SW4-SW6用于设定输出电流。例如,对于额定电流1.5A的42电机,若采用8细分,则需将SW4、SW5设为ON,SW6设为OFF。

img

拨码开关的具体设置方法在驱动器背面均有明确标示,按图操作即可。

步进电机接线示意图

一个完整的控制系统需要控制器、驱动器和被控对象。本例中,控制器选用STM32F407单片机(其他型号如STM32F103亦可),驱动器为TB6600,被控对象为42步进电机。

img

驱动器接线

驱动器接线方式主要有两种:共阴极接法和共阳极接法。两者的本质相同,都是通过制造电位差来触发信号。

  • 共阴极接法:将EN-、DIR-、PUL-全部连接到控制器的GND(低电平),其他信号端(EN+, DIR+, PUL+)由控制器给出高电平信号。
  • 共阳极接法:将EN-、DIR-、PUL-全部连接到控制器的VCC(高电平),其他信号端由控制器给出低电平信号。

本例采用共阴极接法。

img

请注意:驱动器输入电压范围为直流9-42V,推荐使用24V。务必不要将电源V+和V-接反,否则会损坏驱动器。

对于步进电机的四根线(A+, A-, B+, B-),无需纠结具体相序。电机内部结构决定了相序接错仅会影响初始旋转方向。有一个简单的判别方法:任取两根线短接,然后手动旋转电机转轴,如果感觉到明显阻力,则说明这两根线属于同一相,可暂定为A相或B相。

img

控制器接线

控制器(STM32)的接线非常灵活,取决于程序中GPIO引脚的配置。例如,若设置PB3为脉冲输出引脚,PB4为方向控制引脚,则只需将驱动器的PUL+接至PB3,DIR+接至PB4即可。关于STM32的GPIO配置与操作,是嵌入式开发的基础,需要熟练掌握。

代码编写思路

下面进入关键的代码实现部分。核心思想是通过GPIO引脚模拟产生PWM脉冲序列,从而控制步进电机的步进与速度。

主要代码示例如下:

Motor.c

#include "Motor.h"
#include "Delay.h"
#include "led.h"

#define TotalPulses 1600    // 设置步进电机为8细分,旋转一圈需要1600个脉冲

// Motor 初始化配置
void Motor_Init(void)
{
    // 开启GPIOB时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

    // 配置GPIO引脚参数
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   // 输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  // 推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; // 使用PB3(脉冲)和PB4(方向)
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;  // 下拉
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 设置引脚初始状态为高电平
    GPIO_SetBits(GPIOB, GPIO_Pin_3 | GPIO_Pin_4);
}

// 电机启动与控制函数
void Motor_Start(void)
{
    LED_BLUE_OFF;   // 蓝色指示灯状态变化,用于视觉提示
    LED_RED_ON;
    Delay_ms(1000);

    // 设定方向(例如正向)
    GPIO_SetBits(GPIOB, GPIO_Pin_4);

    // 模拟PWM输出,控制电机旋转
    for(int i = 0; i < TotalPulses * 2; i++)
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_3); // 产生一个脉冲高电平
        Delay_us(500); // 延时决定了脉冲宽度和频率,从而控制速度
        GPIO_ResetBits(GPIOB, GPIO_Pin_3); // 拉低,完成一个脉冲
        Delay_us(500);
    }

    LED_BLUE_ON;
    LED_RED_OFF;
    Delay_ms(1000);

    // 改变方向(反向)
    GPIO_ResetBits(GPIOB, GPIO_Pin_4);

    for(int i = 0; i < TotalPulses * 2; i++)
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_3);
        Delay_us(500);
        GPIO_ResetBits(GPIOB, GPIO_Pin_3);
        Delay_us(500);
    }
}

这段代码完成了GPIO的初始化,并定义了一个电机控制函数。在函数中,通过循环和延时来模拟产生固定频率的方波(即脉冲),Delay_us(500)的参数决定了脉冲周期,从而控制了电机的转速。这种通过延时生成波形的方法,其原理与在前端开发中使用JavaScript定时器控制动画帧率有相似之处,都是对时序的精确管理。

Main.c

#include "stm32f4xx.h"
#include "led.h"
#include "Delay.h"
#include "usart.h"
#include "Motor.h"

// 程序入口主函数
int main(void)
{
    USART1_Init(115200); // 初始化串口,可用于调试
    Led_Init();          // LED初始化
    Motor_Init();        // 电机控制引脚初始化

    while (1)            // 主循环
    {
        Motor_Start();   // 执行电机控制
    }
}

实操效果展示

img

通过修改Motor_Start()函数中Delay_us()的参数,可以轻松调节电机的转速。本质上这是改变了模拟PWM波的频率,频率越高,电机旋转越快。

本文介绍了基于STM32标准库和TB6600驱动器控制42步进电机的完整流程,从原理、接线到代码实现。掌握这种方法后,可以进一步扩展到更复杂的运动控制场景,例如结合嵌入式系统中的定时器实现精准PWM输出,以解放CPU资源并提高控制精度。




上一篇:支付必备!支付技术前后端全面实战 闪聚支付实战项目 Spring Cloud Alibaba + 微信/支付宝支付 全解大厂项目技术架构
下一篇:Edge浏览器官方推荐:高效自定义主页插件iTab新标签页深度解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 22:11 , Processed in 0.108128 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表