简易直流电动机控制器设计Word下载.docx

上传人:b****6 文档编号:19584805 上传时间:2023-01-08 格式:DOCX 页数:18 大小:408.91KB
下载 相关 举报
简易直流电动机控制器设计Word下载.docx_第1页
第1页 / 共18页
简易直流电动机控制器设计Word下载.docx_第2页
第2页 / 共18页
简易直流电动机控制器设计Word下载.docx_第3页
第3页 / 共18页
简易直流电动机控制器设计Word下载.docx_第4页
第4页 / 共18页
简易直流电动机控制器设计Word下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

简易直流电动机控制器设计Word下载.docx

《简易直流电动机控制器设计Word下载.docx》由会员分享,可在线阅读,更多相关《简易直流电动机控制器设计Word下载.docx(18页珍藏版)》请在冰豆网上搜索。

简易直流电动机控制器设计Word下载.docx

所以,当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的基极至少得提供16uA的电流才能使8050饱和,事实上,10K的上拉电阻,加上I/O口的限流电阻,能提供(5-0.7)V/13.3K=350uA,远大于所需要的16uA,所以完全能提供足够的电流。

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

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

图中D3二级管的作用:

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

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

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

2.4测速电路

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

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

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

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

反正,V1集电极输出为低,V3集电极输出为高。

这里要注意的就是几个大字阻值的选取:

R25:

一般发光二极管的正向压降2V,驱动电流5mA左右,而电流最大不能超过20mA,所以选取510

的电阻作为其限流电阻,一来保证不会过流烧坏发光管,二来也不会因电流太小而使光电开关不能正常工作。

R22:

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

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

R24:

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

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

图4测速电路

三软件设计

3.1编程环境

由于汇编语言程序可读性和可移植性都较差,采用汇编语言编写单片机应用程序不但周期长,而且调试和排错也比较困难。

为了提高编制单片机应用程序的效率,改善程序的可读性、可移植性,采用高级语言无疑是移植更好的选择。

C语言是一种同样的计算机程序设计语言,既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,表达和运算能力也比较强,许多以往只能采用汇编语言来解决的问题现在都可以改用C语言解决。

所以,本设计采用的是C语言编程,利用KEILuvision4进行编译和仿真,使用专用下载板将HEX文件烧录到89C52单片机中。

3.2系统基本参数及流程

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

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

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

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

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

3.3按键程序

按键程序方面,主要是一个消抖动程序。

消抖动程序是非常必要的,因为在平时没有按下键的时候,有可能会从电源或者其他地方突然产生一个尖峰电压,打在单片机检测按键的I/O口上,令单片机误以为有键按下了;

或者是当人按下按键时候,如果手抖动,就会引起按键的接触不良,从而可能在很短时间内通断多次,而导致单片机的处理错误。

消抖动程序就是针对这方面来设计的,具体是:

当单片机检测到某一个按键按下了,就延时100ms,在这100ms里不停的检测,如果中间检测到按键弹起了,则判为干扰,不进行处理,如果100ms之后还是按下的话,那么就可以确定此键确实是被按下了,然后就进行相应的处理。

一般人按一下按键都有个200ms,所以延时100ms已经足够了。

程序流程图如下:

 

3.4PWM程序

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

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

本设计中,PWM的斩波周期为1ms,那也就是说斩波频率为1KHz,在理论上能达到1%。

线性可调,也就是能以0.1%的调节精度来调节PWM占空比。

PWM调速子程序是放在定时器0中断中进行的。

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

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

下面是PWM的中断子程序:

程序中,cut为PWM信号输出口,也就是P1.1口,每进入一次中断,cut口就反向一次,而每次中断计时都有time0_set确定,time0_set也就是脉冲宽度,有外部赋给,范围从150-970,其值没增加1,电机转速就增加6圈/分,所以可以算出精度1%。

而实际上,我们选用的误差范围为

20圈/分,精度为3%。

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

图5PWM输出波形

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

从图中可以得出,当PWM输出A的波形时,电机将以全速运转;

而输出B时,电机则以50%的速度运转;

而当输出C时,电机转动速度将非常慢,而且伴随着很大的噪音和震动,可以感觉出电机内部的运转不连续。

