直流电机调速zzz1.docx

上传人:b****6 文档编号:5250841 上传时间:2022-12-14 格式:DOCX 页数:26 大小:283.61KB
下载 相关 举报
直流电机调速zzz1.docx_第1页
第1页 / 共26页
直流电机调速zzz1.docx_第2页
第2页 / 共26页
直流电机调速zzz1.docx_第3页
第3页 / 共26页
直流电机调速zzz1.docx_第4页
第4页 / 共26页
直流电机调速zzz1.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

直流电机调速zzz1.docx

《直流电机调速zzz1.docx》由会员分享,可在线阅读,更多相关《直流电机调速zzz1.docx(26页珍藏版)》请在冰豆网上搜索。

直流电机调速zzz1.docx

直流电机调速zzz1

 

课程设计任务书

 

课程名称单片机原理及应用A

院(系、部、中心)自动化学院

专业自动化(数控技术)

班级

姓名

班级

学号

起止日期2012.1.2~2012.1.6

指导教师

目录

一、设计任务(要求)

二、总体方案

三、原理框图

四、系统模块详细设计与调试

五、参考文献

六、附件材料

内容部分

一、设计任务

(要求)

利用实验仪上的D/A变换电路键盘、数码显示电路,设计一个直流电机控制。

该直流电机控制具有如下功能:

(1)利用实验仪上的D/A变换电路,输出-8V至+8V电压,控制直流电机。

改变输出电压值,改变电机转速,用8255的PB.0读回脉冲计数,计算电机转速。

并由LED显示转速。

(2)设计按键对转速进行设定和转速显示的控制。

(创新部分)

(1)采用闭环控制:

利用光电测速法得出实际转速:

使用栅格圆盘和光电门组成测速系统。

当直流电机通过传动部分带动栅格圆盘旋转时,测速光电门获得一系列脉冲信号。

这些脉冲信号通过单片机两个定时/计数器配合,一个计数,一个定时。

计算出单位时间内的脉冲数m,经过单位换算,就可以算得直流电机旋转的速度。

本实验采用以r/sec为单位的转速加以显示。

将采集到的实际速度与程序给定速度数据比较,假定设定值为正转,则如果实际速度小于设定速度,那么将运行函数中速度形参自加1;相反,如果实际速度大于设定速度,将运行函数中速度形参自减一。

如果设定值反转,则同上,只需将运行函数中形参由自加改为自减,自减改为自加即可。

(2)添加模式设置功能

在矩阵键盘中,开辟出“c”键为模式键,第一次按下为模式1,此时除加减速按键“A”“B”键和模式键“C”外所有按键均被屏蔽,实现加减速模式,并通过数码管实时显示实际转速。

当再次按下模式键“C”时,进入模式2,此时屏蔽加减速按键,此模式为自设定转速模式,首先选择正转还是反转按键“E”和“F”键,数码管显示“E””F”,再选择速度,按下“0-9”按键进行速度设定,设定顺序为从高位到低位,为两位并实时显示,多余的输入数字将被屏蔽,只取最后两位。

完成设置后,按下确定键“D”键,电机开始转动。

此时除确认键“D”键外所有键均被屏蔽。

再次按下确认键,电机停止转动。

此时只开放模式按键“C”。

从设置模式开始入口系统功能。

至此,键盘功能完成一次,重复上述步骤,可以完成系统创新功能。

 

二、总体方案

在矩阵键盘中,开辟出“c”键为模式键,第一次按下为模式1,此时除加减速按键“A”“B”键和模式键“C”外所有按键均被屏蔽,实现加减速模式,并通过数码管实时显示实际转速。

当再次按下模式键“C”时,进入模式2,此时屏蔽加减速按键,此模式为自设定转速模式,首先选择正转还是反转按键“E”和“F”键,数码管显示“E””F”,再选择速度,按下“0-9”按键进行速度设定,设定顺序为从高位到低位,为两位并实时显示,多余的输入数字将被屏蔽,只取最后两位。

完成设置后,按下确定键“D”键,电机开始转动。

此时除确认键“D”键外所有键均被屏蔽。

再次按下确认键,电机停止转动。

此时只开放模式按键“C”。

从设置模式开始入口系统功能。

数码管除了现实实时转速外,在模式2中,设定转速时起到显示设定值的作用。

三、原理框图

下图为调速系统硬件原理框图:

图1原理框图

BCD拨码盘在实验中位矩阵键盘。

显示电路采用6段数码管显示。

速度测量为霍尔元件,测量实际转速并实时显示。

电机为简单实验直流电机。

此设计均在实验学校伟福实验箱上进行,硬件设计电路相对较少,但是开放性并不是太好。

相比普通试验箱有了增加了串口调试功能,相对有优势。

 

