基于51单片机的直流电机转速测量与控制Word下载.docx

上传人:b****4 文档编号:6444906 上传时间:2023-05-06 格式:DOCX 页数:24 大小:1.96MB
下载 相关 举报
基于51单片机的直流电机转速测量与控制Word下载.docx_第1页
第1页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第2页
第2页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第3页
第3页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第4页
第4页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第5页
第5页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第6页
第6页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第7页
第7页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第8页
第8页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第9页
第9页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第10页
第10页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第11页
第11页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第12页
第12页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第13页
第13页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第14页
第14页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第15页
第15页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第16页
第16页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第17页
第17页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第18页
第18页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第19页
第19页 / 共24页
基于51单片机的直流电机转速测量与控制Word下载.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的直流电机转速测量与控制Word下载.docx

《基于51单片机的直流电机转速测量与控制Word下载.docx》由会员分享,可在线阅读,更多相关《基于51单片机的直流电机转速测量与控制Word下载.docx(24页珍藏版)》请在冰点文库上搜索。

基于51单片机的直流电机转速测量与控制Word下载.docx

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

Aout

Dcin

5

WR2

/WR

2

CS17

Xfer

6

CKM

P3.2

3

YS2

7

CS40

YS0

4

WR1孔

表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"

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>

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;

8)

i+=3;

dodelay(10);

while(TestKey());

return(KeyTable[i]);

elsereturn(0xff);

voidDisplayLED()//显示转速

unsignedcharLED;

for(i=0;

i<

LEDLen;

i++)

{

LED=LEDBuf[i];

OUTSEG=LED;

OUTBIT=Pos;

delay(5);

}

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;

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();

}

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

当前位置:首页 > 高中教育 > 高考

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

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