航模组筋斗云 古今组Word格式.docx
《航模组筋斗云 古今组Word格式.docx》由会员分享,可在线阅读,更多相关《航模组筋斗云 古今组Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
信号输出引脚,高电平有效。
当CPU访问片外存储器时,在ALE引脚输出高电平期间用于将低8位地址锁存起来。
平常ALE引脚输出矩形脉冲,频率为晶振频率的1/6。
因此ALE引脚也可用来作时钟脉冲。
例如:
当晶振频率fosc为12MHz时,ALE引脚输出2MHz的方波。
(31脚):
低电平时CPU访问片外程序存储器;
高电平时CPU先访问片内程序存储区4KB的地址范围,若访问片内程序存储器的地址超过4KB范围时,CPU会自动使PC指向片外程序存储器。
4个8位并行I/O接口:
用来输入/输出数据。
P0口(P0.0~P0.7):
39~32脚;
作低8位地址线和8位数据线用。
程序中用到外部存储器时,不能作I/O接口。
P0口在不作数据/地址总线时可作I/O口用,当作为输出口用时要外接上拉电阻。
P1口(P1.0~P1.7):
1~8脚;
是用户最常用的I/O口。
输出可直接(或通过同相反相驱动集成电路)带发光二极管或数码管。
图3-389C51单片机引脚图
P2口(P2.0~P2.7):
21~28脚;
可作为8位I/O接口,又可有第二功能,若某个P3
表3-1P3口第二功能
口线
专用功能
P3.0
RXD
P3.4
T0
P3.1
TXD
P3.5
T1
P3.2
P3.6
P3.3
P3.7
口位已经用作第二功能,就不能再用作I/O接口使用。
一般在接有片外数据存储器或I/O芯片的情况下,P3.6()和P3.7()不作为I/O使用。
P3口的第二功能如表3-1所示。
一.方案说明
无刷电机加加速度传感器
优点:
无刷电机转速较快,可以提供较大转矩,同时利用加速度传感器获取数据,通过PID校正,使其实现相关功能。
缺点:
无刷电机较难控制,但加速度传感器动态误差大,需要自行调整。
二.详细设计方案
a.外形设计模块
外形采用塑料管作支架,铝合金作为杠杆,铁棒作为转轴,基本实现外观设计要求。
b.电机模块
电机采用新西达无刷电机,同时配上相关电调,利用52单片机实行对电机实行控制,当需要平衡时,根据传感器数据,适当调整占空比,使装置达到相应位置;
当需要正反转时,分别给两个电机不同占空比,从而使他们旋转起来。
c.加速度传感器模块
加速度传感器采用ADXL345三轴传感器,当加速度传感器随着装置一起旋转时,传感器实时传回数据给单片机,由单片机进行处理。
虽然加速度传感器在动态测量上存在一定误差,但考虑到实际转速不高,以及相应处理,可以把误差控制在一定范围内,所以直接利用采集回来的数据进行处理。
d.按键模块
由于调试需要,装置设置了模拟按键模块,
即程序不断扫描按键,看是否有相应管脚输入低电平,若有,占空比就增加。
输入低电平功能,由短接线将相应管脚和地端连接实现。
三.程序流程图
四.程序清单
#include<
reg52.h>
intrins.h>
string.h>
stdlib.h>
#include"
global.h"
serial.h"
sbitc=P1^0;
sbita=P1^1;
sbitb=P0^1;
sbitpwm=P2^2;
//PWM信号输出
sbitpwm1=P2^3;
sbitkey=P3^5;
sbitkey1=P3^4;
intn=0,m=0,h=20,g=20;
unsignedintt0=0;
visualscope.h"
adxl345.h"
intput;
charresults1,results2;
doubleInput,Output,Setpoint;
doubleerrSum,lastErr,dErr;
doublekp,ki,kd,timeChange;
voidpid()
{
doubleerror=Setpoint-Input;
errSum+=(error*timeChange);
dErr=(error-lastErr)/timeChange;
Output=kp*error+ki*errSum+kd*dErr;
lastErr=error;
}
voidSetTunings(doubleKp,doubleKi,doubleKd,doubletimechange)
{
kp=Kp;
ki=Ki;
kd=Kd;
timeChange=timechange;
}
voidqudong()
a=1;
delayms(Output);
a=0;
delayms(50);
voiddelayms(unsignedcharxms)
unsignedchari,j;
for(i=xms;
i>
0;
i--)
for(j=110;
j>
j--);
//1.09ms
voidTime0_Init()//定时器初始化
TMOD=0x01;
//定时器T0与T1设为工作方式1
TH0=(65536-91)/256;
//T0赋初值
TL0=(65536-91)%256;
ET0=1;
//开始计数
TR0=1;
//允许T0中断
EA=1;
//开总中断
voidTime0_Int()interrupt1//中断程序
TH0=(65536-91)/256;
//0.1ms
TL0=(65536-91)%256;
t0++;
m++;
n++;
if(n<
=h)pwm=1;
=g)pwm1=1;
if(h<
n&
&
n<
200)pwm=0;
if(g<
m&
m<
200)pwm1=0;
if(n>
=200)n=0;
if(m>
=200)m=0;
voidmain()
unsignedchari;
charcData[10];
charY;
unsignedcharbyLen;
unsignedintwGyroX;
unsignedintwGyroY;
unsignedintwGyroZ;
g=20;
h=20;
Time0_Init();
while(t0<
15000);
t0=0;
h=6;
g=6;
20000);
h=7;
g=7;
while
(1)
{
if(key==0)
{
delayms(10);
if(key==0)
{
h=h+1;
if(h>
=30)h=0;
while(!
key);
}
}
if(key1==0)
if(key1==0)
g=g+1;
if(g>
=30)g=0;
SetTunings(5,5,5,50);
//串口初始化
serial_init();
memset(cData,0,10);
//开总中断
EA=1;
#if1
printchar('
S'
);
T'
A'
R'
#endif
InitDev();
//读器件数据
ReadDevData(&
wGyroX,&
wGyroY,&
wGyroZ);
//发送到串口示波器
cData[0]=wGyroX;
cData[1]=wGyroX>
>
8;
cData[2]=wGyroY;
cData[3]=wGyroY>
cData[4]=wGyroZ;
cData[5]=wGyroZ>
cData[6]=0x32;
cData[7]=0x90;
cData[8]=Checksun(&
cData[0],8);
cData[2]=0xff;
cData[3]=0xff;
h=7;
if(wGyroY>
0xf000)
{cData[2]=cData[2]-32;
cData[2]=cData[2]-0x01;
cData[2]=(~cData[2]);
cData[2]=cData[2]+32;
}
else
{
cData[2]=cData[2]-32;
P1=cData[2];
cData[4]=0xef;
Input=cData[4]/219;
put=Input*1000;
if((put<
1000)&
(put>
996))
{
c=0;
pid();
qudong();
delayms(500);
}}
5.总结
此次比赛三人分工明确,总体看来,古今负责主程序的设计,徐道鸿负责电路的设计和焊接,曹璨负责相关资料的搜集。
在制作的过程当中,遇到了不少困难和障碍,也出现了程序难以实现功能,编译不能通过以及调试后不能实现硬件正常工作的情况,但是都一一克服了,或者换其他的方法越过。
出现问题大家通常一起讨论,提出解答方案再决策采取哪一种最有措施。
合作和分工,相辅相成,相得益彰。
整个历程下来,徐道鸿,古今,曹璨负责作品的材料和各个电路配接等细节,较好地完成了布置下来的任务,取得较为满意的成果!