找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5684|回复: 4
打印 上一主题 下一主题
收起左侧

单片机微型三相步进电动机控制系统设计 Proteus仿真+程序

[复制链接]
跳转到指定楼层
楼主
随着电子科学技术的发展,步进电机的应用越来越广泛。微型步进电机在选择减速电机时要看下驱动IC的角度看步进电机,微型步进电机是由微型电机和步进电机的统称。步进电机运用在多种场合,在现代控制领域使用广泛,有着重要作用。步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。
本次设计中,要求设计三相步进电机计算机控制系统硬件电路。其中硬件电路由单片机、接口电路、驱动电路、显示电路、开关电路等组成。设计单三拍、双三拍、三相六拍步进电机控制流程设计;设计三相六拍步进电机起停控制、正反转控制、及加速及减速控制程序实现及调试。通过编写正确的程序,并使用仿真软件PROTEUS进行该控制系统的仿真。

计算机控制系统包括硬件、软件和控制算法3个方面,一个完整的设计还需要考虑系统的抗干扰性能,使系统能长期有效地运行[1],计算机控制技术是一门以电子技术、自动控制技术、计算机应用技术为基础,以计算机控制技术为核心,综合可编程控制技术、单片机技术、计算机网络技术。
1.1          设计背景

步进电机是一种用电脉冲信号进行控制,并将电脉冲信号转换成相应的角位移或。线位移的控制驱动装置。由于步进电机是受脉冲信号控制的,因此适合于作为数字控制系统的伺服元件。步进电机的线圈中每输入一个脉冲,转子就旋转一个步距角,它的速度和控制脉冲严格同步,通过改变脉冲频率的高低就可以在很大范围内调节电机的转速。由于步进电机具有精度高、控制灵活、定位准确、工作可靠,能直接接受交换数字信号等特点,因此广泛地应用在计量测试仪器中。

设计一个基于单片机AT89S52的计算机步进电机控制系统,使用数字控制器进行步进电机的起停、正、反转控制以及步进电机的加速、减速控制,主要有以下四个方面的要求:
组建一个使用单片机AT89S52作为控制器的三相步进电机控制系统。
用K0-K2作为通电方式选择键,K0为单三拍,K1为双三拍,K2为三相六拍;K3、K4分别为启动和方向控制;正转时红色指示灯亮,反转时黄色指示灯亮,不转时绿色指示灯亮;用K5-K12作为步数的给定值;用3位LED显示剩余工作步数。
根据设计要求进行硬件线路图设计,选择合适的器件,进行硬件电路图设计。
编写程序,实现相应功能。
进行程序调试,模拟仿真

         晶振电路
一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容。晶体振荡器,简称晶振。在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率是串联谐振,较高的频率是并联谐振。由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。如图 2?3所示:

图 2?3晶振电路

2.3          复位电路
复位是单片机的初始化工作,复位后中央处理器CPU和单片机内的其它功能部件都处在一定的初始状态,并从这个状态开始工作。为了防止程序执行过程中失步或运行紊乱,此处我们采用了上电复位,电路图如下图 2?4所示:

图 2?4复位电路

单片机最小系统是单片机运行的最基本条件:电源,单片机芯片,晶振电路,复位电路。电源为整个系统供能,单片机芯片运行程序,处理数据;晶振电路为单片机工作提供节拍,常被理解为单片机心脏;复位电路,在单片机上电时需要复位使程序从头开始运行。
2.4          工作方式选择模块
用K0-K2作为通电方式选择键,K0为单三拍,K1为双三拍,K2为三相六拍;K3、K4分别为启动和方向控制;如下图 2?5所示:

图 2?5工作方式选择模块图

2.5          电动机及驱动
步进电机模块如下图 2?6所示

图 2?6电动机模块

2.5.1         步进电机
本次设计采用的是步进电机,如下图 2?7所示。

图 2?7步进电机实物图

步进电机的不同驱动方式,都是在工作时,脉冲信号按一定顺序轮流加到三相绕组上,从而实现不同的工作状态。由于通电顺序不同,其运行方式有三相单三相拍、三相双三拍和三相单、双六拍三种(注意:上面“三相单三拍”中的“三相”指定子有三相绕组;“拍”是指定子绕组改变一次通电方式;“三拍”表示通电三次完成一个循环。“三相双三拍”中的“双”是指同时有两相绕组通电)。
2.5.2         驱动电路
ULN2003A电路是美国Texas+Instruments公司和Sprague公司开发的高压大电流达林顿晶体管阵列电路。ULN2003是高耐压、大电流、内部由七个硅NPN和达林顿管组成的驱动芯片,如图 2?8所示。经常在以下电路中使用,作为:显示驱动、继电器驱动、照明灯驱动、电磁阀驱动、伺服电机、步进电机驱动等电路中。该电路的特点如下:ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。ULN2003 工作电压高,工作电流大,灌电流可达500mA,并能在关态时承受50V 的电压,输出还可以在高负载电流并行运行。

