步进电机驱动控制总结(一)

本文驱动的步进电机为较基础的28BYJ-48步进电机,属于入门级水平,比较好驱动,价格也是相对便宜的,因而步进电机驱动开篇就讲他了!

1、步进电机驱动原理

之前在网上看到一张动态图是很详细的描述了步进电机的驱动过程,没有了解专业知识的同学也可以看下,比较通俗易懂!
在这里插入图片描述
下面我们回到我们本文用到的步进电机,常见的电机还有驱动如下所示,当然ULN2003驱动模块也有贴片式的,不过都差不多,是没有很大区别的,可以自行选用!
在这里插入图片描述

步进电机的驱动方式可以描述为:

  • 1、步进电机是一种将电脉冲转化为角位移的执行机构。
  • 2、当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。
  • 3、通过控制脉冲个来控制角位移量,从而达到准确定位的目的。
  • 4、同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

具体到本文讲的电机,28BYJ48步进电机而言:

  • 1、驱动电压为DC5V—DC12V。
  • 2、每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
  • 3、当通电状态的改变完成一个循环时,转子转过一个齿距。
  • 4、四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A)双(双相绕组通电)四拍(AB-BC-CD-DA-AB),八拍(A-AB-B-BC-C-CD-D-DA-A)。

2、步进电机驱动设计

上面讲的拍数对应的关系图如下所示:
在这里插入图片描述

这里我把他列成表格:

四项八拍

绕组
A00111110
B10001111
C11100011
D11111000

对应示意图
在这里插入图片描述

四项单四拍

绕组
A0111
B1011
C1101
D1110

对应示意图
在这里插入图片描述
四项双四拍

绕组
A0011
B1000
C1110
D0110

关于转动角度的计算:

28BYJ-48步进电动机的步距角是5.625度,也就是说每个脉冲转5.625度而360/5.625=64,所以64个脉冲转一圈,但这是指电机的转子而转子到输出轴有齿轮减速器连接,减速比为64,那么转子转64圈,输出轴转一圈,所以结论是64*64=4096个脉冲才能使输出轴转一圈。

对应四拍和八拍的计算角度来看:

8拍计算公式 = 64角度/360/8,4拍计算公式 = 64角度/360/4。

3、步进电机驱动编写

首先我们在cubemx中初始化对应的引脚:
在这里插入图片描述
根据上面讲到的时序编写四项单四拍对应的程序
在这里插入图片描述
根据上面讲到的时序编写四项双四拍对应的程序
在这里插入图片描述
根据上面讲到的时序编写四项八拍对应的程序
在这里插入图片描述

注意上面四项四拍和八拍额区别就在于精度,其他其实没什么区别的,当然肯定是八拍的精度高于四拍的:

当然要想做的更好一点,我们还可以准备下方向速度函数,改变方向其实就是把前面说的四拍八拍这个顺序倒着来一下就行了,也是很方便的!

在这里插入图片描述
这里我还加入了角度函数,也是在上面讲到的角度计算方法里面讲的!
在这里插入图片描述
主函数中调用情况如下,这里我们让他正转180度,在反转180度
在这里插入图片描述

4、源码

uln2003.c

/*
 * uln2003.c
 *
 *  Created on: Feb 17, 2022
 *      Author: LX
 */


#include "uln2003.h"


void motor_stop()
{
	MA_LOW;MB_LOW;MC_LOW;MD_LOW;
}

void motor_start_sig4(uint8_t motor,uint8_t speed) //四项单四拍
{
	switch(motor)
	{ // 0111 1011 1101 1110,这个过程逆向为反向
	case 0:
		MA_LOW;MB_HIGH;MC_HIGH;MD_HIGH;
		break;
	case 1:
		MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
		break;
	case 2:
		MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
		break;
	case 3:
		MA_HIGH;MB_HIGH;MC_HIGH;MD_LOW;
		break;
	}
	HAL_Delay(speed);
	motor_stop();
}

void motor_start_dou4(uint8_t motor,uint8_t speed) //四项双四拍
{
	switch(motor)
	{ // 0110 0011 1011 1100,这个过程逆向为反向
	case 0:
		MA_LOW;MB_HIGH;MC_HIGH;MD_LOW;
		break;
	case 1:
		MA_LOW;MB_LOW;MC_HIGH;MD_HIGH;
		break;
	case 2:
		MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
		break;
	case 3:
		MA_HIGH;MB_HIGH;MC_LOW;MD_LOW;
		break;
	}
	HAL_Delay(speed);
	motor_stop();
}

