手把手教你使用步进电机(步进电机详解)

说明:趁着上班摸鱼的时间,写一篇关于步进电机的操作指南,嘿嘿嘿。“手把手”系列已经写到第三篇了,前两篇的反响都很不错,承蒙各位厚爱!这一篇也将沿用前两篇的写作风格,目的是为了帮助初入硬件大门的同学,以最短的时间学会如何使用步进电机。

注:有啥问题,欢迎大伙儿留言讨论!私聊我也行啊!有时间一定回信息!废话不多说,开始吧!


什么是步进电机?它的使用场景有哪些?

     步进电机的通俗理解

        步进电机可以理解为:是一个按照固定步幅运动的“小型机器”,而所谓“步进,步进”不就是步步逼进嘛!。它与普通电机不同点在于,普通电机可以持续旋转,而步进电机按照特定的步数或者角度来移动。它每次只能移动一定的距离或者旋转一定的角度,运动更像是按照固定的步伐一步一步地走。这种特性让步进电机在需要精确控制位置和速度的场景中非常有用,比如打印机、机器人、数控机床等。

     适用场景(哪些项目可以用到?)

        步进电机有以下的三个特点:其一是精准定位,步进电机能够准确控制位置,适用于需要精确控制位置和速度的应用。其二是固定步进,它能按照固定步幅移动,使其在需要确定性移动的应用中很有用。低速高扭矩:步进电机在低速和高扭矩方面表现出色,这让它们在需要大力矩但不需要高速旋转的场景中很有用。

        故而根据以上的三个特性,可以用到那些项目里呢?我举几个我曾接触使用到步进电机的项目吧!同学们可以发挥自己的想象力哈哈哈...

        ① 智能家居项目里的窗帘动力来源

        ② 智能锁项目里的开关控制器的动力来源

        ③ 图书馆取书机器人的机械臂关节处的动力来源

     步进电机的常见种类

              实验室常见的步进电机:28BYJ48五线四相步进电机

                

                如图所示,常见的实验室“28BYJ48五线四相步进电机”模块就长这样,看见那两个驱动板了没?就是一个蓝色一个绿色的那个,这种驱动板选一个使用就行。对此同学们或许会有两个疑问!其一是步进电机为什么需要驱动板?其二是步进电机所谓“五线四相”是啥意思?

        问题一:步进电机为什么需要驱动板?

        答:步进电机的控制需要按照特定的顺序激活线圈,以产生旋转。驱动板充当了控制器的角色,它能提供正确的电流和顺序来激活步进电机的各个线圈,使得它按照预期的方式运转。步进电机的操纵需要精确的电流控制和时序激活,而驱动板能提供这种控制,让步进电机按照设定的步数或角度进行精确的运动。用通俗的语言解释一下就是,步进电机是个没有“脑子”的机器,需要芯片(ULN2003)把单片机发送过来的电信息,转化为步进电机能够“处理”的脉冲信号,并作出相应处理。

        问题二:“五线四相”是啥意思?

        答:五线四相指的是它的线数和相数。在这个28BYJ48步进电机中,有五根线用于连接,四相则表示它具有四组线圈,每个线圈都能独立控制。现在咱们看不懂没关系,一会儿原理讲解再来详细解释。

              工业中常见的步进电机(只做了解,不做介绍)

 1、在汽车中,步进电机广泛应用于控制汽车的各种机械部件,如发动机阀门、制动系统、电动窗、天窗等。

2、还想了解更多就自己去探索吧骚年(手动狗头),给你留一个美好的网站

美好的网站

步进电机应该如何使用?(使用51芯片和stm32控制步进电机)

我想通过上边的介绍,同学们已然初步了解步进电机的特性和外形,那么具体如何通过单片机操作呢?(这里我将以一个32的控制28BYJ48步进电机工程项目为例,告诉大家如何操作并给出个人的理解,帮助大家从实操上理解步进电机)

工程代码链接:28BYJ48控制工程代码​​​​​​​

代码:

main函数