图 2?8ULN2003逻辑图

2.6          状态显示模块
LED发光二极管显示步进电机的工作状态,它们分别接到单片机的P3.4~P3.6。如下图 2?9所示,让单片机连接到LED阴极,LED阳极接VCC。这样通过设置端口电平就能使LED亮灭,达到显示效果。本设计中,绿灯代表停止,红灯代表正转,黄灯代表反转。

图 2?9LED状态显示

2.7          数码管显示
LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。通过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
本课题采用六位共阴极数码管来对电机步数,速度挡位进行显示。电路如下,接在单片机P0口,P0必须添加上拉电阻,以为P0扣不加上拉电阻时处于开漏状态,只允许输出低电平,加上拉电阻后可输出高电平。电路如下图 2?10示。

图 2?10数码管电路

2.8          本章小结
本章主要是对硬件设计的描述。先是呈现出总硬件系统框图及AT89S52单片机的接口及各种特性,再进行各部分电路的设计的原理,即:晶振电路,复位电路,工作方式选择模块,驱动电路,电机工作状态显示部分,数码管显示部分。
3   软件设计3.1          功能框图
步进电机控制系统功能框图如下图 3?1所示,说明了每个模块与单片机之间的联系,控制逻辑;通过单片机控制扫描,数码管显示,LED显示,步进电机控制等。

图 3?1功能框图

3.2          主流程图

图 3?2主流程图

首先进行工作方式选择,如图图 3?2所示,按下启动按钮,单片机判断是否启动,如果没启动绿灯亮,启动后单片机查询电机的工作模式,K0为单三拍,K1为双三拍,K2为三相六拍。再查询电机的指定步数,接着判断电机正转还是反转,正转红灯亮,反转时红灯亮。由此可以让步进电机按照指定的方式运转,并且剩余步数显示到数码管上;单片机判断步数是否走完。

3.3          步进电机模块3.3.1               步进电机工作方式说明
(1)三相单三拍工作方式
    如表 3?1,在这种工作方式下,A、B、C三相轮流通电,电流切换三次,磁场旋转一周,转子向前转过一个齿距角。因此这种通电方式叫做三相单三拍工作方式。A-B-C为正转,C-B-A为反转,这时步距角θb (度)为
                                                  (公式1)
式中:m──步进电机工作拍数; z ──转子齿数


(2)双三拍工作方式
     如表 3?2,在这种工作方式下,每次都是有两相导通,两相绕组处在相同电压之下,以AB─BC─CA─AB (或反之)方式通电,故称为双三拍工作方式。以这种方式通电,转子齿所处的位置相当于六拍控制方式中去掉单三拍后的三个位置。它的步距角计算公式与单三拍时的公式相同。
极分度角/齿距角= R + k·1/m
进一步化简得齿数z:
                    (公式2)
式中:m──相数; q──每相的极数; k──≤ (m - 1)的正整数;
R──正整数,为0、1、2、3……。

                            表 3?2 三相双三拍的相位控制

(3)三相六拍工作方式
     如表 3?3,在这种工作方式下,绕组以A—AB—B—BC—C—CA—A时序(或反时序)转换6次,磁场旋转一周,转子前进一个齿距,每次切换均使转子转动1. 5°,故这种通电方式称为三相六柏工作方式。其步距角θb 为:

                                                     (公式3)
式中:m──步进电机工作拍数; z ──转子齿数
  关键模块设计3.4.1              三相步进电机模块设计
设计说明:在此设计中,采用的是三相步进电机,对于步进电机模块的程序设计采用循环程序设计方法。先把正反转向的控制模型存放在内存单元中,然后再逐一从单元中取出控制模块并输出。首先启动,选择步进电机的拍数,输入步数,然后读入正反转的控制模型驱动步进电机转动
   三相步进电机的流程框图,如图 3?3所示:

                       图 3?3 三相步进电机的流程框图

3.4.2         显示模块设计
设计说明:显示模块是用4位七段数码管来显示工作步数。先将显示码存入数组中,指向最左边一位,然后取出要显示的数据,指向换码表首地址,取出显示码,从P0口输出显示码,P2口输入位选码,显示出4位工作步数,最后修改数组地址,求下一位位选码继续显示。如图 3?4所示。

