单片机的云台控制设计.docx
《单片机的云台控制设计.docx》由会员分享,可在线阅读,更多相关《单片机的云台控制设计.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机的云台控制设计.docx](https://file1.bdocx.com/fileroot1/2023-2/21/67252425-bde8-46e1-a28e-b58165abe291/67252425-bde8-46e1-a28e-b58165abe2911.gif)
单片机的云台控制设计
河南机电高等专科学校
《C51程序设计》大作业
设计题目:
单片机的云台控制设计
1设计任务:
本次设计是以单片机为控制器,设计一个云台控制系统,使云台按期望的方式运行。
本次设计完成的任务:
(1)设计单片机外围电路及步进电机驱动电路,驱动云台步进电机运行。
(2)使用键盘输入控制云台步进电机。
(3)PC使用RS485总线远距离控制云台步进电机。
1.1单片机
单片机是指一个集成在一块芯片上的完整计算机系统。
尽管它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:
CPU、
内部和外部总线系统。
单片机是将中央处理器,随机存储器,只读存储器,定时器芯片和I/O接口电路集成于一个芯片上的微控制器。
单片机以其价格低廉,功耗小,工作可靠,可编程等优点,得到应用者的青睐。
单片机是靠程序的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很多力气才能做到的,有些则是花大力气也很难做到的。
单片机通过编写的程序可以实现高智能,高效率,以及高可靠性。
单片机所具有的特点:
(1)高集成度,体积小,高可靠性
(2)控制功能强
(3)低电压,低功耗,便于生产便携式产品
(4)易于扩展
(5)优异的性价比
目前单片机渗透到人们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
2电路原理图
3系统流程
整个云台控制系统分为初始化,键盘扫描,串口中断,延时程序和步进电机运转五部分。
主函数通过调用各子程序来实现键盘扫描,串口中断程序的调用来实现步进电机的控制。
本设计的系统主程图如图6-1所示,中断子程序流程图如图6-2所示。
图6-1系统主流程图
图6-2中断子程序流程图
3.1初始化模块
所谓初始化就是在应用系统中,需要对软件进行初始化设置,以能够满足该系统的正常工作。
在本系统中,如果没有初始化,则该系统无法正常工作。
本系统中初始化程序包括两部分,一部分是定时器初始化,另一部分是串口初始化。
而这些都是通过设置相应的特殊功能寄存器来实现的。
本设计中定时器初始化包括定时/计数器选择、定时/技术器工作方式、计数器装初值、打开定时器;串口初始化包括串口工作方式设置、打开串口、开总中断。
和定时/计数器有关的特殊功能寄存器有TOMD、TCON,和串口相关的特殊功能寄存器有SCON、PCON。
前面已经介绍了特殊功能寄存器,这里不再赘述。
串口工作方式1的波特率由定时/计数器T1、T2的溢出速率和SMOD共同确定,计算公式为波特率=(
/32)·(TI溢出率),TI溢出率=fosc/{12×[256—(TH1)]},本系统波特率为9600bit/s,晶振频率为11.0592MHz,串口选择工作方式为1,所以初值等于0xfa。
定时计数器的初始化编程步骤:
(1)根据定时时间要求或计数要求计算初值;
(2)工作方式控制字送TMOD;
(3)送计数初值到THx和TLx寄存器中;
(4)启动定时/计数器,即将TRx置位。
3.2键盘模块
综合考虑,本设计单片机I/O资源比较丰裕,所以采用了独立式键盘。
独立式键盘的每一个按钮直接控制单片机的P0相连接,当其中有一个按钮被按下时,PO口的相应位就被置为高电平,没有按下则为低电平。
所以单片机只需要识别PO的值就可以做出相应的动作。
3.3延时模块
通过用C语言写一段循环程序,来占用CPU一段时间从而达到延时的目的。
在该系统中,延时程序有至关重要的作用,一是作为普通的延时程序,而是产生步进电机的工作所需脉冲频率,延时的多少决定步进电机的转速,在本系统中,对步进电机的转速没有做过多要求,所以采用了for循环语句构成的比较简单的延时程序,如果对延时时间、步进电机转速有要求的系统中,则可以使用定时器定时,定时器的精度相当高。
下面是采用普通延时的程序源代码:
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
3.4串口中断模块
在本系统中,单片机通过串口向单片机发送远距离控制信号,一旦PC机发送控制信号后,单片机接受到信息产生中断,通过中断服务程序去控制步进电机动作。
由于串口中断具有优先级别高的特点,所以不需要担心键盘和串口信息发生冲突。
3.5步进电机动作模块
在本系统中,步进电机的运行方式选用的是单、双8拍运行方式,即按A-AB-B-BC-C-CD-D-DA-A或者相反顺序通电的。
单片机的P2的低四位分别连接的是控制云台竖直方向转动电机的A、B、C、D四相,高四位则分别接的是控制云台水平方向转动的电机的A、B、C、D四相。
在编程中,将步进电机通电相的正序、反序分别放在两个数组中,在电机动作模块中使用不同的数组,就能达到控制电机的正转、反转,它们分别为moveup[]、movedown[]、movelefe[]、moveright[]。
另外为了还在本次系统只还设置了自动运行方式,这种方式是通过循环调用moveup[]、movedown[]、movelefe[]和moveright[]函数来实现自动运行的。
4源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
uchari,a,flag,u;
codetabup[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//竖直电机正转1~2相励磁
codetabdown[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//竖直电机反转1~2相励磁
codetableft[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//水平电机正转1~2相励磁
codetabright[]={0x60,0x20,0x30,0x10,0x90,0x80,0xc0,0x40};//水平电机反转1~2相励磁
voidcontrol(uchar);
voidmoveauto();
voidmoveup();
voidmovedown();
voidmoveleft();
voidmoveright();
voiddelay(uchar);
voidinit()//初始化
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xFA;
TL1=0xFA;
TR1=1;//开定时器
PCON=0x80;
SCON=0x50;//9600,n,8,1
EA=1;//开总中断
ES=1;//开串口中断
}
voidserial()interrupt4//串口中断
{
RI=0;
a=SBUF;
control(a);
delay
(1);
}
voidcontrol(ucharl)//中断控制电机动作
{
switch(l)
{
case'A':
moveup();break;
case'B':
movedown();break;
case'C':
moveleft();break;
case'D':
moveright();break;
case'Z':
flag=1;break;
default:
break;
}
}
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidmoveup()//竖直方向向上
{
flag=0;
if(P10!
=1)
{
for(i=0;i<8;i++)
{
P2=tabup[i];
delay(50);
}
}
}
voidmovedown()//竖直方向向下
{
flag=0;
if(P11!
=1)
{
for(i=0;i<8;i++)
{
P2=tabdown[i];
delay(50);
}
}
}
voidmoveleft()//水平方向向左
{
flag=0;
if(P10!
=1)
{
for(i=0;i<8;i++)
{
P2=tableft[i];
delay(50);
}
}
}
voidmoveright()//水平方向向右
{
flag=0;
if(P10!
=1)
{
for(i=0;i<8;i++)
{
P2=tabright[i];
delay(50);
}
}
}
voidmoveauto()//自动运行
{
P1=0;
while(!
P10)
{
for(i=0;i<8;i++)
{
P2=tabup[i];
delay(50);
}
}
while(!
P11)
{
for(i=0;i<8;i++)
{
P2=tableft[i];
delay(50);
}
}
while(!
P12)
{
for(i=0;i<8;i++)
{
P2=tabdown[i];
delay(50);
}
}
while(!
P13)
{
for(i=0;i<8;i++)
{
P2=tabright[i];
delay(50);
}
}
}
voidcontrolkey(uchari)//按键控制电机动作
{
switch(i)
{
case1:
moveup();break;
case2:
movedown();break;
case4:
moveleft();break;
case8:
moveright();break;
case16:
flag=1;break;
default:
break;
}
}
voidmain()
{
P1=0;
flag=0;
init();
while
(1)
{
if(flag==1)
{
moveauto();//自动运行
}
P0=0xff;
u=P0;
controlkey(u);
}
}
5参考文献
[1]康晓明.电机与拖动[M].北京:
国防工业出版社,2005.8
[2]刘锦波,张承慧等.电机与拖动[M].北京:
清华大学出版社,2006.9
[3]戴佳.单片机C51语言应用程序设计[M].北京:
电子工业出版社,2006.7
[4]王英杰,林怡青,彭美春,聂一彪.基于VC++6.0的PC机和单片机串口通信[J].电脑应用技术,2006年第67期
[5]邱育桥.基于MSComm的PC机与单片机串行通信程序设计[J].科技信息,2009年第15期
忽略此处..