1、步进电机及其控制步进电机及其控制【实验目的】熟悉步进电机的结构和驱动方式掌握用AT89S52来控制步进电机的方法进一步熟悉EDA实验平台【实验器材】EDA实验箱、PC机、DB25-ISP下载线、USB转换线、USB-BLASTER编程器等软件:Quatus II 、Keil uVision2、ISPlay等 【实验原理】步进电机(stepping motor)是一种以脉冲控制的转动设备,由于是以脉冲驱动,很适合以数字或微型计算机来控制,做一又把它当成是一种数字设备。1、步进电机的结构:步进电机与一般电机结构类似,除了托架、外壳之外,就是转子和定子,比较特殊的是其转子与定子上有许多细小的齿,如图
2、1所示。转子为永久磁铁,线圈绕在定子上。根据线圈的配置,步进电机可以分为2相、4相、5相等,比较常用的是2相的步进电机。其中包括两组具有中间抽头的线圈,A、com1、为一组,B、com2、为另一组。两相5线式步进电机就是将其中的com1和com2连接。2、步进电机步进角度的计算顾名思义,步进电机就是一步步走的电机,其转子与定子的齿,决定了其每步的间距。若转子上有N个齿,则其齿间距为:而步进角度为:以常用的2相式50齿步进电机为例,=360/50=7.2=7.2/(22)=1.83、步进电机的驱动:步进电机的驱动是靠定子线圈激磁后,将邻近转子上相异磁极吸引过来实现的。因此,线圈排列的顺序,以及激
3、磁信号的顺序就很重要。以2相式步进电机为例,其驱动信号有1相驱动、2相驱动和1-2相驱动三种。图4:步进电机的驱动方式:1相驱动、2相驱动和1-2相驱动。(1)、1相驱动:任何一个时间,只有一组线圈被激磁,其他线圈在休息,因此产生的力矩较小,但这种激磁方式最简单,信号依次为:1000-0100-0010-0001-1000(正转)0001-0010-0100-1000-0001(反转)有四种不同的信号呈现周期性的变化。在AT89S52中产生这种信号,以正转为例,可以先输出“0001”,经过一小段时间延迟后,让步进电机有足够的时间建立磁场及转动,再输出“0100”,延时 依次循环输出这四种信号即
4、可。(2)、2相驱动:任何一个时间,有两组线圈同时被激磁,因此,产生的力矩比1相驱动要大。其信号依次为:1100-0110-0011-1001-1100(正转)1100-1001-0011-0110-1100(反转)信号输出方式与1相驱动类似。(3)、1-2相驱动:1-2相驱动的方式又称为“半步驱动”,每个驱动信号只驱动半步。其驱动信号依次为:1001-1000-1100-0100-0110-0010-0011-0001(正转)1001-0001-0011-0010-0110-0100-1100-1000(反转)共有8种信号成周期性的变化,仔细观察可以发现其中的信号是将1相驱动和2相驱动的信号
5、混合而成的。具体应用时根据不同型号的步进电机采用不同的驱动方式,本EDA实验箱中的步进电机采用1相驱动的方式进行驱动。4、转速控制控制步进电机的运行速度,实际上是控制系统发出时钟脉冲的频率或换相的周期,即在加速的过程中,使脉冲的输出频率增加;在减速过程中,使脉冲的输出频率减小。脉冲信号的频率可以用软件延时来确定。5、步进电机的驱动电路AT89S52的输出电流很难驱动步进电机,必须另外设计驱动电路才行,在此我们将采用ULN2003(如图5)驱动步进电机。一颗ULN2003系列IC包含7个开集极式输出的反相器,而在每个输出端都有一个连接到公共端(VCC)的二极管,作为放电保护电路,每组反相器的内部
6、电路如图6.图5:ULN2003图6:内部电路【实验内容】原理图:1、根据EDA步进电机步进角度,计算出该步进电机的齿间距和齿数,填入表1;齿数齿间距步进角度 12 30152、步进电机的步进和特定角度旋转(1)将“桌面EDA实验-51部分-步进电机实验步进电机实验底层驱动”路径下 “LCD1602.sof”文件烧入FPGA中。具体步骤如下:a) 用USB转换线将 USB BLASTER 与PC机相连,USB BLASTER的另一端连接到FPGA核心板右下角J12口。如果连接正常,USB BLASTER绿灯点亮。b) 双击“桌面EDA实验-51部分-步进电机实验步进电机实验底层驱动”路径下 “
7、LCD1602.qpf”文件,启动Quartus II;c) 单击菜单栏中 ToolsProgrammer ,打开FPGA程序下载窗口;d) 单击界面右上角“Hardware Setup”,在“Currently selected Hardware”下拉列表中选择“USB-BlasterUSB-0”,激活USB-Blaster,单击“close”关闭;e) 单击“Add File”,路径选择“桌面EDA实验-51部分-步进电机实验步进电机实验底层驱动”,选中文件“LCD1602.sof”,勾选Program/Configure;f) 给EDA主板供电,单击“start”,将底板驱动程序烧录到F
8、PGA中。g) 烧录后不要断电,断电后程序会丢失,需要重新烧录。(2)利用“程序一.c”代码,创建keil工程,生成“程序一.hex”文件具体步骤如下:a) 单击“开始程序”,启动Keil uVision2;b) 单击“ProjectNew Project”,创建新工程;c) 新工程保存路径为“桌面EDA实验-51部分-步进电机实验程序一”,工程名设为“工程一”,单击“保存”;d) 在弹出的“器件选择窗口”中,选择“AtmelAT89S52”,单击“确定”;e) 右键单击窗口右边列表栏中“Source Group 1”,选择“Add File to Group Source Group 1”;
9、f) 选中“桌面EDA实验-51部分-步进电机实验程序一”路径下“程序一.c”,单击“Add”,然后单击“close”;g) 双击“程序一.c”,打开该文件。h) 单击窗口左上角“Build Target”按键,编译程序一;i) 单击窗口左上角图标,选中“output”面板,选中“Creative HEX”,单击“确定”j) 再次单击窗口左上角“Build Target”按键,将生成“程序二.Hex”文件;k) 在路径“桌面EDA实验-51部分-步进电机实验程序一”下,已经生成“程序二.Hex”文件。(3)将 程序一.hex 烧入单片机具体步骤如下:a) 用DB25-ISP下载线连接单片机IS
10、P程序下载口(EDA主板右下角J15口)和PC机并口,EDA主板右下角S8拨码开关全部拨向ON;b) 在桌面双击图标,启动ISPlay;c) 单击“检测器件”,听到“嘀嘀嘀”,表示器件检测成功;d) 单击“文件”,选择“桌面EDA实验-51部分-步进电机实验程序一”路径下“程序一.hex”,单击“打开”;e) 单击“AUTORUN!”,完成程序的下载;下载完成会听到“嘀嘀嘀”的响声。完成表2:操作步进电机状态开机静止单击按键K1顺时针每次旋转60单击按键K5逆时针每次旋转60单击按键K9顺时针每次120单击按键K13逆时针旋转两圈3、步进电机正、反、加速、减速转动控制通过按键控制步进电机的正转
11、、反转、加速、减速、停止和转动等动作。(1) 将“桌面EDA实验-51部分-步进电机实验步进电机实验底层驱动”路径下 “LCD1602.sof”文件烧入FPGA中,若上步实验后系统未重启,此步可省略。具体步骤见前。(2) 利用“程序一.c”代码,创建keil工程,生成程序一.hex文件。具体步骤见前。(3) 将“桌面EDA实验-51部分-步进电机实验程序二”路径下“程序二.hex”烧入单片机。具体步骤见前。完成表3:按键操作步进电机状态单击按键K1反向旋转单击按键K5暂停继续单击按键K9加速旋转单击按键K13减速旋转4、程序分析设计:(1) 阅读 程序一.c ,要使单击按键K9时,步进电机逆时
12、针旋转240, 应该如何修改程序?写出程序代码;#includeAT89X52.hsfr p0=0x80;sfr p1=0x90;sfr p2=0xA0;sfr p3=0xB0;sbit s1=p32;/正向步进sbit s2=p33;/反向步进sbit s3=p34;/正向旋转120sbit s4=p35;/反向旋转2圈int con=800;char data id1=0,id2=0,id3=0,id4=0;/按键标志unsigned char motorni8=0xF2,0xF8,0xF4,0xF1,0xF2,0xF8,0xF4,0xF1;/逆时针unsigned char motors
13、hun8=0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8;/顺时针unsigned char motorout8=0,0,0,0,0,0,0,0;/电机输出delay(int t)int i,j;for(i=0;it;i+)for(j=0;j10;j+);keyscan() int i,j;/按键s1:正向步进 if(s1=0) delay(1000); while(s1=0); for(i=0;i4;i+) p0=motorshuni; delay(400); /按键s2:反向步进 if(s2=0) delay(1000); while(s2=0); for(
14、i=0;i4;i+) p0=motornii; delay(400); /按键s3:正向旋转120度 if(s3=0) delay(1000); while(s3=0); for(j=0;j4;j+)/将这句改成重复4次,由于每次转动/60度,所以可以实现正向转动240度 for(i=0;i4;i+) p0=motorshuni; delay(400); /按键s4:反向旋转2圈 if(s4=0) delay(1000); while(s4=0); for(j=0;j12;j+) for(i=0;i4;i+) p0=motornii; delay(400); void main() p0=0x
15、ff; while(1) keyscan(); (2) 阅读 程序二.c ,要实现系统初始化时,步进电机顺时针旋转,怎样修改程序?写出程序代码;#includeAT89X52.hsfr p0=0x80;sfr p1=0x90;sfr p2=0xA0;sfr p3=0xB0;sbit s1=p32;/对应于按键K1 反向sbit s2=p33;/对应于按键K5 停止sbit s3=p34;/对应于按键K9 加速sbit s4=p35;/对应于按键K13 减速int con=800;char data id1=0,id2=0,id3=0,id4=0;/按键标志unsigned char motor
16、ni8=0xF2,0xF8,0xF4,0xF1,0xF2,0xF8,0xF4,0xF1;/逆时针unsigned char motorshun8=0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8;/顺时针unsigned char motorout8;/电机输出delay(int t)int i,j;for(i=0;it;i+)for(j=0;j10;j+);motor() int i; if(id2=0) for(i=0;i8;i+) p0=motorouti; delay(con); else if(id2=1) p0=0xff;keyscan() int i
17、;/按键s1:反向 if(s1=0) delay(1000); while(s1=0); id1+; if(id1=1) for(i=0;i8;i+) motorouti=motornii; else if(id1=2) id1=0; for(i=0;i8;i+) motorouti=motorshuni; /按键s2:停止继续 if(s2=0) delay(900); while(s2=0); id2=id2; /按键s3:加速 if(s3=0) delay(900); while(s3=0); if(40con4100) con=con/2; if(con40) con=4000; /按键
18、s4:减速 if(s4=0) delay(900); while(s4=0); if(30con4000) con=40; else /当扫描按键时,没检测到按键时, delay(1000); /执行else语句,即正向旋转 for(i=0;i8;i+) motorouti=motorshuni; void main() p0=0xff; while(1) keyscan(); motor(); (3) 怎样实现步进电机转速的渐变,完成先递增,后递减?写出程序代码或画出流程图。#includeAT89X52.hsfr p0=0x80;sfr p1=0x90;sfr p2=0xA0;sfr p3
19、=0xB0;sbit s1=p32;/对应于按键K1 反向sbit s2=p33;/对应于按键K5 停止sbit s3=p34;/对应于按键K9 加速sbit s4=p35;/对应于按键K13 减速int con=800;char data id1=0,id2=0,id3=0,id4=0;/按键标志unsigned char motorni8=0xF2,0xF8,0xF4,0xF1,0xF2,0xF8,0xF4,0xF1;/逆时针unsigned char motorshun8=0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8;/顺时针unsigned char
20、motorout8=0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8;/电机输出delay(int t)int i,j;for(i=0;it;i+)for(j=0;j10;j+);motor() int i; if(id2=0) for(i=0;i20) con=con/2; motor(); speeddown() /定义一个减速函数,当转动单位时/间con小于4100时,做减速转动 while(con4100) con=con*2; motor(); void main() /最后在main函数中调用/speedup和speeddown p0=0xff; while(1) speedup();speeddown(); 【实验体会】(1) 首先是对keil的使用不是太了解,没有设置环境变量,耽误了很长时间,由于上次人太多,没有亲自上手的机会,虽然耽误了很长时间,但是对软件使用印象更加深刻。(2) 前两个试验修改比较简单,没有遇到多大的困难,在最后一个实验时,没有定义motorout8,导致在写好加速减速函数时,在main函数中调用没有观察到现象。(3) 实验对步进电机有了直观了解,了解如何通过编程实现对步进电机的控制。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1