基于89S51的单片机直流电机控制器的设计.docx

上传人:b****2 文档编号:17819661 上传时间:2023-08-04 格式:DOCX 页数:18 大小:179.93KB
下载 相关 举报
基于89S51的单片机直流电机控制器的设计.docx_第1页
第1页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第2页
第2页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第3页
第3页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第4页
第4页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第5页
第5页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第6页
第6页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第7页
第7页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第8页
第8页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第9页
第9页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第10页
第10页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第11页
第11页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第12页
第12页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第13页
第13页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第14页
第14页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第15页
第15页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第16页
第16页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第17页
第17页 / 共18页
基于89S51的单片机直流电机控制器的设计.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于89S51的单片机直流电机控制器的设计.docx

《基于89S51的单片机直流电机控制器的设计.docx》由会员分享,可在线阅读,更多相关《基于89S51的单片机直流电机控制器的设计.docx(18页珍藏版)》请在冰点文库上搜索。

基于89S51的单片机直流电机控制器的设计.docx

基于89S51的单片机直流电机控制器的设计

基于AT89S51的单片机直流电机控制器设计

一、设计目的:

1、了解PWM控制技术、

2、了解PID调节、

3、直流电机的特性及调速方式

二、系统功能:

1、本设计是要利用89S51单片机控制PWM调速电路实现小功率直流电机的转速调节。

而本系统必须符合以下几点要求:

2、在(1000—5500)转/分内对直流电机进行任意调速,最小调速级差为1转/分。

3、电机能在所设速度下稳定运转,运转速度与设定速度之差小于±20转/分。

4、电机启动和加减80%额定负载时,其转速能迅速回到设定值,转速超调±5%内。

5、电机能进行正反转控制。

三、系统设计

硬件设计

本设计在硬件电路上共分为6个部分,单片机部分、按键输入、PWM斩波电路、测速电路、转向调节电路以及模拟负载。

3.1单片机部分及其接口电路

图1单片机部分原理图

本设计采用的是AT89S51单片机,因为它是宽电压供电,工作电压范围为5.5V-3.4V,比起一般51系列单片机的5.5V-4.5V更能有效的避免电源抖动所带来的问题。

晶振选用石英晶振,频率为20MHz,比起传统的12MHz能有更快的处理速度。

在第9脚-RST,复位脚外,加了一个复位按键和复位电路,复位原理为:

第一次上电时,+5V通过给电容充电,于是此时电容相当于短路,+5V直接加到RST脚上,单片机自动复位。

过了极短的时间,电容充电完毕,此时电容则相当于开路,于是RST脚被电阻R113拉为低,单片机开始正常工作。

当RESET键按下时,+5V通过按键加到RST脚上,单片机复位,RESET键弹起之后,RST脚重新被R113拉为低,单片机开始正常工作。

单片机供电方面,采用的是12V直流通过7805三端稳压器稳压到5V,给单片机和显示部分供电。

3.2按键输入电路

图2按键部分原理图

在本设计中,按键输入比较简单,就是在按键信号输入I/O口与地线间串接一按键。

在按键没有按下的情况下,I/O口悬空,所以为高(由于单片机的I/O口是有内部上拉电路的,所以当其悬空时,内部将其上拉为高);当按键按下后,地线的把I/O口的电平拉低,单片机便可识别有键按下。

3.3PWM驱动电路

首先简单介绍一下PWM的工作原理:

如图所示,R21为P1.1口的上拉电阻,R20为限流电阻。

当P1.1口为低时,8050的基极电平被拉低,此时8050截止,所以9012的基极为高,9012截止,电机两端没有电压。

当P1.1口为高时,8050基极电压也为高,于是8050导通,8050的集电极电压为低,此时9012的基极也为低,9012导通,+12V加到电机两端,电机开始转动。

所以,当P1.1口为高时,电机两端电压也为高;P1.1口为低时,电机两端电压也为低。

于是当P1.1口产生PWM信号输出时,电机两端会产生同样的PWM波形,从而达到调节电机转速的目的。

