模拟天地飞7接收机的无人机自主飞行,基于51单片机实现

       笔者参加了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
  • 5
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值