笔者参加了2018年武汉中国地质大学的机器人比赛,虽成绩不理想,但是基于51控制飞行器的程序开发过程可以分享给大家,比赛经验也可以分享给大家。
本科生基于自主飞行的较少,主要是研究生参与,而且可以使用成品机进行比赛,与我们一同比赛的队伍中,部分队伍使用了大疆的精灵、悟等进行比赛。而且比赛分值主要集中与物品的投放与飞行稳定,其分值为300;自主飞行的分值为100。
言归正传,51单片机模拟天地飞7接收机的输出信号为pwm,其频率我们使用示波器测量为47.17Hz,占空比为4.71%到9.75%,不同接收机可能略有不同。
其中最关键的地方是信号之间存在2ms的相位差,我们卡在此处相当长的时间,我们采用的是大疆的NAZA飞控,如果不存在2ms的相位差,飞行器会乱飞。
而芯片也很重要,老式的51单片机程序执行速度过慢,在中断程序未完成时,又进入了中断,输出频率不稳定,所以我们采用了STC12C5A60S2,程序执行较好。
PWM输出的中断程序,可以产生4路PWM,可以产生2 ms的相位差:
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
TH0=0XFF; //给定时器赋初值,定时55us
TL0=0xCD;
a++;
b++;
c++;
d++;
f++;
if(a==A_C)
{
X=0;
}
if(b==B_C)
{
Y=0;
}
if(c==C_C)
{
Z=0;
}
if(d==D_C)
{
X_Y=0;
}
if(a==343) //频率47.17
{
X=1;
a=0;
}
if(b==375) //频率47.17
{
Y=1;
b=32;
}
if(c==407) //频率47.17
{
Z=1;
c=64;
}
if(d==439) //频率47.17
{
X_Y=1;
d=96;
}
}
通过改变A_C B_C C_C D_C的数值可以调整PWM的占空比。
此时芯片执行勉强达到要求,因为每改变一个参数,改变PWM占空比过大,难以调整到飞行器信号居中的输出,所以可以的话,建议使用stm32。
以下是我们比赛程序,
#include"reg51.h"
#include"intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
/*对数据类型进行声明定义*/
u8 receiveData; //定义方向变量
u8 receiveData0;//定义旋转变量
sbit X=P2^0; //定义P20口是左右 A
sbit Y=P2^1; //定义P21口是前后 E
sbit Z=P2^2; //定义P22口是油门 T
sbit X_Y=P2^3; //定义P23口是自旋 R
sbit s1=P2^5; //定义P25口是高度
sbit s2=P2^6; //定义P26口是高度
static u16 a; //左右的参数
static u16 b; //前后的参数
static u16 c; //油门的参数
static u16 d; //自旋的参数
static double f; //时间的参数
static u16 A_C; //关于a的参数
static u16 B_C; //关于b的参数
static u16 C_C; //关于c的参数
st