关于上拉电阻的选取,上拉电阻的选取取决于两方面,一方面是能否保护单片机I/O口不过流,第二方面就是能否提供给负责所需大小的电流。

首先我们分析保护I/O口方面,P1~P3口能承受的灌电流(输入电流)最大能达到6mA,所以上拉电阻的阻值必须大于5V/6mA=0.8K,而我们选用的是10K电阻,远远大于0.8K,所以能有效的保护单片机I/O口;再来看看10K的上拉电阻能否提供所需要的电流呢?

假设电机工作电流为100mA(事实上远小于),9012的放大倍数按60倍计算的话,那么9012的基极,也就是8050的集电极最少得提供1.6mA的电流才能使9012达到饱和。

如果按8050能放大100倍的话,也就是说8050的基极至少得提供16μA的电流才能使8050饱和,事实上,10K的上拉电阻,加上I/O口的限流电阻,能提供(5-0.7)V/13.3K=350μA,远大于所需要的16μA,所以完全能提供足够的电流。

再看看串接在9012的基极和8050的集电极间的电阻R19。

它的作用是限流,假如不加这个电阻,那么当单片机口为高时,8050,9012均饱和,此时可以认为12V直接对地短路(虽然有9012的be结和8050的ce结,它们会产生零点几伏的压降,但是它们没有限流的作用,还是可以认为电源直接对地短路),所以加上此电阻很有必要。

图中D3二极管的作用:

在这个PWM电路中,此二极管名为续流二极管,他的作用就是续流和消除反电势。

电机内部的转子是由线圈绕成的,所以可以看成是一个电感元件,在突然断电时,反电势很大,将近12V的两倍以上,如果不加续流二极管的话,9012很可能被击穿,由于负的反电压的产生,使电机两端的直流平均电压接进0V,电极不会转动,只会不停地颤动并发出呜呜的声音,其本身也会有危险。

而加了续流二极管后,反向电势通过二极管和电机重新形成回路,消除了反电势,且能使电机上电流不中断,维持正常运转。

3.4测速电路

先介绍光电开关,如图5所示,光电开关分为2个部分,一个部分用来发送,另一部分负责接收。

发送部分V2是一个发光二极管,而接收部分V1则是一个光敏NPN三极管。

当光路通畅时,V1的基极能接收到V2发出的光,于是V1的be上就会有电流产生,V1导通,集电极输出为低;当光路被阻隔时,V1截止,所以集电极输出为高。

从图5可以看出,为配和软件编成需要,本系统加了一个起反向作用三极管,也就是说,V1集电极输出为高时,V3导通,于是V3的集电极输出为低;反之,V1集电极输出为低时,V3集电极的输出就为高。

图5测速电路原理图

要注意的就是几个电阻阻值的选取:

R25:

一般发光二极管的正向压降2V,驱动电流5mA左右,而电流最大不能超过20mA,所以选取510Ω的电阻作为其限流电阻,一来保证不会过流烧坏发光管,二来也不会因电流太小而使光电开关不能正常工作。

R22:

此电阻串接在电源与三极管V1的集电极,它的选取直接影响到三极管是否能达到饱和状态,我们知道,因光照所产生的光电电流很小,大概只有几微安的样子,所以集电极电流不能太大,否则管子不能达到饱和。

假设发光二极管正常工作需要的电流为5μA,那么三极管的放大倍数为100倍的话,集电极电流就不能超过0.5mA,所以R22的大小选取为10K,此时若基极有光照时,集电极能正常拉低到地。

R24:

为V3的集电极电阻,同时也为单片机INT1口的上拉电阻。

作用为保证V3和单片机I/O口不会过流,所以选用10K就能达到要求。

 

2.6转向调节电路

图6转向调节电路原理图

图6中,MOTOR两端的J1-1和J1-2分别为继电器的两组开关,J2则为继电器的线包开关,当拨动开关J0打向左边,J0悬空,则三极管9014基极为高,三极管导通,J2吸合,J1-1CB与J1-2CB接通,电机正转;当拨动开关J0打向右边时,J0接地,于是9014基极为低,三极管截止,J2松开,J1-1CK与J1-2CK接通,电机反转。