void motor_start_eig(uint8_t motor,uint8_t speed) //四项八拍
{
	switch(motor)
	{ // 0111 0011 1011 1001 1101 1100 1110 0110,这个过程逆向为反向
	case 0:
		MA_LOW;MB_HIGH;MC_HIGH;MD_HIGH;
		break;
	case 1:
		MA_LOW;MB_LOW;MC_HIGH;MD_HIGH;
		break;
	case 2:
		MA_HIGH;MB_LOW;MC_HIGH;MD_HIGH;
		break;
	case 3:
		MA_HIGH;MB_LOW;MC_HIGH;MD_LOW;
		break;
	case 4:
		MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
		break;
	case 5:
		MA_HIGH;MB_HIGH;MC_LOW;MD_HIGH;
		break;
	case 6:
		MA_HIGH;MB_HIGH;MC_HIGH;MD_LOW;
		break;
	case 7:
		MA_LOW;MB_HIGH;MC_HIGH;MD_LOW;
		break;
	}
	HAL_Delay(speed);
	motor_stop();
}

uint8_t motor;
void motor_uln2003(uint8_t dir,uint8_t speed)
{
	for(uint8_t i = 0;i<8;i++)
	{
		if(dir == 1)
		{
			motor++;
			if(motor > 7)motor = 0;
		}
		else
		{
			if(motor == 0)motor = 8;
			motor--;
		}
		motor_start_eig(motor,speed);
	}
}

void motor_angle(uint8_t dir,uint16_t angle,uint8_t speed)
{
	static uint8_t flag = 1;
	if(flag == 1)
	{
		for(uint16_t num;num<64*angle/45;num++)
		{
			motor_uln2003(dir,speed);
			flag = 0;
		}
		flag = 1;
	}
}

uln2003.h

#ifndef ULN2003_H_
#define ULN2003_H_

#include "main.h"


#define MA_HIGH HAL_GPIO_WritePin(INTC_GPIO_Port, INTC_Pin, GPIO_PIN_SET)
#define MA_LOW HAL_GPIO_WritePin(INTC_GPIO_Port, INTC_Pin, GPIO_PIN_RESET)

#define MB_HIGH HAL_GPIO_WritePin(INTD_GPIO_Port, INTD_Pin, GPIO_PIN_SET)
#define MB_LOW HAL_GPIO_WritePin(INTD_GPIO_Port, INTD_Pin, GPIO_PIN_RESET)

#define MC_HIGH HAL_GPIO_WritePin(INTB_GPIO_Port, INTB_Pin, GPIO_PIN_SET)
#define MC_LOW HAL_GPIO_WritePin(INTB_GPIO_Port, INTB_Pin, GPIO_PIN_RESET)

#define MD_HIGH HAL_GPIO_WritePin(INTA_GPIO_Port, INTA_Pin, GPIO_PIN_SET)
#define MD_LOW HAL_GPIO_WritePin(INTA_GPIO_Port, INTA_Pin, GPIO_PIN_RESET)


void motor_stop();
void motor_start_sig4(uint8_t motor,uint8_t speed);
void motor_start_dou4(uint8_t motor,uint8_t speed);
void motor_start_eig(uint8_t motor,uint8_t speed);
void motor_uln2003(uint8_t dir,uint8_t speed);
void motor_angle(uint8_t dir,uint16_t angle,uint8_t speed);

