51单片机控制步进电机Protues仿真设计

news2024/11/26 19:50:39

一、概述

1.1步进电机简介

步进电机(Stepper Motor)是一种将电信号转换为机械运动的电动机,是一种专用于精密控制的电机。一般步进电机运行稳定,并且精度较高,因此常用于精密仪器、自动化设备、机器人等需要高精度的设备中。

步进电机主要通过磁铁驱动的方式进行运转,其转动运动为角度控制,以步进的方式转动。在电机内部包括旋转部件磁铁,静止部件包括线圈和复位传感器。电流驱动导致磁铁缓慢吸引线圈。当磁场达到一定强度时,导致磁铁向电磁线圈对应位置移动,当线圈电流消失时,磁铁停在了前一步骤中确定的位置上。因此,添加电流时可通过控制线圈电流的快速变化以控制电机的旋转角度和方向。

步进电机的优势主要体现在其精度、稳定性、可靠性和成本上。步进电机通常按步距分为1.8度,0.9度,0.72度,0.36度等。因此,步进电机旋转的步距能够精确到亚分辨率,使其在要求精细控制的领域中得到应用,例如电子制造、自动化和航空等。

步进电机的应用范围非常广泛。在印刷机械、木工机床、机器人和计算机外围设备等设备上广泛使用。 在办公自动化设备,数字复印机,数码照相机,激光打印机,医疗器械,自动售货机等国内广泛应用。而在外部硬盘驱动器,CD-ROM、DVD-ROM驱动器,扫描仪等数码设备中用作载架用途。

总的来说,步进电机的运转控制方便精确,同时静音、低振动、低热量和低能耗等等都是步进电机的优势。随着步进电机的进一步发展, 传感器技术的不断提高和设计改进,步进电机的技术水平也将随之提高。同时,随着工业自动化的发展趋势,步进电机在日常生活中的应用将会越来越广泛。

1.2 设计要求

如下图所示物料搬运机电装置,位置1---位置8,各位置之间间隔为5mm,步进电机结合机械传动机构的脉冲当量为2.5微米/脉冲,物料本身的厚度为2mm。从初始位置到第一个物料的初始高度为150mm,x轴方向的距离为100mm,y轴方向的距离为80mm。

装置采用步进驱动器+步进电机进行驱动,将位置1—位置4的物料,搬运到位置8(叠起来)。控制精度要求属于中等无特殊要求。

 

二、硬件设计方案

本设计采用STC89C52单片机为系统控制器单元,利用LED灯指示物体搬运状态,通过驱动器ULN2003驱动步进电机执行相应动作整个硬件部分主要由单片机最小系统、步进电机驱动器步进电机、键盘模块、LED指示模块构成。硬件框图如下图2-1所示。

三、软件设计

3.1步进电机控制方法

51单片机通过IO口控制ULN2003驱动器来驱动步进电机实现相应动作。通过改变步进电机的通电顺序,可以改变它的运动方向。步进电机正转时的通电顺序为A-AB-B-BC-C-CD-D-DA,反转时的通电顺序为A-AB-B-BC-C-CD-D-DA。此外,通过改变步进电机的通电脉冲的频率,可以达到调速的目的。

3.2 必要数据计算

步进电机结合机械传动机构的脉冲当量为 2.5 微米/脉冲,这意味着每接收到一个脉冲,步进电机将运动2.5微米的距离则。已知每个物件之间间隔 5mm=5000μm,则每个物件之间需要 5000/2.5=2000个脉冲。已知物料本身的厚度为 2mm,从初始位置到第一个物料的初始高度为150mm,x 轴方向的距离为 100mm,y 轴方向的距离为 80mm。则从初始位置到物件一x 轴需要 100000/2.5=40000 个脉冲,y 轴需要 80000/2.5=32000 个脉冲,z 轴需要(150000-2000)/2.5*5=57200个脉冲。物件 2mm 高度需 2000/2.5=800个脉冲。

3.3 编程思路

按下启动按钮,机械臂会依次将 1、2、3、4 位置的物件搬运到 8 号,例如搬运 1 号时,机械臂移动到 1 号上方,到位后下行,到位后打开电磁铁,吸附物件,上行,然后移动到8号位置上方,断开电磁铁,释放物件回到初始状态,之后的物件以同样方式搬运。