四、系统模块详细设计与调试

1、系统模块硬件详细设计

下图为用8255扩展的键盘和数码管模块的原理图。

图一8255扩展的键盘和数码管原理图

将MCU的cs0和8255的片选信号连接,是PB口PC口实现对矩阵键盘的扫描。

再将cs0与矩阵键盘模块的片选信号连接,是数码管的段址和位址为8004h和8002h(地址与实验箱内部连接电路有关),此图数码管采用pa口做段址,但实验中并为用,而是使用上述地址。

图2D/A转换电路原理图

将DA_CS与mcu的cs1连接,知D/A转换器数据段地址为9000h。

将(-8~+8V)输出端和直流电机输入端相连接。

图3直流电机和霍尔元件传感器原理图

直流电机为普通直流电机,通过输入端输入高低电平实现转速的快慢调节,霍尔元件输出端为输出脉冲信号,直流电机每旋转一周,输出为一个正脉冲。

2、系统模块软件详细设计和调试

1)系统显示环节

Display(qian,bai,shi,ge,zf)函数为数码管显示函数,分别为数码管从高位到低位,即从左到有显示5个数据,分别代表转速的千位、百位、十位、个位和正反转标识位,最后一个数码管关闭。

voiddisplay(ucharqian,ucharbai,ucharshi,ucharge,ucharzf)

{

outseg=table[qian];

outbit=0x20;

delay

(1);

outseg=0;

 

outseg=table[bai];

outbit=0x10;

delay

(1);

outseg=0;

 

outseg=table[shi];

outbit=0x08;

delay

(1);

outseg=0;

outseg=table[ge];

outbit=0x04;

delay

(1);

outseg=0;

 

outseg=table[zf];

outbit=0x02;

delay

(1);

outseg=0;

}

2)矩阵键盘设计

Keyscan函数为键盘扫描子函数,它每进行一次扫描后返回一个键值,此键值为键盘上的标志的字符的16进制数为0~f。

ucharkeyscan()

{

uchartemp,num,a;

num=0xff;//如果没有按键按下,num输出为0xff

a=0x0df;//11011111

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)//如果有按键按下

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys1strow

{

case(0x0e):

num=0;

break;

case(0x0d):

num=1;

break;

case(0x0b):

num=4;

break;

case(0x07):

num=7;

break;

}

while(temp!

=0x0f)//等待按键松手

{

temp=col_in;

temp=temp&0x0f;

}

}

}

a=0x0ef;//11101111

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys2row

{

case(0x0e):

num=0x0f;//反转按键

break;

case(0x0d):

num=2;

break;

case(0x0b):

num=5;

break;

case(0x07):

num=8;

break;

}

while(temp!

=0x0f)//等待按键松手

{

temp=col_in;

temp=temp&0x0f;

}

}

}

a=0x0f7;//11110111

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys3row

{

case(0x0e):

num=0x0e;//正转按键

break;

case(0x0d):

num=3;

break;

case(0x0b):

num=6;

break;

case(0x07):

num=9;

break;

}

while(temp!

=0x0f)//等待按键松手

{

temp=col_in;

temp=temp&0x0f;

}

}

}

a=0x0fb;//11111011

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys4row

{

case(0x0e):

num=0x0d;//确定按键

break;

case(0x0d):

num=0x0c;//模式切换(调速,定速切换)

break;

case(0x0b):

num=0x0b;//减速按键

break;

case(0x07):

num=0x0a;//加速按键

break;

}

while(temp!

=0x0f)//等待按键松手

{

temp=col_in;

temp=temp&0x0f;

}

}

}

returnnum;

}

3)数据采集与闭环调速环节

此环节放在定时器0的中断函数中实现,在中断服务函数中将计数器1脉冲处理转换为转速,单位为r/sec。

voidtimer(void)interrupt1//定时器0

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

b++;

a++;

display(qian,bai,shi,ge,zf);//20ms刷新数码管显示

if(a==10)//闭环调速周期10*10*2=200ms

{

a=0;

if(k0==1&zf==0x0e)//分为正转"e"反转"f"

{

run(date1);

if(rdate>f)//如果实际转速f小于设定转速rdate,那么date1加1,run(date1)加速

date1++;

if(rdate

date1--;

}

if(k0==1&zf==0x0f)//反转"zf"

{

run(date1);

if(rdate>f)

date1--;//如果实际转速f小于设定转速rdate,那么date1减1,run(date1)减速

if(rdate

date1++;

}

}

if(b==25)

{

b=0;//500ms计算一次转速

f=TL1;//将计数值放入f

TL1=0;//计数器清零

f=f*2;

qian=f/1000;

bai=f%1000/100;

shi=f%100/10;

ge=f%10;

}

}

4)直流电机输入

