基于STC89C52的步进电机调速系统
目录
摘 要.............................................................................................................................. 3 一 课程设计目的.......................................................................................................... 4 二 系统简介.................................................................................................................. 5
2.1 步进电机工作原理简介................................................................................. 5 2.2 步进电动机的励磁方式................................................................................ 5
2.2.1 二相励磁............................................................................................ 6 2.2.2 一-二相励磁...................................................................................... 6 2.3 步进电机基本参数........................................................................................ 7 2.4 闭环PID 控制原理........................................................................................ 8 三 方案选择.................................................................................................................. 8
3.1 控制器的选择................................................................................................. 8 3.2 显示器的选择方案......................................................................................... 8 3.3 转速信号采集方案......................................................................................... 8 3.4 电机驱动芯片的选择..................................................................................... 9 四 硬件总体设计.......................................................................................................... 9
4.1 系统原理框图................................................................................................ 9 4.2 系统电路原理图............................................................................................ 9 五 软件总体设计........................................................................................................ 10 六 功能模块介绍........................................................................................................ 11
6.1硬件模块....................................................................................................... 11
6.1.1 STC89C52RC型单片机最小系统..................................................... 11 6.1.2 ULN2003APG驱动电路..................................................................... 11 6.1.3 74HC14E............................................................................................ 12 6.1.4 测速模块.......................................................................................... 12 6.1.5 显示电路.......................................................................................... 13 6.2软件模块....................................................................................................... 14
6.2.1 LCD显示模块.................................................................................... 14 6.2.2 键盘电机模块.................................................................................... 16 6.2.3 PWM模块 .......................................................................................... 17
6.2.4 测速模块.......................................................................................... 18
七 验证与测试............................................................................................................ 19
7.1验证............................................................................................................... 19 7.2测试............................................................................................................... 19 7.3 运行结果...................................................................................................... 20 八 小组分工................................................................................ 错误!未定义书签。 九 设计中的问题........................................................................ 错误!未定义书签。 十 参考文献................................................................................................................ 22 附录.............................................................................................................................. 23
1. 完整程序......................................................................................................... 23 2. 原理图、仿真图、PCB 图 .............................................................................. 32
步进电机是一种将电脉冲信号转换成相应的角位移或线位移的电磁机械装置,属于输出与输入脉冲对应的增量驱动元件。它具有步进数可控,运行平稳,价格便宜等优点,广泛应用于数控机床、机器人控制、绘图仪、石英钟表等数字控 制和自动控制系统中。 因为步进电机的特殊工作原理,它的转动需要特殊的脉冲频率控制。目前, 步进电机最普遍的控制调速方法是利用单片机和软件编程,其控制方法简单易懂,操作方便,可靠性高并且成本低廉。在现在控制系统中,通过数字PID 可以对其进行更精确的控制。
【关键词】步进电机 脉冲 单片机 数字PID
摘 要
一 课程设计目的
设计一个由MCS51或其他单片机组成步进电机调速系统。步进电机调速系统应由以下模块组成:测速模块、键盘模块、显示电路、电机模块。其中键盘模块可以输入电机的预期转速、方向,系统自动计算出PWM 等信号驱动电机转动;测速模块可以获取实际的电机转速信息,并将其反馈系统,且通过显示模块显示实际的转速值;系统设计一个PID 控制器调节输出信号量,使得电机按照指定的预设值转动。
要求:
1.显示模块,能显示预设值、实际测量值和表明转动方向2.键盘能预设实际转速值和方向 3.控制器使用数字PID ,调节转速
4. 完成整个电路设计和软件设计
二 系统简介
2.1 步进电机工作原理简介
步进电机属于实用的典型的机电一体化组件。它是一种将电脉冲信号转化为角位移或直线位移的执行机构。又可称脉冲电机或阶跃电机,国外常称为Step motor 、Stepping motor、Stepper motor等等。当步进电机驱动器接收到一个脉冲信号,它就驱动步进电机按照设定的方向转动一个固定的角度(称为“步据角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到确定的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机可以作为一种控制用的特种电机,利用其没有累积误差的特点,广泛运用于各种开环控制。步进电机的优缺点如下: (1)在不失步的前提下步进电机的角位移与输入脉冲数严格的成正比,因此不存在累计误差,具有良好的跟随性。
(2)步进电机的动态响应快、易于启停、正反转及变速。
(3)可用数字信号直接进行开环控制,容易构成简单廉价但可靠的数字控制系统。同时,在要求高时它也可以与角度反馈环节组成高性能的闭环数控系统。 (4)停止时具有自锁能力。
(5)速度可在相当宽范围内平滑调节。 (6)无刷,电机本体部件少,可靠性高。 (7)一般可以不用减速器而直接驱动负载。 (8)带惯性负载的能力较差。
(9)由于步进电机存在振荡和失步现象,因此必须对控制系统和机械负载采取相应的措施。
(10)步进电机只能通过脉冲电源供电才能运行,它不能直接使用普通的交直流电源驱动。
2.2 步进电动机的励磁方式
步进电动机的励磁方式分为全步励磁和半步励磁两种。其中全步励磁又有1相励磁和2相励磁只分;半步励磁又称1-2相励磁。简要介绍如下: 一相励磁:
在每一瞬间,步进电动机只有一个线圈导通。每送一个励磁信号,步进电动机能旋转1.8°。这是3种励磁方式中最简单的一种。特点如下:
精确度好、消耗电力小,但输出转矩最小,振动较大。如果以该方式控制步
进电动机正转,对应的励磁顺序见表1。若励磁信号反向传送,则步进电动机反转。
表1 一相励磁顺序
2.2.1 二相励磁
在每一瞬间,步进电动机有2个线圈同时导通。每送一个励磁信号,步进电动机能旋转1.8°。 特点如下 :
输出转矩大,振动小。因而成为目前使用最多的励磁方式。如果以该方式控制步进电动机正转,对应的励磁顺序见表2。若励磁信号反向传送,则步进电动机反转。
表2 二相励磁顺序
2.2.2 一-二相励磁
为1相励磁与2相励磁交替导通的方式。每送一个励磁信号,步进电动机能旋转0.9°。 特点如下:
分辨率高,运转平滑,。如果以该方式控制步进电动机正转,对应的励磁顺序见表3。若励磁信号反向传送,则步进电动机反转。
表3 一-二相励磁顺序
2.3 步进电机基本参数
在本次课程设计中所用是M35SP-7型步进电机,工作电源是+5.4V~+6.6V直流电源,步距角为7.5度,线圈是4相。工作在双四拍模式,相序为AB-BC-CD-DA ,即一个脉冲, 转 7.5 度。也可以工作在单八拍模式,相序为A-AB-B-BC-C-CD-D-DA ,即一个脉冲, 转 3.75 度。
在本次课程设计中,步进电机使用双四拍模式,A 、B 、C 、D 各相通电顺序如表1.1。
表1.1
当各相按照表1.1顺序连续通电,就是步进电机转了起来。如果要让电机反
转,那反向按顺序通电就行了。但是通电的频率不能高过电机的最大PPS ,否则就会引起失步,即电机运转时运转的步数,不等于理论上的步数。 2.4 闭环PID 控制原理
图2.1 PID控制系统框图
比例积分微分调节器(PID)。其调节规律可用(1)式表示。
y =k p (e +
1T i
⎰
t
edt +T d
d e
) +y 0 (1) d t
式中: T d 为微分常数,它的物理意义是当调节器微分调节作用与比例调节作用的输出相等时所需的调节时间称为微分常数.
三 方案选择
3.1 控制器的选择
使用51单片机为核心, 适合系统控制。
本系统采用STC89C52单片机,STC89C52单片机与51单片机兼容同时可以通过下载线下载程序,方便了程序的调试和运行。
3.2 显示器的选择方案
方案一:选用LED 数码管显示电机转速的各种信息,LED 显示信息量小、功耗大,同时还需要制作相应硬件驱动电路。
方案二:选用字符点阵LCD 模块显示小车的各种信息,LCD 信息量大、功耗低,,它提供标准的并行或者串行接口,驱动简单,使用方便。 本实际要求显示的内容多所以选择方案二。
3.3 转速信号采集方案
方案一:使用光电码盘。优点; 测量比较精确。缺点:调试很负载,程序量大。 方案二:采用光电开关。优点:调试简单,只需要MCU 在单位时间内计算输入MCU 的脉冲数,就能通过简便的程序计算出转速。缺点:误差较大,码盘的缺口很难控制宽度。
综上,采用光电开关进行转速信号采集较为合理。
3.4 电机驱动芯片的选择
单片机的I/O口产生脉冲的不稳定,导致步进电机不能正常运行,所以选用74HC14反向施密特触发器作为脉冲整形器。
步进电机需要大电流,所以需要一个能和TTL 电平兼容的电机驱动芯片,所以选择了ULN2003A 。
四 硬件总体设计
4.1 系统原理框图
因为设计要求,选用四相步进电机,单片机选用STC89C52作为控制器,采用最常用的1602液晶屏。然后由与步进电机同轴的光电开关作为反馈原件,并把反馈的信号经由CPU 处理后显示出来。 系统原理框图如图4.1。
图4.1 系统原理框图 4.2 系统电路原理图
系统电路图如图4.2,P0口用于LCD1602显示。P1口的低四位与脉冲整形器74HC14芯片相连接并,然后在与步进电机驱动芯片ULN2003A 的1R 、2R 、3R 、4R ,用于驱动步进电机转动。P2.0、P2.1、P2.2、P2.3、P2.4、P1.4、P1.5接独立按键,分别用于控制步进电机的正反转,启停,预定转速的百位控制,十位控制,个位控制,以及加速和减速控制。P3.5接光电传感器模块输出信号(即测速反馈信号)测速模块的电源和地线与单片机的电源和地线相接。步进电机与
ULN2003的Q1、Q2、Q3、Q4端口相连。整个系统搭建完成。
图4.2 系统电路原理图
五 软件总体设计
结合STC89C52的各个引脚,分配它的各个端口给各个模块。在本次设计中用到了LCD1602显示模块、键盘模块、步进电机控制模块、PWM 模块、电机测速模块。综上所述,软件模块图如图5.1。
图5.1 软件模块图
六 功能模块介绍
6.1硬件模块
6.1.1 STC89C52RC型单片机最小系统
单片机主要擅长系统控制,而不适合做复杂的数据处理,在设计单片机最
小系统时我们选用STC89C52,8位DIP-40封装的单片机作为MCU ,本系统的单片机最小系统由时钟电路、复位电路、外围总线接口等部分组成。图6.1为单片
机最小系统结构框图。
图6.1 单片机最小系统
6.1.2 ULN2003APG驱动电路
ULN2003APG 是大电流驱动阵列, 属于高耐压、大电流达林顿管IC 。 ULN2003APG 在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003APG 工作电压高,工作电流大,灌电流可达500mA ,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。采用集电极开路输出,输出电流大,故可直接驱动步进电机。图6.3为的逻辑图和驱动模块电路设计。
图6.2 电机驱动电路
6.1.3 74HC14E
74HC14是一款高速CMOS 器件,74HC14引脚兼容低功耗肖特基TTL (LSTTL )系列。 74HC14实现了6路施密特触发反相器,可将缓慢变化的输入信号转换成
清晰、无抖动的输出信号。它的主要应用有 波形、脉冲整形器,非稳态多谐振器,单稳态多谐振荡器。图6.3为74HC14的电路原理图。
图6.3 脉冲整形电路
6.1.4 测速模块
本次课程设计通过光电码盘来对步进电机测速。
光电开关是由红外对管和一个码盘组成。红外对管一边是发射一边是接收。
模块工作时发射管不断发出红外光, 当没有障碍物遮挡红外发射管发送给接收管的红外光时, 接收管接模块输出低电平,指示灯不亮;当有障碍物遮住红外发射管发送给接收管的红外光时, 模块输出高电平,指示灯亮。
在单片机中设定T0定时器和T1计数器,把光电码盘输出端连在P3.5在一定的时间内测出T1采集到的脉冲,然后再推算出电机的速度。图6.4为电路原理图
图6.4 测速电路
6.1.5 显示电路
本次课程设计采用LCD1602作为显示器。
液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT )那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。 而且液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。同时液晶显示器体积小、重量轻、功耗小。因此本次课程设计选用液晶显示器。LCD1602显示电路如图6.5所示
图6.5 显示电路
6.2软件模块
6.2.1 LCD显示模块
本次课程设计显示模块采用LCD1602,1602的写数据和命令的时序如图5.2.1。在开始时,初始化LCD 的显示模式。本次设计要显示实际转速、设定转速和方向,需要两行显示,命令为0x38。不需要显示光标和光标闪烁,设置命令为0x0e 。设置写一个字符后地址自动加1,命令为0x06。然后再根据LCD1602的RAM 地址映射图(如图5.2.2)输入你要显示的位置,首地址为0x80,然后在把内容一位一位地写进去。LCD 流程图,如图5.2.3。(程序见附录)。
图6.6 写操作时序图
图6.2.2 RAM地址映射图
图6.7 LCD程序流程图
6.2.2 键盘电机模块
在本次课程设计中,设定了七个按键来控制电机,起停、加速,减速、正反转、百十个位的控制。先检测是否有按键被按下去,按下的是哪个见,在根据设定的键位来判断要让电机实现什么功能。按键加减速流程图,如图5.2.4,百十个位设置流程图,如图5.2.5。(程序见附录)。
图6.8 按键加减速流程图
图6.9 百十个位设置流程图
6.2.3 PWM模块
本次课程设计采用的是由定时器T0产生固定的2000Hz 的PWM ,初值为TH0=0xfe,TL0=0x33。通过改变脉冲个数来调节周期,达到PWM 的输出改变。PWM 流程图如图5.2.6。(程序见附录)。
图6.10 PWM流程图
6.2.4 测速模块
本次课程设计电机测速采用的是光电开关,采用T0定时器,定时为0.5ms ,当定时达到12000次时,为一个采样周期6s 。在采样周期内,T1计数器对P3.5口的外部脉冲计数。测速流程图,如图5.2.7。(程序见附录)。
图6.12 测速流程图
七 验证与测试
7.1验证
按照原理图运用proteus 生成仿真图,载入所有程序后运行。运行结果如图7.1
图7.1 系统仿真图
由于该仿真图无步进电机转速反馈模块,故不能在LCD 上显示实际转速。
7.2测试
按照系统原理图对焊接好的实物进行测试,检查硬件和软件是否能够协调运行,看是否能够达到系统创作之初所设想的效果,并对系统出现的情况进行分析,如达不到则重新修改系统的硬件结构或者修改软件的程序部分,直到达到设计需要为止。
在测试的过程中,遇到了一些问题。主要有:
1.当电机调速范围过大如转速从0直接调到100会出现堵转或丢步。经分析发现如果给电机加速设置一个线性变换过程则不会出现上述情况。
2.电机实际转速和预设转速存在小范围误差。原因有测量误差, 预设转速太慢,码盘倾斜,采样周期中记录到倾斜边的次数,PID 控制算法设计不够精确等。 3.电机达不到额定的最高转速,经分析发现电机额定电压是5.5V-6.5V
,而
测试所提供的电压为4.5V; 另外电机的额定最高转速是定义在空载模式下,为了测量电机的实际转速,设计了测速模块,将码盘连接在电机上成为电机负载,故电机无法达到最高转速。 7.3 运行结果
运行系统,设置不同预设转速并采集40组实验数据,如下表7.1所示。
表7.1实验数据
十 参考文献
【1】《单片机原理及应用》(第二版) 张毅刚主编 高等教育出版社;
【2】《计算机控制技术及应用》 王平、谢昊飞、蒋建春编 机械工业出版社; 【3】《电力拖动自动控制系统》 陈伯时主编 机械工业出版社;
1. 完整程序
#include "reg52.h" #include #include #define uchar unsigned char #define uint unsigned int sbit lcdrw=P2^5;//lcd sbit lcdrs=P2^6; sbit lcden=P2^7;
sbit zhuan=P2^0;//键盘 sbit jia=P1^4; sbit jian=P1^5; sbit qiting=P2^1; sbit baiwei=P2^2; sbit shiwei=P2^3; sbit gewei=P2^4;
sbit F1=P1^0;//步进电机 sbit F2=P1^1; sbit F3=P1^2; sbit F4=P1^3;
int i=1,j=2,k=5,a,b;//定义需要的变量 uchar num,flag=1,c; uint d,e,f,counter; unsigned long int v;
uchar MotorStep=0;//步进电机标志变量uint TIM,CT;
uchar code table[]="Speed:"; uchar code table1[]="Exp:"; uchar code table2[]="Dir:";
附录
typedef struct PID {
int SetPoint; // 设定目标 Desired Value //
if(pp->SumError > set_pwm)
pp->SumError=set_pwm; long Proportion; // 比例常数 Proportional Const
long Integral; // 积分常数 Integral Const
long Derivative; // 微分常数 Derivative Const
long LastError; // Error[-1] long PrevError; // Error[-2] long SumError; // Sums of Errors } PID;
long PIDCalc( PID *pp, int NextPoint ) {
long dError, Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; // 当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
//
else if(pp->SumError
pp->SumError=0; //积分项饱和
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项 ); }
void PIDInit (PID *pp) {
memset ( pp,0,sizeof(PID)); }
void delay(uchar z)//延时函数 { uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//lcd写命令 { lcdrs=0;
P0=com;
delay(5); lcden=1; delay(5); lcden=0; delay(5);
}
void write_data(uchar date)//lcd写数据{ lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; delay(5);
}
void lcd_init()//lcd初始化 { lcdrw=0; lcden=0; write_com(0x38); write_com(0x0e); write_com(0x06); }
void display()//显示函数 { uchar i,j,k,m,n,z;
lcd_init(); write_com(0x80+0x00); for(num=0;num
}
write_com(0x80+0x40); for(num=0;num
{ write_data(table1[num]); delay(5);
}
write_com(0x80+0x49); for(num=0;num
}
i=a/100;//期望值分离 j=a%100/10; k=a%10;
m=counter/100;//实际值分离 n=counter%100/10; z=counter%10;
write_com(0x80+0x44);//写期望值 delay(5);
write_data(0x30+i);
delay(5);
write_com(0x80+0x45); delay(5);
write_data(0x30+j); delay(5);
write_com(0x80+0x46); delay(5);
write_data(0x30+k);
write_com(0x80+0x06);//写实际值 delay(5);
write_data(0x30+m); delay(5);
write_com(0x80+0x07); delay(5);
write_data(0x30+n); delay(5);
write_com(0x80+0x08); delay(5);
write_data(0x30+z);
write_com(0x80+0x4d); if(flag==1) write_data('1');
else
write_data('0'); }
void key()//键盘扫描 { a=100*i+10*j+k; if(jia==0)
{
delay(5); if(i==0) {if(jia==0) {k++;
if(k>9)
{k=0;
j++;}
if(j>9) { j=0; i=1;} } } if(i==1) { if(jia==0) {k++; if(k>9) {k=0; j++;
} if(j>5) {j=5;} if(j==5) {k=0;} } }
while(!jia); delay(5); while(!jia);
}
if(jian==0)
{
delay(5); if(i==0) {if(jian==0) { k--; if(k
}
} if(i==1) {if(jian==0) {k--; if(k
}}
while(!jian); delay(5); while(!jian);
}
if(baiwei==0)
{ delay(5); if(baiwei==0) { i--; if(i
while(!baiwei); delay(5);
while(!baiwei);
}
if(shiwei==0) {
delay(5); if(i==0) {if(shiwei==0) {j++; if(j>9) {j=0;} }
}
if(i==1) {
if(shiwei==0) {j++; if(j>5) {j=0;} if(i==0) {j=0;}
}
}
while(!shiwei); delay(5); while(!shiwei);
}
if(gewei==0) {delay(5); if(gewei==0) {k++; if(k>9) {k=0;}
}
while(!gewei); delay(5); while(!gewei); }
if(zhuan==0) { delay(8); if(zhuan==0)
flag=~flag;
while(!zhuan); delay(5); while(!zhuan);
}
if(a==0) TR0=0; else {if(qiting==0)
{delay(5); if(qiting==0) TR0=~TR0; }
while(!qiting); delay(5);
while(!qiting); b=2500/a;
}
void InitMotor()//步进电机初始化 { F1=1; F2=1; F3=1; F4=1;
}
void SetMotor()//四项步进电机运行{
if(flag==1)//电机正传
{
switch(MotorStep) { case 0: if(TIM) { F1=0; F2=0; F3=1;
F4=1;
MotorStep = 1;
TIM=0;
break;
case 1: if(TIM) {
F1=1; F2=0; F3=0; F4=1; MotorStep = 2;
TIM=0;
} break;
case 2: if(TIM) { F1=1; F2=1; F3=0; F4=0; MotorStep = 3;
TIM=0;
} break;
case 3:
{
F1=0; F2=1; F3=1; F4=0; MotorStep = 0;
TIM=0;
} break; } } else
//电机反转
{ switch(MotorStep) { case 0: if(TIM) {
F1=0;
F2=1; F3=1; F4=0; MotorStep=1; TIM=0;
}
case 1: if(TIM) {
F1=1;
F2=1;
F4=0; MotorStep=2; {
TMOD=0x51;
}
}
}
TIM=0;
}
case 2: if(TIM) {
F1=1;
F2=0; F3=0; F4=1; MotorStep=3; TIM=0;
}
case 3: if(TIM) {
F1=0;
F2=0; F3=1;
F4=1;
MotorStep=0; TIM=0;
}
TH1=0;
TL1=0;
TH0=0xfe; TL0=0x33; EA=1; TR1=1;
ET0=1;
TR0=1; }
void jishu() { uchar temp1,temp2; temp1=TL1;
temp2=TH1;
d=(temp2
}
void main() {
PID sPID; PID 控制结构
long rOut; PID 响应(输出)
// double rIn; PID 反馈(输入)
PIDInit ( &sPID ); // // // // 初
始化结构
sPID.Proportion = 0.05; // 设置PID 系数
sPID.Integral = 0.05; sPID.Derivative = 0.0;
//产生1s 的定时
if(v==11950) {
sPID.SetPoint =a; //PID输入为设定
sPID.SetPoint = a; // 设置PID 设定值
system_Ini(); InitMotor(); while(1) { key(); display();
}
}
void PWM(void) interrupt 1 //pwm中断 0.5ms {
TH0=0xfe; TL0=0x33; CT++; v++; if(CT==b) {
TIM=1; CT=0; SetMotor();
}
if(v==12000)
速度
rOut = PIDCalc ( &sPID,d); 计算输出 b=2500/rOut;
}
jishu(); { counter=d; TL1=0; TH1=0; v=0; }
} //PID
2. 原理图、仿真图、PCB 图
原理图:
仿真图:
PCB 图: