基于51单片机的直流电机转速测量与控制.docx
《基于51单片机的直流电机转速测量与控制.docx》由会员分享,可在线阅读,更多相关《基于51单片机的直流电机转速测量与控制.docx(24页珍藏版)》请在冰豆网上搜索。
基于51单片机的直流电机转速测量与控制
基于51单片机的直流电机转速测量与控制
单片机原理与应用
课程设计
院系信息工程学院
班级自动化121
学生姓名张晓峰
学号121404010432
日期2015/7/9
任务要求
基于51单片机的直流电机转速测量与控制
一、设计目的
1.通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用有进一步的了解。
2.掌握定时器、终端的设置和变成原理。
3.掌握单片机原理、结构、指令、接口及应用。
4.通过此次课程设计能够将单片机硬件结合起来,获得单片机应用系统设计的基本理论,基本只是和基本技能,掌握单片机应用系统各主要环节的设计、调试方法。
二、基本要求
1.,以80C51的基本知识和方法为基础,通过系统扩展达到应用单片机的目的。
2.根据应用系统结构规模的要求,掌握单片机外部扩展系统的硬件设计的基本过程,正确合理选择期间,绘制应用系统原理图。
3.根据设计任务和要求,画出程序整体流程图,然后进行各程序模块的设计,编写控制程序。
4.掌握如何应用单片机仿真器或编程器来开发应用及仿真调试的过程,反复修改测试直至完成任务。
三、设计内容
设计并调试一个程序使其实现如下功能:
1.在实验平台上通过键盘输入一个转速的设定值(例如25rpm),并在数码管上显示;
2.采用比例调节方法,使电机转速稳定在设定值;
3.测量电机的转速,并在实验平台数码管上显示;
4.转速稳定后,可随时修改转速设定值;
5.优化比例调节系统,使电机转速的调节时间较短,并尝试加入积分、微分环节,改善转速的静态和动态特性。
电机转速不允许出现振荡。
图4实验箱DAC0832
1.1霍尔传感器测速及转速计算方法
1.2.1霍尔传感器测速原理
霍尔传感器在测量机械设备的转速时,被测量机械的金属齿轮、齿条等运动部件会经过传感器的前端,引起磁场的相应变化,当运动部件穿过霍尔元件产生磁力线较为分散的区域时,磁场相对较弱,而穿过产生磁力线较为几种的区域时,磁场就相对较强。
霍尔转速传感器就是通过磁力线密度的变化,在磁力线穿过传感器上的感应元件时,产生霍尔电势。
霍尔传感器的霍尔元件在产生霍尔电势后,会将其转换为交变电信号,最后传感器的内置电路会将信号调整和放大,输出矩形脉冲信号。
另外,霍尔传感器的测量必须配合磁场的变化,因此在霍尔传感器测量非铁磁材质的设备时,需要事先在旋转物体上安装专门的磁铁物质,用以改变传感器周围的磁场,这样霍尔传感器才能准确的捕捉到物质的运动状态。
本试验箱的霍尔传感器如下图所示
图5实验箱霍尔传感器
1.2.2测速方法
由于直流电机转速较小,所以采用T法测速,T发测速的原理如下
T法是测量两个脉冲之间的时间换算成周期,从而得到频率。
因存在半个时间单位的问题,可能会有1个时间单位的误差。
速度较高时,测得的周期较小,误差所占的比例变大,所以T法宜测量低速。
如要增加速度测量的上限,可以减小编码器的脉冲数,或使用更小更精确的计时单位,使一次测量的时间值尽可能大。
计算公式为:
T法测速的分辨率
T法测速误差率
低速时,编码器相邻脉冲间隔时间长,测得的高频时钟脉冲个数M2多,所以误差率小,测速精度高,故T法测速适用于低速段。
测速流程图如下图所示
图6转速测量流程图
1.3键盘扫描显示
使用6×4的小键盘,向列扫描码地址逐列输出低电平,然后从行码地址读回。
图76×4的键盘矩阵
如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码值为高。
这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
在判断有键按下后,要有一定的延时,防止键盘抖动。
否
是
是
否
否
是
图8键盘扫秒流程图
1.2PID控制
本次的课程设计采用的PID控制,调速性能好,通过调节比例常数、积分常数、微分常数使得转速控制达到想要的精度。
PID参数的调节有试凑法和实验法,本课程设计采用的是实验法。
现介绍如下:
实验法的整定步骤为“先比例,再积分,最后微分”。
整定比例控制
将比例控制作用由小变到大,观察各次响应,直至得到反应快、超调小的响应曲线。
整定积分环节
若在比例控制下稳态误差不能满足要求,需加入积分控制。
先将步骤
中选择的比例系数减小伟原来的50%-80%,再将积分时间置一个较大值,观测响应曲线。
然后减少积分时间,加大积分作用,并相应调节比例系数,反复试凑至得到较满意的响应,确定比例和积分的参数。
整定微分环节
若经过步骤
,PI控制只能消除稳态误差,而动态过程不能令人满意,则应加入微分控制,构成PID控制。
先置微分时间TD=0,逐渐加大TD,同时相应地改变比例系数和积分时间,反复试凑至获得满意的控制效果和PID控制参数。
2硬件电路的连接和程序的调试
本次的课程设计是基于SICElab-G2100实验箱设计,采用模块化结构。
实验箱如下图所示
图9SICElab-G2100实验箱
硬件接线如下:
把第17号模块“并行数模转换”中的DAC0832输出Aout孔连第23号模块“直流电机”的Dcin孔,数模转换DAC0832的CS17孔和Xfer孔连第38号模块“片选信号”中的YS2孔,WR1孔和WR2孔连第33号模块“控制总线”的/WR孔,CKM孔(霍尔传感器输出孔)连“Lab51CPU板”的P3.2孔。
第38号模块“片选信号”中YS0(0800H)孔连第40号模块“键盘+数码管”CS40孔。
连线
连线孔1
连线孔2
连线
连线孔1
连线孔2
1
Aout
Dcin
5
WR2
/WR
2
CS17
Xfer
6
CKM
P3.2
3
Xfer
YS2
7
CS40
YS0
4
WR1孔
WR2
表1硬件电路连线
图10接线图
按图中接线,编写程序,调试PID参数,经过反复的实验,转速可以快速的达到设定值,且不会出现振荡,运行结果如下图所示
图11转速为4r/s时运行结果图12转速为12r/s时运行结果
图13转速为45r/s时运行结果
3创新与改进
实验箱自带的有RS232,可以利用串口通讯,将矩阵键盘输入给定值改为通过串口通讯的方式,通过PC机键盘给定,或者编写Labview程序,使用Labview串口给单片机送给定值。
4心得体会
经过1个星期的课程设计,留给我印象最深的是要设计一个成功的程序,必须要有要有扎实的理论基础,还要有坚持不懈的精神。
本产品实现了对直流电机的调速和测速,个人感觉其中还有许多不够完善的地方,例如:
对电机的驱动电路采用的DAC0832,直接将数字量转为模拟量进行控制,精度不高,不过作为学生实验足够了。
此次的设计并不奢望一定能成功,但一定要对已学的各种知识能有一定的运用能力,我做设计的目的是希望能检查下对所学知识的运用能力的好坏,并且开始慢慢走上创造的道路,这是非常可贵的一点。
这次的课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解。
同时,在老师的身上我学得到很多实用的知识,林老师在我们完成的基础上添加新的东西,转速给定值可以通过串口通讯,PC机发送数据,也可以编写Labview程序,通过虚拟旋钮给定转速值,为此给我们培训了一下虚拟仪器及检测技术,对Labview做了简单介绍,给我们入了门。
对林老师专业知识的渊博表示敬佩,在此我表示感谢!
同时,和同学的互相交流,使我有新的创意,新的理解,在此表示感谢!
5附录
#include"reg52.h"
#include"absacc.h"
#defineLEDLen6
unsignedcharcount;
unsignedcharTS;
floatDA;
longintn;
unsignedintt;
unsignedcharKey_temp;
unsignedchark_TEMP[2];
xdataunsignedcharCS0832_at_0xA000;
xdataunsignedcharOUTBIT_at_0x8002;
xdataunsignedcharOUTSEG_at_0x8004;
xdataunsignedcharIN_at_0x8001;
charcodedx516[3]_at_0x0023;
unsignedcharLEDBuf[LEDLen];
codeunsignedcharLEDMAP[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
codeunsignedcharKeyTable[]={
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
};
intPID();//PID函数声明
voidInit();//初始化函数声明
voiddelay(unsignedcharms)//延时函数
{
unsignedcharx,y;
for(x=ms;x>0;x--)
for(y=110;y>0;y--);
}
unsignedcharTestKey()//检测是否有键值键入
{
OUTBIT=0;
return(~IN&0x0f);
}
unsignedcharGetKey()//获取键值
{
unsignedcharPos;
unsignedchari;
unsignedchark;
i=6;
Pos=0x20;
do{
OUTBIT=~Pos;
Pos>>=1;
k=~IN&0x0f;
}
while((--i!
=0)&&(k==0));
if(k!
=0){
i*=4;
if(k&2)
i+=1;
elseif(k&4)
i+=2;
elseif(k&8)
i+=3;
OUTBIT=0;
dodelay(10);while(TestKey());
return(KeyTable[i]);
}
elsereturn(0xff);
}
voidDisplayLED()//显示转速
{
unsignedchari;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;
for(i=0;i{
OUTBIT=0;
LED=LEDBuf[i];
OUTSEG=LED;
OUTBIT=Pos;
delay(5);
Pos>>=1;
}
OUTBIT=0;
}
voidt0()interrupt1//PID控制,采样周期500ms
{TS++;
TH0=256-50000/256;
TL0=256-50000%256;
if(TS==10)
{TS=0;
DA=PID();
}
}
voidtime1_int(void)interrupt3//计算脉冲周期
{
TH1=256-50000/256;
TL1=256-50000%256;
t++;
}
voidex0()interrupt0
{
n=1000/(50*t+((TH1-61)*256+TL1-176)/1000);//计算转速
TR1=1;//启动定时器1
t=0;
TH1=256-50000/256;
TL1=256-50000%256;
}
intPID()//PID控制函数
{
unsignedcharP=1.4;//比例常数
unsignedcharI=2.2;//积分常数
unsignedcharD=0.2;//微分常数
unsignedintLastError=0;//Error[-1]
unsignedintPrevError=0;//Error[-2]
unsignedintError=0;//Error[0]
intOut;//outcome
Error=Key_temp-n;
//增量式PID计算
Out=Out+P*(Error-LastError)+I*Error+D*(Error+PrevError-2*LastError);
//误差更新
PrevError=LastError;
LastError=Error;
//输出限幅
if(Out<0)
{
Out=0;
}
if(Out>255)
{
Out=255;
}
returnOut;
}
voidInit()//初始化函数
{IT0=1;//跳变沿触发
EX0=1;//外部中断0允许
TMOD=0X11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定时器写初值
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;//启动定时器0
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
EA=1;//开总中断
}
voidmain()//主函数
{
unsignedchari=0;
n=0;
Init();//
while
(1)
{CS0832=DA;
if(TestKey())
{
Key_temp=GetKey()&0x0f;
LEDBuf[i]=LEDMAP[Key_temp];
k_TEMP[i]=Key_temp;
i++;
if(i==2)
{i=0;
}
}
Key_temp=k_TEMP[0]*10+k_TEMP[1];//将获得的键值转换成十进制数
LEDBuf[4]=LEDMAP[n/10];
LEDBuf[5]=LEDMAP[n%10];//显示实时转速
DisplayLED();
}
}