#endif /* ULN2003_H_ */
  • 13
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
"成绩" " 课程设计报告 题 目 单片机控制步进电机 课 程 名 称 单片机原理及接口技术 院 部 名 称 专 业 自动化 班 级 M10自动化 学 生 姓 名 学 号 课程设计地点 课程设计学时 指 导 教 师 高峰 金陵科技学院教务处制 【注:根据课程设计大纲第四项具体要求撰写课程设计报告】 目 录 1设计任务和要求 3 2设计思路 4 3系统硬件设计 5 3.1 硬件电路的工作原理 5 3.2步进电机模块 5 3.3控制模块 6 3.4主要元件介绍: 6 4软件编程 11 5 调试过程与结果 20 5.1正转结果显示: 20 5.1.1正转加速: 21 5.1.2正转减速: 21 6 总结与体会 24 7 参考资料 26 8 附录 26 1设计任务和要求 单片机课程设计是考察学生利用所学过的专业知识,进行综合的电机控制系统设计并 最终完成实际系统连接,能够使学生对电气与自动化的专业知识进行综合应用,培养学 生的创新能力和团队协作能力,提高学生的动手实践能力。最终形成一篇符合规范的设 计说明书,并参加综合实践答辩,为后期的毕业设计做好准备。 本次设计考核的能力主要有: 1) 专业知识应用能力,包括电路分析、电子技术、单片机、检测技术、电气控制、电 机与拖动、微特电机及其驱动、计算机高级语言、计算机辅助设计、计算机办公 软件等课程,还包括本专业的拓展性课程如变频器、组态技术、现场总线技术、 伺服电机等课程。 2) 项目设计与运作能力,团队协作能力,技术文档撰写能力,PPT汇报与口头表达能力 。 3) 电气与自动化系统的设计与实际应用能力。 要求完成的工作量包括: 1) 现场仿真演示效果。 2) 学生结合课题进行PPT演讲与答辩。 3) 学生上交课题要求的各类设计技术文档。 2设计思路 电路基本理论: 步进电机是一种将电脉冲转变为角位移的执行机构,通俗一点讲:当步进驱动器接收 到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。可通过控制脉 冲数来控制角位移量,从而达到准确的定位目的。通过对步进电机的软件设计和硬件设 计包括步进电机的结构、原理及应用,根据原理和硬件的设计利用c语言编写程序,经过 反复运行和调试,实现单片机步进电机控制步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,它 的的驱动电路根据控制信号工作,控制信号由单片机产生。当步进驱动器接收到一个脉 冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,控制换相顺序,即通电 控制脉冲必须严格按照一定顺序分别控制各相的通断。通过控制脉冲个数即可以控制角 位移量,从而达到准确定位的目的。控制步进电机的转向,即给定工作方式正序换相通 电,步进电机正转,若按反序通电换相,则电机就反转。控制步进电机的速度,即给步 进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步,两个脉冲的间隔 越短,步进电机就转得越快。同时通过控制脉冲频率来控制电机转动的速度和加速度, 从而达到调速的目的。 基于单片机和proteus的步进电机控制电路的基本组成如图所示: 根据设计要求,采用的方案如下。硬件部分实现电机转动,包括控制开关模块;电机 转动模块。软件部分实现对步进电机控制功能,主要设计思想通过控制控制程序的 开关来控制电机的转动。电源驱动89C51单片机,在89C51中装载程序,通过开关按键来 输入信号,89C51向驱动电路提供信号使步进电机动作。 3系统硬件设计 3.1 硬件电路的工作原理 总电路图 通过对开关k1 k2 k3的开关,来实现对步进电机的正反转和停止,通过k4 k5来进行加减速,并且有相应的LED灯的显示。 3.2步进电机模块 功能:单片机输出的程序通过转换器和电机驱动器给步进电机一个脉冲信号,使步进 电机实现正转与反转。 3.3控制模块 功能:通过控制台实现对单片机程序的开与关 3.4主要元件介绍: 3.4.1步进电机步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电 机就转动一个角度,因此非常适合于单片机控制步进电机区别于其他控制电机的最大 特点是:它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定 ,而电机的转速由脉冲信号频率决定。 步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB),步进电机又称为脉冲 电机,是工业过程控制和仪表中一种能够快速启动,反转和制动的执行元件,其功用是 将电脉冲转换为相应的角位移或直线位移,由于开环下就能实现精确定位的特点,使其 在工业控制领域获得了广泛应用。步进电机的运转是由电脉冲信号控制的,其角位移量 或线位移量与脉冲数成正比,每个一个脉冲,步进电机就转动一个角度(不距角)或前 进、倒退一步。步进电机旋转的角度由输入的电
### 回答1: FPGA(Field-Programmable Gate Array)是一种可编程逻辑器件,而步进电机是一种特殊的电动机,可以将电脉冲信号转换为精确的机械运动。因此,FPGA步进电机控制程序是一种通过FPGA实现步进电机驱动控制的程序。 FPGA步进电机控制程序首先需要通过FPGA的I/O口与步进电机控制电路连接。控制电路中通常包括电流放大器、细分驱动器和功率输出模块。程序通过FPGA的输出引脚向电流放大器发送驱动信号,控制步进电机运动。 在编写FPGA步进电机控制程序时,需要考虑以下几个方面:步进电机类型、工作模式、步进角度和频率、加减速度以及方向控制。 首先,根据使用的步进电机类型选择适当的驱动方式,如全步进或半步进。然后,通过FPGA的输出引脚控制细分驱动器,以控制步进电机的运动精度。 其次,确定步进角度和频率,即每个步进电机的转动角度和速度。可以通过FPGA的时钟信号和计数器来实现。通过控制时钟频率和计数器的计数值,可以调整步进电机的转动速度。 此外,加减速度是指步进电机启动和停止时的速度变化。可以使用FPGA的计时器、状态机或PWM信号来实现加减速控制,以确保步进电机平稳运行。 最后,方向控制是决定步进电机转动方向的关键。可以使用FPGA的输出引脚来设置方向引脚,通过控制引脚状态来改变步进电机的转动方向。 综合以上几点,FPGA步进电机控制程序需要编写适当的逻辑代码,使FPGA能够正确地生成驱动信号,控制步进电机的运动角度、速度和方向。编写这样的程序需要具备FPGA编程技巧和步进电机控制知识的基础。 总的来说,FPGA步进电机控制程序是一种能够将FPGA的可编程性与步进电机的精确运动转换相结合的程序,具有广泛的应用领域,如机器人、自动化设备等。通过合理编写该程序,可以实现精确的步进电机控制和运动控制。 ### 回答2: FPGA步进电机控制程序是一种用于控制步进电机运动的程序,其基于FPGA(可编程逻辑门阵列)技术实现。 步进电机是一种电动机,可以将电信号转化为机械运动,其控制通常需要精确的脉冲时序和方向控制。FPGA步进电机控制程序通过FPGA的可编程逻辑单元实现对步进电机的准确控制。 首先,FPGA步进电机控制程序需要定义步进电机控制参数,包括脉冲频率、方向等。然后,通过数据通路将控制参数传输给FPGA的逻辑门阵列。 接下来,FPGA步进电机控制程序需要根据指定的频率和方向生成相应的脉冲序列。这通常通过计数器模块实现,计数器模块根据定义的频率计数并产生不同的输出电平。脉冲序列的频率决定了步进电机的运动速度,方向则通过定义的方向控制信号控制。 最后,FPGA步进电机控制程序将生成的脉冲序列通过输出引脚发送给步进电机驱动器。步进电机驱动器根据接收到的脉冲信号驱动步进电机旋转。根据脉冲序列的频率和方向变化,步进电机可以实现不同速度和方向的运动。 总结来说,FPGA步进电机控制程序通过FPGA技术实现对步进电机的精确控制。通过定义控制参数、生成脉冲序列并通过输出引脚发送给步进电机驱动器,实现步进电机的运动控制。这种控制程序通常可以灵活应用于各种步进电机控制场景,如机械臂、自动化设备等。 ### 回答3: FPGA步进电机控制程序是一种用于控制步进电机的程序,通过FPGA芯片实现电机的运动控制步进电机是一种将电脉冲转换为机械运动的设备,常用于精确位置控制的应用领域。通过FPGA步进电机控制程序,可以实现对步进电机的速度、方向以及位置等参数的控制。 首先,在FPGA步进电机控制程序中,需要定义步进电机控制接口。这包括设置电机驱动器的输入引脚,以及与FPGA芯片通信的输出引脚。通过这些引脚,可以将控制信号发送给步进电机驱动器,从而控制电机的运动。 其次,需要编写逻辑代码来生成控制脉冲。通过控制脉冲的产生,可以控制步进电机的每一步运动。在FPGA步进电机控制程序中,可以采用计数器来计算控制脉冲的频率和数量。根据需要,还可以编写代码来控制脉冲的方向,实现正转或反转运动。 此外,还需要在FPGA步进电机控制程序中实现限位检测功能。通过检测限位开关的状态,可以停止步进电机的运动,避免超出设定的运动范围。限位检测的实现可以通过读取输入引脚状态,或者设置中断来实现。 通过以上步骤,FPGA步进电机控制程序可以实现对步进电机控制。通过调整控制参数和代码逻辑,还可以实现不同的运动功能和应用要求。在实际应用中,可以根据具体需求进行优化和改进,提高步进电机的运动精度和控制性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃成蹊2.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值