步进驱动器的的脉冲信号通过for 循环来实现。机械臂是否到位由for 循环当前值判断,若循环值加到预设值或减到 0 则表示到位,则将当前步动作结束,进行下步动作。

3.3 系统软件流程图

本设计主要采用Keil软件编写与调试程序,程序语言采取易读性和移植性更高的C语言编写。系统运行流程图如下图所示。

要实现以上功能要求,系统的软件程序框图如下图4-1所示。首先进行系统初始化,系统初始化包括外部中断初始化配置、以及LED指示灯状态初始化。然后判断启动按键是否按下,若按下则进入主程序循环,否则等待启动按键按下。主程序循环系统中主要是X、Y、Z三轴步进电机顺序执行搬运每一个物料时对应的动作。利用for循环实现步进电机给定脉冲转动,通过改变步进电机的通电顺序,改变它的运动方向。步进电机正转时的通电顺序为A-AB-B-BC-C-CD-D-DA,反转时的通电顺序为A-AB-B-BC-C-CD-D-DA。此外,通过改变步进电机的通电脉冲的频率,可以达到调速的目的。每一次把物料搬到位置八后,都需要执行复位动作,回到初始位置,再进行下一个物料的搬运。四个物料搬运完,程序执行到这里就完成一次,以下列出整体软件设计的流程图,如下图所示:

四、仿真结果

按下启动按钮,开始搬运1号物料,此时白灯亮起,如下图所示    

1号物料搬运完后,开始搬运2号物料,此时绿灯亮起,如下图所示。

2号物料搬运完后,开始搬运3号物料,此时蓝灯灯亮起,如下图所示。

3号物料搬运完后,开始搬运4号物料,此时黄灯灯亮起,如下图5-5所示。

 五、部分程序说明

void axis_for(long axis_f)  //沿X轴正方向前进给定脉冲
{
	unsigned char i=0;
	for(i=0;i<axis_f;i++)
	{
		P0=stepper[i%8];
		delay_var(var);
	}
}
void axis_neg(long axis_n)  //沿x轴负方向前进给定脉冲
{
	 unsigned char i=0;
	 for(i=axis_n;i>0;i--)
	 {
		 P0=stepper[i%8];
		 delay_var(var);
	 }
}

上述两个子函数为X轴步进电机运行程序,输入脉冲数为长整型,对应X轴步进驱动器所需要的脉冲, for 循环对应给定脉冲的生成,例如 x 轴对应脉冲输出,需要改变通电数组索引值,每生成一个脉冲数组索引值需要加1,数组索引值加到8后,表示步进电机完成一圈转动,索引值从零继续开始,依次循环往复,Y、Z轴步进电机运行程序与X轴类似。

void HandMaterials(void)
{
	//搬运第一个物料 
	led_w = 1;led_b = 0;led_g = 0;led_y = 0; //白灯亮
	MotorAccOrDec(40000,32000,57200); //从初始位置前往第一个物料位置取物料
	MotorAccOrDec(2000,6000,0); //从第一个物料位置前往第八个物料位置卸物料
	MotorAccOrDec(-42000,-38000,-57200); //从第八个物料位置回到初始位置
	
	//搬运第二个物料
	led_w = 0;led_b = 0;led_g = 1;led_y = 0;//蓝灯亮
	MotorAccOrDec(42000,32000,57200); //从初始位置前往第二个物料位置取物料
	MotorAccOrDec(0,6000,-800); //从第二个物料位置前往第八个物料位置卸物料
	MotorAccOrDec(-42000,-38000,-56400); //从第八个物料位置回到初始位置
	
	//搬运第三个物料
	led_w = 0;led_b = 1;led_g = 0;led_y = 0;//绿灯亮
	MotorAccOrDec(40000,34000,57200); //从初始位置前往第三个物料位置
	MotorAccOrDec(2000,4000,-1600); //从第二个物料位置前往第八个物料位置卸物料
	MotorAccOrDec(-42000,-38000,-55600); //从第八个物料位置回到初始位置
	
	//搬运第四个物料
	led_w = 0;led_b = 0;led_g = 0;led_y = 1;//黄灯亮
	MotorAccOrDec(42000,34000,57200); //从初始位置前往第四个物料位置
	MotorAccOrDec(0,4000,-2400); //从第四个物料位置前往第八个物料位置卸物料
	MotorAccOrDec(-42000,-38000,-54800); //从第八个物料位置回到初始位置
}