而指示方面,是将测速同轴电动机当成发电机使用,如图所示接一红一绿两个发光二极管,正转时,绿灯亮;反转时,红灯亮。

并且亮度随着转速的增加而增加,非常直观。

3.软件设计

3.1编程环境

采用的是C语言编程,利用KEILμvision2进行编译和仿真,使用STC专用下载板将HEX文件烧录到89C52单片机中。

3.2系统基本参数及流程

本设计采用的是20M晶振,12分频,所以每个指令周期为T=0.6μS。

中断方面,本程序一共用了3个中断源:

定时器0,定时器2以及外部中断1,它们的优先级分别为:

定时器0、外部中断1为高优先级,定时器2为低优先级。

另外还用了计数器1,用做计算脉冲宽度,与外部中断1一起构成测速系统。

3.3按键程序

按键的程序方面,主要是一个消抖动程序和,消抖动程序是非常有必要的,因为在平时没有按下键的时候,有可能会从电源或者其他地方突然产生一个尖峰电压,打在单片机检测按键的I/O口上,令单片机误以为有键按下了;或者是当人按下按键时候,如果手抖动,就会引起按键的接触不良,从而可能在很短时间内通-断多次,而导致单片机的处理错误。

3.4流程图

图7系统流程图

3.5PWM程序

因为电机调速是本次设计的最主要任务之一,所以PWM程序也是程序中最重要的一环。

PWM的调速原理是通过调节一个斩波周期中的脉冲占空比来调节电机功率而达到调速目的。

本设计中,PWM的斩波周期为1ms,那也就是说斩波频率为1KHz,在理论上能达到1‰线性可调,也就是能以0.1%的调节精度来调节PWM占空比。

PWM调速子程序是放在定时器0中断中进行的,中断设置如下:

//------T0-----------T0用作斩波

ET0=1;//中断允许位

time0_set=300;

time0_tmp=65536-(time0_set)*fosc/12;//

TH0=(time0_tmp/256);

TL0=(time0_tmp%256);

TF0=0;//CLRTF0

TR0=1;//SETBTR0

PT0=1;//高优先级

可以看出,T0的中断级别为高,因为PWM的脉冲宽度就是在中断程序里设定,如果此时被其他更高级别的中断打断,那么脉冲宽度将不准确,从而导致控制转速失败。

所以将其设为高的话,就不存在被打断的问题了。

下面是PWM的中断子程序:

voidtime0_int(void)interrupt1

{

TH0=(time0_tmp/256);

TL0=(time0_tmp%256);

if(cut==1)

{

time0_tmp=65536-time0_set*20/12;

cut=0;

}

else

{

time0_tmp=65536-(time0-time0_set)*20/12;

cut=1;

}

}

程序中,cut为PWM信号输出口,也就是P1.1口,每进入一次中断,cut口就反向一次,而每次中断计时都由time0_set确定,time0_set也就是脉冲宽度,由外部赋给,范围从150~970,其值每增加1,电机转速就增加6圈/分,所以可以算出精度为1‰,而实际上,我们选用的误差允许范围为±20圈/分,精度为3‰。

但比起一般单片机自带的PWM输出口的1%线性可调精度高多了。

图8PWM波形示意图

图中为PWM输出波形图,A为占空比为95%时的波形,B为50%时的,C为5%时的波形。

从图中可以得出,当PWM输出A的波形时,电机将以全速运转;而输出B时,电机则以50%的速度运转;而当输出C时,电机转动速度将非常慢,并且伴随着很大的噪音和震动,可以感觉出电机内部的运转不连续。

3.6测速系统程序

本设计中测速系统的工作原理为:

利用电机轴上带的圆盘的缺口,引起光电开关产生高电平脉冲,单片机就采集此脉冲的宽度,加以计算,得出其实时速度。

具体实现如下:

平时缺口不在光电开关处时,光电开关处于断开状态,输入到单片机口电平为低,当圆盘缺口的其中一边刚运转到令光电开关接通时,单片机INT1口电平跳变为高,此时计数器1以内部时钟信号为周期开始计数,然后当圆盘转到缺口的另外一边刚好令光电开关断开时,单片机INT1口产生一个下降沿信号,计数停止,并进入INT1中断子程序,在中断里把脉冲宽度转存出来并经过运算,就可得出实时速度值。

所以,测速程序得用到一个外部中断INT1,以及一个计数器1。

先看看和它们相关的标志位设置:

//-------外部中断1--------用做测速

IT1=1;//为跳沿触发方式,引脚INT1上的电平从高到低的负跳变有效。

IE1=0;//中断请求标志

EX1=0;//外部中断1允许位

PX1=0;//为高优先级

//------T1-----------T1用做计数

TH1=0;

TL1=0;

TF1=0;//中断请求位

TR1=0;//计数器1关闭

ET1=0;//禁止T1溢出中断

//--------------------------------

IE=0xaa;//

TMOD=0x91;//

//---------------------------

TOMD=10010001,前四位用于控制和确定定时器/计数器1的功能和工作模式:

第8位为门控位GATE,当GATE=1时,定时器/计数器1的启动要由外部中断引脚和TR1位共同控制。

只有当中断引脚INT1为高时,且TR1置1才能计数器工作。

第4和第5位为01,则说明计数器1工作在方式1:

全16位计数器,总共能计数65536个时钟脉冲,也就是最多能计时39ms。

程序流程图如下:

图9测速系统流程图

外部中断1中断服务子程序如下:

voidout1_int(void)interrupt2

{

IE1=0;

EX1=0;

TR1=0;

TH1_1=TH1;

TL1_1=TL1;

TH1=0;

TL1=0;

m=1;

}

函数中,TH1_1,TL1_1就是存放计数器1的计数值的缓冲区,当它们从TH1和TL1中取得数值之后,TH1和TL1随即被清零,为下一次计数做好准备。

获取脉冲宽度值子函数如下:

voidgetwidth_1()

{

TH1=0;

TL1=0;

n=0;

n1=n;

while(INT1==1&&((n-n1)<30))//n为每1MS+2

{}

if(INT1==0)

TR1=1;//计数器1打开

else

gotoout;

//IE1=0;//中断请求标志

EX1=1;//外部中断1启动

n=0;

n1=n;

while(m==0&&((n-n1)<30))

{}

if(m==0)//M=1,则已经进入out_int1中断,若等于0,则说明30MS延时已过

{

TH1_1=0;

TL1_1=0;

}

out:

IE1=0;//中断请求标志

m=0;

EX1=0;//外部中断允许位

TR1=0;

width_1=(TH1_1*256+TL1_1);//timepr=脉冲宽度/μS

}

此外,为了稳定测得的转速值,在程序中加了一个取平均值的函数:

voidgetwidth()