图 3?4 数码管显示原理

3.5          本章小结

本章主要描述了步进电机实现过程软件的设计思路,包括功能框图,主流程图,步进电机模块,关于工作方式的说明,数码管显示设计。

4   测试和验证4.1          任务分工
本次设计我们小组共4人,a主要负责了对于系统控制的电路设计。b负责了系统程序的编写和调试,查阅了相关资料,实现系统功能,c主要负责了小组统筹规划,收集资料,电路分析,靳筌钧主要负责了测试验证,文档整理的工作,每个人分工合作,完成了设计任务。
4.2          搭建环境
使用KEIL uVision 4编写单片机程序,在Proteus中搭建仿真环境,将可执行程序加载到仿真单片机中,进行仿真,验证设计的正确性,可行性。
4.2.1         建立编辑编译环境
  • 创建AT89C51工程,进行编辑。如下4?1所示:

图 4?1 创建工程

  • 编辑代码,选择生成.Hex文件。如下4?2所示:

图 4?2 生成目标文件

4.2.2     建立仿真和测试环境
根据电路原理图在Proteus中搭建仿真模型。分别由数码管显示模块,复位电路,矩阵键盘,晶振电路,单片机主控芯片,步进电机模块,工作状态显示模块。如下图 4?3所示:

图 4?3仿真模型

4.3          方案验证
通过仿真来验证步进电机的控制是否合理。验证如下:
4.3.1     三种工作方式
图 4?4为步进电机工作在三相单三拍,此时K0,K3接高电平,K1,K2接低电平启动;;图 4?6为步进电机工作在三相六拍,此时K0,K1接低电平,K2,K3接高电平;若K4接高电平则反转,低电平则正转。这三种工作方式工作不同,三相单三拍时,通电顺序为A-B-C-A;三相双三拍时,通电顺序为AB-BC-CA-AB;三相六拍时,通电顺序为A-AB-B-BC-C-CA-A;以上通电方式是三种工作方式正转的情况,若要反转,则通电方式放过来即可

图 4?4单三拍正转

图 4?5图 4?6为步进电机工作在三相双三拍,此时K1,K3接高电平,K0,K2接低电平

图 4?5 三相双三拍


图 4?6三相双三拍

图 4?7图 4?8为步进电机工作在三相六拍,此时K0,K1接低电平,K2,K3接高电平。

图 4?7 三相六拍

图 4?8 三相六拍

4.3.2     正转和反转
  图 4?7为三相步进电机工作在正转状态,此时K4接高电平。

图 4?9电机正转

图 4?8为三相步进电机工作在反转状态,此时K4低电平

图 4?10 电机反转

4.3.3     指定步数和数码管显示

当按下K5~K12按键时,分别指定步数值为20、40、60、80、100、120、140、160。当步进电机运转时,每运转一步程序将总步数自减1,在运用数码管和单片机的端口连接显示剩余步数,如图 4?9所示。

图 4?11 指定步数和数码管显示


4.4          问题与分析
在本次课题中,我遇到一些问题如下:
  • 由于对单片机知识不是很熟悉,在设计过程中常常需要翻阅许多相关知识才能有思路,需要不断巩固和运用
  • 在对数码管进行设计的时候,忘记加入上拉电阻,以至于多次仿真运行时数码管都不显示
  • 在进行控制时,有很多时候开关都无法起到相应的作用,说明程序控制有误,且数码管显示不全,对数码管的显示设计出现了许多程序上的错误。
  • 在设计电路的过程中,调试程序以及控制都无法达到预期的状态,通过请教老师和同学,对程序不断修改,一步一步的验证和测试,老师也给我们的设计提出了相关问题,才完善
    创新与扩展
在对步进电机进行设计的时候,在系统的基础上,还可以充分利用步进电机的功能,加上蜂鸣器,对步进电机故障时进行报警,可以将显示步数的开关利用集成开关进行控制,减少接线,显示剩余步数不仅可以使用数码管,还可以使用液晶显示器,使用户观感更佳。同时步进电机可以运用到生活中很多场合,我们可以经过AD转换,改变状态