上述子函数为物料1~4搬运程序,搬运一个物料到8号位置,需要3步。以搬运1号物料物料为例,第一步,通过控制X、Y、Z轴步进电机,控制机械臂从初始位置前往1号物料位置取物料;第二步,在1号物料位置处,继续控制X、Y、Z轴步进电机从1号物料位置前往8号物料位置卸物料;第三步,从8号物料位置处控制X、Y、Z轴步进电机回到初始位置,以便继续搬运下一个物料。

需要注意一点的是,从初始位置前往物料位置取物料,从物料位置前往8号物料位置卸物料,再到从8号物料位置回到初始位置,X、Y、Z轴步进电机执行的脉冲数有所不同,仍以搬运第一个物料为例,MotorAccOrDec(40000,32000,57200)表示,X轴步进电机转动40000个脉冲,Y轴步进电机转动32000个脉冲,X轴步进电机转动572000个脉冲,到达1号物料位置,而从原始位置到达2号物料位置X轴步进电机转动42000个脉冲,Y轴步进电机转动32000个脉冲,X轴步进电机转动572000个脉冲,其它情况与此类似。

后记

本设计是以实物为参照做的Protues仿真,物料搬运脉冲数据较大,在仿真中耗时很长,若要完整得到仿真结果,请自行修改对应脉冲数。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上传漏洞,后端黑白名单绕过(21)

文件上传常见的验证&#xff0c;&#xff1a;后缀名&#xff0c;类型&#xff0c;文件头等 后缀名指的是白名单和黑名单 文件类型&#xff1a;mime的信息 文件头&#xff1a;内容头信息 我们一个一个来说&#xff0c;这个后缀名&#xff0c;大部分可以上传的对方都不允许脚…

【TCP/IP】TCP报文段的首部格式和流量控制

TCP 报文段的首部格式 TCP 虽然是面向字节流的&#xff0c;但其传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分&#xff0c;而 TCP 的全部功能的体现在它首部中各字段的作用。 因此&#xff0c;弄清 TCP 报文段首部各字段的作用对掌握 TCP 的工作原理非常重要。…

排查jacoco覆盖率对反射问题的影响

最近业务部门开始推行&#xff0c;在全部后台应用中自动开启覆盖率测试。然而&#xff0c;不久后就有业务测试的同学反馈出现问题。 问题的现象如下&#xff1a; 我们的业务通过 HTTP 调用腾讯OSS的服务&#xff0c;结果得到了以上的报错信息。测试同学验证后发现&#xff0c…

【RocketMQ】004-Spring Boot 集成 RocketMQ

【RocketMQ】004-Spring Boot 集成 RocketMQ 文章目录 【RocketMQ】004-Spring Boot 集成 RocketMQ一、基本使用1、创建 Spring Boot 项目&#xff0c;并引入 RocketMQ 依赖2、application.yml 配置3、消息生产者4、消息消费者5、消息调用接口6、启动 RocketMQ7、启动项目&…

(1)LED

LED正负极&#xff1a;大红旗——负极&#xff0c;小红旗——正极 如何看原理图电阻/电容值&#xff1a; eg&#xff1a; 102 10 2 10 * 10 ^ 2 1000 473 47 3 47 * 10 ^ 3 47000单片机使用TTL电频&#xff1a;高电平&#xff08;逻辑1&#xff09;5V 低电平&#xff…

C语言操作符详解(上)

C语言操作符详解&#xff08;上&#xff09; 前言1. 算术操作符2. 移位操作符2.1 左移操作符(<<)2.2 右移操作符&#xff08;>>&#xff09; 3. 位操作符3.1 按位与&#xff08;&&#xff09;3.2 按位或&#xff08;|&#xff09;3.4 按位异或&#xff08;^&am…

(4)定时器

51单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成 作用&#xff1a; 用于计时系统替代长时间Delay&#xff0c;提高运行效率和速度任务切换 STC89C52定时器资源&#xff1a; 定时器个数&#xff1a;3个&#xff08;T0,T1,T2&#xf…

【MySQL】MySQL 运算符

目录 一、运算符简述 二、运算符使用 1.算术运算符 1.1 加法运算符 1.2 减法运算符 1.3 乘法与除法运算符 1.4 求模&#xff08;求余&#xff09;运算符 2.比较运算符 2.1 等号运算符 2.2 安全等于运算符 2.3 不等于运算符 2.4 空运算符 2.5 非空运算符 2.6 最小…