{

intgw,gw1;

width=0;

gw1=0;

for(gw=0;gw<6;gw++)

{

GG:

getwidth_1();

if(width_1!

=0)

widthbuf[gw]=width_1;

else

gotoGG;

}

width=(widthbuf[0]+widthbuf[1]+widthbuf[2]+widthbuf[3]+widthbuf[4]+widthbuf[5])/6;

这段函数的意思就是,将测得的连续6个不为零的脉冲宽度取平均值,以消除偶然的不稳定因素,使转速显示更加稳定。

3.7PID调节程序

PID调节计算公式如下[5]:

YK=KP*EK+KI*EK2

YK:

要输出的数据增量

EK:

设定值和实测值的差值

EK1:

上次的EK值

EK2:

EK-EK1的差值

KP:

比例系数(本程序中设KP=1.6)

KI:

积分系数(本程序中设KI=1.5)

由于在本电机调速系统中,仅使用PI调节便足以达到理想的精度和超调量,所以就毋须再加上微分项。

凑试的经过就是先将KI项设成0,然后将KP设为1,如果系统稳定,就按每次+0.1往上加,结果表明,在KP=1.7的时候,调速系统失控,电机一直保持全速运转,所以为了使调节速度达到最大,就将KP设为1.6,但是此时系统非常不稳定,速度值一直在±1000转上下跳动,于是将KI设成2,系统马上稳定下来,再按每次-0.1的差值往下减,经过多次尝试,得出KI=1.5为最佳积分值。

此时,系统处于最佳运行状态,实验中表现为:

电机原来速度为2000,当设置为4500转时,可以在2秒之内迅速上升并稳定于4500±20,而超调量也仅为+300转/分,出现在第一次上升的时候,下来之后便趋于稳定了。

 

PID程序如下:

voidPI()

{

EK1=EK;

EK=speed_set-speed;

EK2=EK-EK1;

if(PIn==0)

{

EK2=1000;

PIn++;

}

YK=KP*EK+KI*EK2;

}

4.参数测试及性能分析

4.1系统参数测试

轮盘直径28mm,缺口宽度2mm,缺口所在直径为25mm,缺口所在周长为78.54mm,和缺口宽度比例为39.3:

1,那么轮盘转一圈所需时间t_pr=width*39.3,

本系统用于测速的方法为测量缺口所引起的脉冲宽度值,由于使用计数器,所以必然存在一个溢出的问题,单片机的晶振频率为20MHz,所以一个机器周期为0.6μS,一个16位计数器最多能计数216个机器周期,所以最长能计数216*0.6μs的时间,也就是39.3ms,也就是说,当缺口的一边触发了计数器,但是在39.3ms的时间内还不能转到另外一边使计数器停止,那么计数器就将溢出,单片机就自动识别速度为0,那么此时的速度就将无法识别。

也就是说,根据上面轮盘转一圈所需时间公式:

t_pr=width*39.3,这时候的t_prmax=39.3*39.3=1.54s,所以可知其速度为38转/分钟。

也就是说,单片机所能识别的最低速度为38转/分。

但这只是理论计算速度,实际上单片机能测的最低速度要比这稍微高点,大约为100转/分。

我们再看看PWM的斩波控制精度:

PWM频率为1kHz,也就是1ms为一个周期,而每周期里又被分成1000分,占空比可以以每1‰作为调节单位。

电机最大速度为6000转/分,此时对应PWM占空比为1000‰,也就是说,占空比每增加1‰,电机速度将增加6转/分,也就是说电机的调速精度可达1‰。

当转速稳定的情况,在PI调节的作用下,真实转速和设定转速的差值控制在±20rad/min,也就是说误差范围在±3‰以内。

下面是速度变化时的超调量的表格和其对应的超调曲线图:

表1:

速度变化时的峰值

序号

初始转速

设定转速

峰值1

峰值2

总用时/s

1

1500

3000

3100(+100)

2970(-30)

2

2

2000

4000

4120(+120)

3980(-20)

2.2

3

1500

5000

5100(+100)

4960(-40)

2.3

4

4000

2000

1862(-138)

2030(+30)

2.4

5

5000

1500

1315(-185)

1523(+23)

2.7

6

5000

3000

2300(-700)

3100(+100)

2.9

 

图速度变化曲线

上图中1~6序号所对应的虚线代表设定转速,而曲线则是转速变化曲线,所以上图表示的就是速度从初始速度变化到设定速度的过程,并直观的表示出了变化过程中的速度的变化速率和超调量。

控制超调量,是由程序中的PI()函数控制的,其中P是控制变化速度,而I就是影响系统稳定性。

从表中和图中我们都能看出,速度处于上升时候的稳定性明显比下降时候的要好,尤其是速度从5000下降到3000的时候,超调量竟然达到700。

分析原因的话,觉得可能是由于惯性作用所导致的这种情况:

由于电机的转子和外接轮盘具有很大的惯性,特别是在速度很快的时候,而下降的时候,控制器是让其速度自由滑落,所以当其速度到达设定值的时候,还具有很大惯性,所以就会引起比较大的超调量。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 辩护词

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2