附录一 电路图


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. void delay1(void);
  4. void delay2(void);
  5. void display(int);
  6. sbit green=P1^4;
  7. sbit red=P1^6;
  8. sbit yellow=P1^5;
  9. sbit K5=P2^4;
  10. sbit K6=P2^5;
  11. sbit K7=P2^6;
  12. sbit K8=P2^7;
  13. sbit K9=P3^5;
  14. sbit K10=P3^6;
  15. sbit K11=P3^7;
  16. sbit K12=P1^7;
  17. int bushu=0;
  18. void main()
  19. {
  20. char a,b,c,d,j,*q,
  21. done1[8]={0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},
  22. done2[8]={0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00},
  23. done3[14]={0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00};   //电机通电方式表
  24. L:
  25. a=P3;
  26. while(!(a&0x08))   //判断是否启动,若没启动则重新判断
  27. {
  28. green=1;
  29. red=0;
  30. yellow=0;
  31. delay1();
  32. a=P3;
  33. }
  34. if(a&0x01)  //判断电机工作方式
  35. q=done1;    //单三拍
  36. else if(a&0x02)
  37. q=done2;    //双三拍
  38. else if(a&0x04)
  39. q=done3;    //三相六拍

  40. if(K5==1)
  41. {
  42. bushu=20; //设置bushu的值,以控制步数
  43. }
  44. else if(K6==1)
  45. {
  46. bushu=40; //设置bushu的值,以控制步数
  47. }
  48. else if(K7==1)
  49. {
  50. bushu=60; //设置bushu的值,以控制步数
  51. }
  52. else if(K8==1)
  53. {
  54. bushu=80; //设置bushu的值,以控制步数
  55. }
  56. else if(K9==1)
  57. {
  58. bushu=100; //设置bushu的值,以控制步数
  59. }
  60. else if(K10==1)
  61. {
  62. bushu=120; //设置bushu的值,以控制步数
  63. }
  64. else if(K11==1)
  65. {
  66. bushu=140; //设置bushu的值,以控制步数
  67. }
  68. else if(K12==1)
  69. {
  70. bushu=160; //设置bushu的值,以控制步数
  71. }

  72. if(a&0x10)  //判断电机是否正转
  73. {
  74. green=0;
  75. red=1;
  76. yellow=0;   //电机正转,红灯亮
  77. b=0;
  78. }
  79. else
  80. {
  81. green=0;
  82. red=0;
  83. yellow=1;   //电机反转,黄灯亮
  84. if(a&0x04)  b=7;  //反转将b置位,通电顺序反向
  85. else b=4;
  86. }
  87. d=b;
  88. while(1)
  89. {
  90. c=*(q+b);
  91. if(c==0) b=d;   //步数走完,b重新置位
  92. else
  93. {
  94. P1=c;     //从P3口输出电机控制信号
  95. b++;
  96. bushu--;  //剩余步数
  97. display(bushu);  //显示步数
  98. j=a;
  99. a=P3;
  100. if(a!=j&&bushu==0)   //判断P3口状态信号是否改变
  101. if(!(a&0x08))
  102. bushu=0;  //若为停止信号,总步数清零
  103. goto L;      //状态信号改变,返回到L,重新开始判断控制
  104. }
  105. }
  106. }

  107. void display(int n)   //步数显示程序
  108. {
  109. unsigned char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  110. unsigned char i,k,t,num[3];
  111. num[0]=n%10;
  112. num[1]=(n/10)%10;
  113. num[2]=(n/100)%10;
  114. for(t=0;t<50;t++)  //扫描50次
  115. {
  116. k=0x04;   //位选码为最高位
  117. for(i=0;i<3;i++)
  118. {
  119. P2=k;   //P2口输出位选码
  120. P0=tab[num[i]];   //P0口输出显示剩余步数
  121. k=k>>1;   //下一位位选码
  122. delay2();
  123. }
  124. }
  125. }

  126. void delay1()
  127. {
  128. int i,j;
  129. for(i=0;i<200;i++)
  130. for(j=0;j<300;j++);
  131. }
  132. void delay2()
  133. {
  134. int i,j;
  135. for(i=0;i<10;i++)
  136. for(j=0;j<60;j++);
  137. }
复制代码

所有资料51hei提供下载:
计算机实验和51hei设计资料.rar (5.56 MB, 下载次数: 85)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:857825 发表于 2020-12-11 10:18 | 只看该作者
可以发一下其他几种接法的c的源程序不
回复

使用道具 举报

板凳
ID:926155 发表于 2021-5-24 00:33 来自手机 | 只看该作者
有绕线机的控制程序吗?
回复

使用道具 举报

地板
ID:1026095 发表于 2023-4-1 13:49 | 只看该作者
这个proteus用什么版本打开
回复

使用道具 举报

5#
ID:1081783 发表于 2023-6-8 13:28 | 只看该作者
感谢大佬,解决了困扰我的疑问。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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