Run()函数为直流电机运行函数,形参a为设定转速转换后的十六进制数。

voidrun(uchara)

{

cs0832=a;

}

5)模式控制主函数环节

主函数在此就不列出了,在附录中有列出,为main函数。

功能在总体方案中一叙述,不再赘述。

六、参考文献

《单片机原理及应用实验指导书》,屈波等编,2007年

《单片机原理及应用》,赵德安等编,机械工业出版社,2004

《单片机基础》,李广弟等,北京航空航天大学出版社,2004年

七、附件材料

含硬件图、程序清单及说明、元器件清单和实物图片等

1)硬件图

上面已经给出,此处不再显示。

2)程序清单

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#definecol_inXBYTE[0x8001]//8255PORTPBaddresscs0--8255pb--键盘行扫描读入

#definerow_outXBYTE[0x8002]//8255PORTPCaddresscs0--8255pc--键扫列扫描送出

#definemode_comXBYTE[0x8003]//8255modeadress

#defineoutsegXBYTE[0x8004]//displaysegaddresscs0--数码管--段址

#defineoutbitXBYTE[0x8002]//displaybitaddress数码管--位址

#definemode_word0x82//8255mode_wordpa_out,pb_in,pc_out

#definecs0832XBYTE[0X09000]//8032addresscs1--DA地址

ucharcodetable[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};//“0-f”

uintf=0;

ucharc1=0;

ucharspeed=0x80;

uchari=0,zf=0x0e;

//i按键值--十六进制数值

//f为实际转速r/min

//zf--在定速模式下正反转的显示,

//zfbz--zfbz=1表示正转,2反转,

ucharqian,bai,shi,ge;

uchark0=0,b=0;

uchardate1=0;

uchardate=0,rdate=0x0;

uchara=0;

//延时z毫秒

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//显示程序,从高向低位显示

voiddisplay(ucharqian,ucharbai,ucharshi,ucharge,ucharzf)

{

outseg=table[qian];

outbit=0x20;

delay

(1);

outseg=0;

 

outseg=table[bai];

outbit=0x10;

delay

(1);

outseg=0;

 

outseg=table[shi];

outbit=0x08;

delay

(1);

outseg=0;

 

outseg=table[ge];

outbit=0x04;

delay

(1);

outseg=0;

 

outseg=table[zf];

outbit=0x02;

delay

(1);

outseg=0;

}

voiddisplay1(ucharqian,ucharbai,ucharshi,ucharge,ucharzf)

{

outseg=table[qian];

outbit=0x20;

delay

(1);

 

outseg=table[bai];

outbit=0x10;

delay

(1);

 

outseg=table[shi];

outbit=0x08;

delay

(1);

 

outseg=table[ge];

outbit=0x04;

delay

(1);

 

outseg=table[zf];

outbit=0x02;

delay

(1);

 

}

//0832运行程序

voidrun(uchara)

{

cs0832=a;

}

 

//键盘扫描程序,出口参数为键盘标识值的十六进制数

ucharkeyscan()

{

uchartemp,num,a;

num=0xff;//如果没有按键按下,num输出为0xff

a=0x0df;//11011111

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)//如果有按键按下

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys1strow

{

case(0x0e):

num=0;

break;

case(0x0d):

num=1;

break;

case(0x0b):

num=4;

break;

case(0x07):

num=7;

break;

}

while(temp!

=0x0f)//等待按键松手

{

temp=col_in;

temp=temp&0x0f;

}

}

}

a=0x0ef;//11101111

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys2row

{

case(0x0e):

num=0x0f;//反转按键

break;

case(0x0d):

num=2;

break;

case(0x0b):

num=5;

break;

case(0x07):

num=8;

break;

}

while(temp!

=0x0f)//等待按键松手

{

temp=col_in;

temp=temp&0x0f;

}

}

}

a=0x0f7;//11110111

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys3row

{

case(0x0e):

num=0x0e;//正转按键

break;

case(0x0d):

num=3;

break;

case(0x0b):

num=6;

break;

case(0x07):

num=9;

break;

}

while(temp!

=0x0f)//等待按键松手

{

temp=col_in;

temp=temp&0x0f;

}

}

}

a=0x0fb;//11111011

row_out=a;

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

delay(5);

temp=col_in;

temp=temp&0x0f;

while(temp!

=0x0f)

{

switch(temp)//get4keys4row

{

case(0x0e):

num=0x0d;//确定按键

break;

case(0x0d):

num=0x0c;//模式切换(调速,定速切换)

break;

case(0x0b):

num=0x0b;//减速按键

break;

case(0x07):

num=0x0a;

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

当前位置:首页 > 高等教育 > 艺术

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

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