深度剖析Mybatis-plus Injector SQL注入器

背景 在项目中需要同时操作Sql Server 以及 MySQL 数据库&#xff0c;可能平时直接使用 BaseMapper中提供的方法习惯 了&#xff0c;不用的话总感觉影响开发效率&#xff0c;但是两个数据库的SQL语法稍微有点差别&#xff0c;有些暴露的方法并不能直接使用&#xff0c;所以便想…

WebSocket的那些事(3-STOMP实操篇)

目录 一、序言二、STOMP详解1、STOMP简单介绍2、STOMP协议内容3、使用STOMP的好处 三、代码示例1、Maven依赖2、开启WebSocket消息代理3、控制器4、前端页面greeting.html 四、测试1、连接服务端2、发送消息 五、STOMP消息传播流程六、结语 一、序言 上节中我们在 WebSocket的…

(11)LCD1602液晶显示屏

LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff0c;还可以有8个自定义字符&#xff0c;自带芯片扫描 显示容量&#xff1a;162个字符&#xff0c;每个字符…

【C++】STL六大组件简介

STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 1.STL的版本介绍 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本&#xff…

Unity里面CG和HLSL在写法上的一些区别

大家好&#xff0c;我是阿赵。这里继续讲URP相关的内容。 这次想讲的是CG和HLSL在写法上的一些区别。 一、为什么开始用HLSL 首先&#xff0c;基本上大家都知道的事情再说一遍。 三种Shader编程语言&#xff1a; 1、基于OpenGL的OpenGL Shading Language&#xff0c;缩写GLSL…

接口测试中postman环境和用例集

postman的环境使用 postman里有环境的设置&#xff0c;就是我们常说的用变量代替一个固定的值&#xff0c;这样做的好处是可以切换不同的域名、不同的环境变量&#xff0c;不同的线上线下账户等等场景。下面就看下怎么用吧。 创建一个Environment postman有一个envrionment&am…

Java是如何实现双亲委托机制的

Java 是一种面向对象的编程语言&#xff0c;它有一套独特的类加载机制。其中&#xff0c;双亲委托加载机制是 Java 类加载机制中的一个重要概念。本文将介绍 Java 的双亲委托加载机制是如何实现的&#xff0c;并解释其作用和优点。 Java 类加载机制 在 Java 中&#xff0c;类的…

瀑布流组件陷入商品重复怪圈?我是如何用心一解的!

目录 背景 瀑布流组件 什么是瀑布流组件 如何实现一个瀑布流组件 商品重复的原因 解决方案 方法一&#xff08;复杂&#xff0c;不推荐&#xff09;&#xff1a;标记位大法 方法二&#xff08;优雅&#xff0c;推荐&#xff09;&#xff1a;Promise 队列 大法 总结 背…

解决新思路#报错:ping: www.baidu.com: 未知的名称或服务--照着步骤来还是ping不通的可能原因

最近由ubantu转为centos7,配置hadoop&#xff0c;配置静态ip的过程中一直ping不通。之前配置ubantu的也是&#xff0c;终于这次在重启虚拟机和主机后发现了原因。 中途尝试过: 1.三次以上命令行反复操作 2.图形界面设置 3.看是否主机的网络适配器的网关与设置的IP地址产生冲突…

JavaScript实现计算100之间能被5整除的数的代码

以下为实现计算100之间能被5整除的数的程序代码和运行截图 目录 前言 一、计算100之间能被5整除的数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题…

2023最新100道渗透测试面试题(附答案)

眨眼间2023年快过去一半了&#xff0c;不知道大家有没有找到心仪的工作呀&#xff0c;今天我给大家整理了100道渗透测试面试题给大家&#xff0c;需要答案的话可以在评论区给我留言哦~ 第一套渗透面试题 什么是渗透测试&#xff1f;它的目的是什么&#xff1f; 渗透测试的五个…

DirectX12 简单入门(一)

在很久以前写过关于DirectX9的一些应用&#xff0c;直到现在DirectX12已经普及了。写完几个DirectX12测试代码之后&#xff0c;写一篇DirectX12简单入门介绍一下基本概念&#xff0c;以及环境搭建和编程过程。 编程环境 与DirectX9不同&#xff0c;在DirectX12开发中微软将需…