3.5测速系统程序

测速是本设计的另外一个重点。

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

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

具体实现如下:

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

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

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

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

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

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

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

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

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

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

3.6PID调节程序

PID调节计算公式如下:

YK=KP*EK+K1*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转/分,出现在第一次上升的时候,下来之后便趋于稳定了。

四参数测试及性能分析

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

PWM的斩波控制精度:

PWM频率为1KHz,电机最大速度为6000转/分,此时对应PWM占空比为100%。

当转速稳定时,在PI调节的作用下,真实转速和设定转速的差值控制在

20rad/min,也就是说误差范围在

3%以内。

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

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

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

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

五总结

在设计中,使用89C52单片机输出PWM信号实现对小功率直流电机进行调速,系统有按键设定转速,通过光电开关测速,将测得的速度反馈给单片机,经PI运算后输出PWM信号确定斩波调压电路,然后控制电机形成闭环控制。

本本还对本系统的超调量、控制精度、控制速度等方面做了详细的分析。

通过这次设计,对单片机的指令结构,接口电路,C语言的编程技巧,以及和电机控制相关的知识都有了更深的理解。

同时也深刻体会到了基础知识的重要性,比如电路基础里面的L,C电路及暂态构成,电子技术里的三极管放大,高等数学里的微积分等等。

掌握固定的基础知识,是对学习新技术的保障,更是开发的前提。

参考文献

【1】《电动机的单片机控制》王晓明北京航空航天大学出版社

【2】《MCS-51系列单片机原理与接口技术》李玉峰、倪虹霞人民邮电出版社

【3】《80C51系列单片机C语言设计完全手册》求是科技人民邮电出版社

【4】《51单片机C语言应用程序设计实例精讲》戴佳、戴卫恒电子工业出版社

附录1

程序清单

#include<

reg52.h>

#indlude<

intrins.h>

voidclear_shake()

{

if(nn==0)

{n=0;

}

if(nn1==0)

nn=1;

if(shake==0&

&

n>

=100)//shake就是被按下的键

{

shake=1;

nn1=1;

nn=0;

}

Voidtime0_int(void)interrupt1

TH0=(time0_tmp/256);

TLO=(time0_tmp%256);

if(cut==1)

time0_tmp=65536-time0_set*20/12;

cut=0;

else

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

cut=1;

voidout1_int(void)interrupt2

IE1=0;

EX1=0;

TR1=0;

TH1_1=TH1;

TL1_1=TL1;

TH1=0

TL1=0;

M=1;

voidgetwidth_1()

TH1=0;

Intn=0;

Intn1=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=脉冲宽度/us

voidgetwidth()

{

intgw,gw1;

width=0;

gw1=0;

for(gw=0;

gw<

6;

gw++)

GG:

getwidth_1();

If(width_1!

=0)

Widthbuf[gw]=width_1;

gotoGG;

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

voidPI()

EK1=EK;

EK=speed_set-speed;

EK2=EK-EK1;

if(PIn==0)

{

EK2=1000;

PIn++;

YK=KP*EK+KI*EK2;

Voidmain()

{inttime0_set,time0_tmp;

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

ET0=1;

//中断允许位

time0_set=300;

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

TL0=(time0_tmp%256);

TF0=0;

//CLRTF0

TR0=1;

//SETBTR0

PT0=1;

//高优先级

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

IT1=1;

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

//外部中断1允许位

PX1=0;

//为高优先级

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

TH1=0;

TL1=0;

TF1=0;

//中断请求位

//计数器1关闭

ET1=0;

//禁止T1溢出中断

IE=0XAA;

//

TMOD=0X91;

char_shake();

time0_int();

getwidth()

out1_int();

PI();

附录2

元件清单

电阻10K5个

3.3K1个

1K1个

5101个

有极电容100u1个

10u1个

电容30pF2个

1041个

晶振20M1个

按钮5个

90121个

80501个

光敏三极管(NPN)1个

三极管(NPN)1个

二极管1个

发光二极管1个

电机1个

电源5V1个

12V1个

附录3

原理图

附录4

实物图

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

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1