直流电机调速zzz1.docx
《直流电机调速zzz1.docx》由会员分享,可在线阅读,更多相关《直流电机调速zzz1.docx(26页珍藏版)》请在冰豆网上搜索。
![直流电机调速zzz1.docx](https://file1.bdocx.com/fileroot1/2022-12/14/bf04228e-62a5-41d7-8090-8c5f4e88c247/bf04228e-62a5-41d7-8090-8c5f4e88c2471.gif)
直流电机调速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(rdatedate1--;
}
if(k0==1&zf==0x0f)//反转"zf"
{
run(date1);
if(rdate>f)
date1--;//如果实际转速f小于设定转速rdate,那么date1减1,run(date1)减速
if(rdatedate1++;
}
}
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;