int main(void)
{
	vu8 key = 0;
	uint8_t time = 0;
	delay_init(); //延时函数初始化
	LED_Init();	  //初始化与LED连接的硬件接口
	BEEP_Init();  //初始化蜂鸣器端口
	KEY_Init();	  //初始化与按键连接的硬件接口
	Step_Motor_GPIO_Init();
	
	LED0 = 0;
	BEEP = 0;
	
	while (1)
	{
		key = KEY_Scan(0); //得到键值
		if (key)
		{
			switch (key)
			{
				case WKUP_PRES: // 翻转LED1,电机正转半圈
					LED1 = !LED1;
					/*
						功能:转1/64圈
						步距角5.625 360/5.625=64 减速比1/64
						故64*64个脉冲转一圈
						n 圈数
						direction 方向 1正转 非1反转
						delay delay时长ms >= 2
					*/
					motor_circle(64, 1, 2);
					break;
				case KEY1_PRES: // 翻转LED1,电机正转1圈
					LED1 = !LED1;
					motor_circle(8, 1, 2);
					break;
				case KEY0_PRES: // 翻转LED1,电机反转1圈
					LED1 = !LED1;
					motor_circle(8, 0, 2);
					break;
			}
		}		
		time++;
		if(time % 100 == 0){
			LED0 = !LED0;
		}	
		delay_ms(10);
	}
}

motor_circle方法:

/*
	功能:转1/64圈
	步距角5.625 360/5.625=64 减速比1/64
	故64*64个脉冲转一圈
	n 圈数
	direction 方向 1正转 非1反转
	delay delay时长ms >= 2
*/
void motor_circle(int n, int direction, int delay)
{
    int i, j;
    for(i = 0; i < n * 8; i++){
		for(j = 0; j < 4; j++){
			if(1 == direction){
				SetMotor(0x00);
				SetMotor(forward[j]);
			}
			else{
				SetMotor(0x00);
				SetMotor(reverse[j]);
            }
			
			delay_ms(delay > 2 ? delay : 2);
		}
    }
}

配置代码: 

u8 forward[4] = {0x03,0x06,0x0c,0x09}; // 正转
u8 reverse[4]= {0x03,0x09,0x0c,0x06}; // 反转

//引脚初始化
void Step_Motor_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1;
    GPIO_Init(GPIOF, &GPIO_InitStructure);
}

//引脚映射
void SetMotor(unsigned char InputData)
{
	if(InputData == 0x03)
	{
		GPIO_SetBits(GPIOF,GPIO_Pin_1);
		GPIO_SetBits(GPIOF,GPIO_Pin_2);
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		GPIO_ResetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x06)
	{
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		GPIO_SetBits(GPIOF,GPIO_Pin_2);
		GPIO_SetBits(GPIOF,GPIO_Pin_3);
		GPIO_ResetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x09)
	{
		GPIO_SetBits(GPIOF,GPIO_Pin_1);
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		GPIO_SetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x0c)
	{	
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		GPIO_SetBits(GPIOF,GPIO_Pin_3);
		GPIO_SetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x00)
	{
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		GPIO_ResetBits(GPIOF,GPIO_Pin_4);
	}
}

 代码说明:

首先,要说明一下,对于前两个代码块而言,我不做过多的解释,想必同学们可以看懂的。而配置文件才是我要讲的重点!

同学们第一个疑惑应该是:0x03(0011)、0x06(0110)、0x0c(1100)、0x09(1001)到底是什么玩意?先看个图(咱写字丑,已经尽力写好了,将就看!)

盲生!有没有发现华点?我来解释一下(这里看不懂就先缓缓,起码要知道我们的代码写的是双相激励步进法,一会可以好好研究一下原理),这里的“0x03”等这些是16进制的计算机语言,我们通过GPIO_ResetBits把引脚电位拉低,GPIO_SetBits把引脚电位拉高,来表示。当我们循环往复遍历那个正/反转数组64*64次后,实现旋转360°

接线(注意abcd是驱动板上的引脚口)

步进电机的运行原理?

懵不懵?没接触过的同学我建议,你先实操一下哈哈哈!接下来才是本文精华(小声逼逼一句,我抄别人的),大家一定要认真看啊,我会原文基础上,辅助我的理解,帮助你学习。希望各位同学看完,能有“索达斯涅”的感叹哈哈哈!

以下原理来自于:原理


概念:步进电机又称为脉冲电机,基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。一般单片机通过软件来控制步进电机, 以更好地挖掘出了电机的潜力。在不超载的情况下电机的转速和停止位置只取决于脉冲信号的频率和数量; 并且步进电机的脉冲与步进旋转的角度成正比,脉冲的频率与步进的转速成正比,所以可以很好的从源头控制信号的输出; 且步进电机只有周期性的误差,使得在速度、位置等控制领域用步进电机来控制变的非常的简单。拆解图如下:

工作原理 

通常步进电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。磁场会带动转子旋转一定的角度, 使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转步距角。 每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。 改变绕组通电的顺序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。步进电机横截图:

双极性步进电机驱动原理分析(28BYJ48就是双极性的): 

单相激励步进:可以理解为每次通电产生磁性的相只有一个,要么A相,要么B相

步进顺序如下。在第一步中:将A相通电,根据电磁铁原理,产生磁性,并且因异性相吸,所以磁场将转子固定在第一步的位置; 第二步:当A相关闭,B相通电时,转子会旋转90°; 第三步:B相关闭、A相通电,但极性与第1步相反,这促使转子再次旋转90°。 在第四步中:A相关闭、B相通电,极性与第2步相反。重复该顺序促使转子按90°的步距角顺时针旋转。

双相激励步进:在转换时,一次只能换相一次

更常用的步进电机驱动法,与单相激励不同的是,单相通电后被固定在了与定子正对着的绕组极性, 但是双相同时激励时,转子却被固定在两个绕阻的极性中间;此时通电顺序就变成了AB相同时通电即可。

“合并”激励步进大法:

在双相激励的过程中,也可以在装换相位时加一个关闭相位的状态而产生走半步的现象,这将步进电机的整个步距角一分为二, 例如,一个90°的步进电机将每半步移动45°,具体见下图。

步进顺序:

  1. A相通电,B相不通电

  2. A、B相全部通电,且电流相同,产生相同磁性

  3. B相通电,A断电

  4. B相通电,A相通电,且电流相等,产生相同磁性

  5. A相通电,B断电

  6. A、B相全部通电,且电流相同,产生相同磁性

  7. B相通电,A断电

  8. B相通电,A相通电,且电流相等,产生相同磁性

       

术语汇总: 

  • 相数:产生不同对极N、S磁场的激磁线圈对数,也可以理解为步进电机中线圈的组数,其中两相步进电机步距角为1.8°, 三相的步进电机步距角为1.5°,相数越多的步进电机,其步距角就越小。

  • 拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例, 有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。

  • 步距角:一个脉冲信号所对应的电机转动的角度,可以简单理解为一个脉冲信号驱动的角度,电机上都有写,一般42步进电机的步距角为1.8°

  • 定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机械误差造成的)。

  • 静转矩:电机在额定静态电压作用下,电机不作旋转运动时,电机转轴的锁定力矩。此力矩是衡量电机体积的标准,与驱动电压及驱动电源等无关。

  • 步距角精度:步进电机转动一个步距角度的理论值与实际值的误差。用百分比表示:误差/步距角*100%。

  • 失步:电机运转时运转的步数,不等于理论上的步数。也可以叫做丢步,一般都是因负载太大或者是频率过快。

  • 失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误差,采用细分驱动是不能解决的。

  • 最大空载起动频率:在不加负载的情况下,能够直接起动的最大频率。

  • 最大空载的运行频率:电机不带负载的最高转速频率。

  • 运行转矩特性:电机的动态力矩取决于电机运行时的平均电流(而非静态电流),平均电流越大,电机输出力矩越大,即电机的频率特性越硬。

  • 电机正反转控制:通过改变通电顺序而改变电机的正反转。

科普:常见的电机还有那些?

曾经我使用过直流无刷电机控制过无人机;编码电机做过平衡车;直流电机(普通电机)做过无线充电小车的动力系统等等。对此我不再罗列,等有机会,再跟大伙聊聊!

猜你喜欢

转载自blog.csdn.net/Uncoverlove/article/details/135425277