王庐山
摘要:选用STC单片机作为主控芯片,采用MPU6050九轴陀螺仪作用四轴飞行器的姿态传感器,飞控主板与遥控器的通讯采用2.4G无线模块。电机驱动采用场效应管,同时利用STC15单片机内部自带的硬件PWM控制飞机电机的转速,电源部分采用一节3.7V锂电池供电,经过升压为5V,再经过降为3.3V。与其它外围电路一起构成四轴飞行器的硬件系统。软件部分采用C语言模块化编程,提高开发效率。四轴飞行器在遥控器的控制下能够完成一键起飞、无线遥控、手动控制等功能。同时电脑上位机可实时显示四轴的飞行姿态。
关键词:STC15单片机;四轴飞行器;PWM控制;无线遥控;陀螺仪
0 引言
飞行器设计与制作越来越受学生的喜爱。但由于飞行技术涉及专业领域较多,致使他们望而却步。该四轴飞行器基于STC15微控制器,是中国宏晶公司自主研发的一款高性能微控制器,在全国大学生电子设计大赛中多有采用。本款四轴飞行器采用2.4G无线遥控器和WIFI控制,能一键起飞,弹射抛飞,还能够向上位机实时传回飞机的姿态,采用先进的飞控算法,PID控制,PWM调速功能。
同时学生既可以练习电子产品装配与调试技术,又可以学习STC15单片机技术,是典型的软硬件都可以学习的教学实训好载体。因此我们设计了这款四轴飞行器。让学生在玩中学,在学中玩。因此设计一款STC15微控制器为核心的四轴飞行器,市场前景看好。
1 四轴飞行器硬件系统设计
1.1 系统的总体设计
四轴飞行器主要由单片机最小系统电路、电源电路、电机驱动电路、2.4G无线通讯模块、九轴陀螺仪电路、超声波定高模块和串口通信模块六个部分组成。
传统51单片机是目前使用量最多的单片机,但其片内资源较少,而且A/D转换时需要外接芯片,并且没有PWM功能,而STC15W4K48S4单片机是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍,内部集成6路硬件PWM单元,8路高速10位A/D转换,针对强干扰场合。由于四轴飞行器器需要4路硬件PWM调速控制单元和4路A/D采集系统,因此四轴飞行器的CPU采用STC15W4K48S4单片机作为主控制芯片,该CPU完全兼容传统的51单片机,学习起来非常熟悉,参考资料多,降低了设计难度,便于学生开发。
本款四轴飞行器的四个电机采用MOS管驱动。利用STC内部自带的四路硬件PWM,P3.7、P2.1、P2.2、P2.3四个引脚分别为PWM2、PWM3、PWM4、PWM5。九轴陀螺仪MPU6050通过IIC总线与CPU的P3.4、P3.5相连。2.4G无线模块通过SPI总线接在CPU的P2.4、P2.5、P2.6、P2.7、P0.1。超声波定高模块接在P3.2和P3.4口,WIFI模块和程序下载接在P3.0和P3.1口。
1.2 电源电路设计
四轴的电源,我们采用3.7V的锂电池来供电。首先电池的3.7V电压送到BL8530进行升压处理,得到稳定的5V电压,5V电压主要供给STC15单片机、程序下载电路、MPU6050,超声波定高模块和磁场模块。5V的电压再经 ME6219进行降压,降到3.3V,供2.4G无线模块使用,电容C5、C6是退耦电容,起到抗干扰的作用。电容C14、C15、C16是滤波电容。L1、D6和U3一起作为开关电源,起到把3.7V电压升到5V的作用。D5是防电源插座防反接作用。CON2是3.7V锂粒子电池接口。
1.3 四轴飞行器电机驱动电路设计
STC15单片机I/O口,是不能直接驱动大电路器件的,本设计采用NMOS管SI2302来驱动电机,电路如图1所示。该MOS管的驱动电路可达3A,完全满足我们的设计需求。C9、C10、C11、C12都为退耦电容,用于滤除电机运行时的干扰。
当单片机发出PWM控制信号时,对于N沟道的MOS管来说,高电平导通,低电平截止。需要注意的是,在飞行器的电机驱动电路中,驱动电路的电源直接用电池的电源。
1.4 无线通信电路设计
无线通信采用NRF24L01模块,通过SPI总线与单片机通讯,接收遥控器发来信号,单片机收到控制信号后,做出相应的飞控动作。需要注意的是,无线模块采用3.3V供电。
1.5 九轴陀螺仪电路设计
飞控的姿态数据采集用陀螺仪 MPU6050,这部分的电路图比较简单,单片机通过IIC总线与陀螺仪电路相连,读取飞行器的姿态数据,然后进行数据融合或四元数转换,再经过PID运算,PWM输出控制飞行器的电机动作。
2 四轴飞行器软件系统设计
四轴飞行器主控系统软件分为主程序、MPU6050飛行器姿态读取子程序、PID数据融合与PWM子程序、无线通信子程序、超声波定高子程序五部分。
2.1 四轴飞行器主程序设计
在主程序中,首先对飞控用到的模块和端口初始化。初始化PWM、ADC转换功能、九轴陀螺仪MPU6050、2.4G无线通讯模块、定时器T0等。
NRF24L01先设定为发送状态,并发送飞控的姿态数据给上位机,然后设定无线模块为接收状态,接收遥控器发来的数据。
判断飞机是否失联,如果失联,则降低油门,归中航向、横滚、俯昂角,迫使飞机降落下来。当飞机未失联时,判断飞机是否解锁。
当处于解锁状态时,点亮流动状态灯,指示飞机处于正常状态,并且每2毫秒读取陀螺仪数据,超声波数据,进行数据融合,四元数据解算,PID运算和PWM控制,使得飞机的飞行状态在人的操作下,稳定的飞行。
2.2 MPU6050飞行器姿态读取子程序设计
单片机通过IIC总线读出陀螺仪的三轴加速度和三轴陀螺仪的数据,然后进行数据的处理。
MPU6050集成了三轴的陀螺仪和三轴加速度。角速度范围为±250、±500、±1000与±2000。MPU6050带有三轴陀螺仪,每个陀螺仪各自负责检测相应轴的转动速度,也就是检测围绕各个轴转动的速度。
通过I2C接口读出来的转换结果ADC值,并不是以度/每秒为单位。一般按以下公式进行转换:转换结果= ADC值/灵敏度。以量程为±1000°/s为例说明。假设读取x轴的ADC值为200,而在±1000°/s下的灵敏度为32.8LSB/(°/s)。根据上面的公式:转换结果=200/32.8=6.09756°/s。这就是说,MPU6050检测到模块正在以约6度每秒的速度绕X轴旋转。ADC值并不都是正的,当出现负数时,意味着该设备从现有的正方向相反的方向旋转。
2.3 PID、四元数数据融合、PWM控制子程序设计
PID、四元数数据融合、PWM控制子程序流程图如图2所示。四轴飞行器的PID采用双环控制。外环是角度,内环是陀螺仪。以X轴的PID为例说明操作过程。
①读取MPU6050飞控制的姿态数据,即三轴加速度和三轴陀螺仪数据。
Gyro_x=GetData(GYRO_XOUT_H);//读出X轴陀螺仪数据
Gyro_y=GetData(GYRO_YOUT_H);//读出 Y轴陀螺仪数据
Gyro_z=GetData(GYRO_ZOUT_H);//读出 Z轴陀螺仪数据
Accel_y=GetData(ACCEL_YOUT_H);//读出 X轴加速度数据
Accel_x=GetData(ACCEL_XOUT_H);//读出 Y轴陀螺仪数据
Accel_z=GetData(ACCEL_ZOUT_H);//读出 Z轴加速度数据
②根据选择的量程对陀螺仪和加速度数据进行转换,因为我们加速度的量程为±4g/S,所以要除以8192,陀螺仪的量程为±500度/S,所以要除以65.5。
Angle_ax=(Accel_x)/8192; //加速度处理
Angle_az=(Accel_z)/8192; //加速度量程±4g/S
Angle_ay=(Accel_y)/8192; //转换关系 8192LSB/g
Angle_gx=(Gyro_x)/65.5; //陀螺仪处理
Angle_gy=(Gyro_y)/65.5; //陀螺仪量程±500度/S
Angle_gz=(Gyro_z)/65.5; //转换关系65.5LSB/度
③四元数解算出欧拉解。
IMUupdate(Angle_gx*0.0174533,Angle_gy*0.0174533,Angle_gz*0.0174533,Angle_ax,Angle_ay,Angle_az);得到俯昂角AngleX和橫滚角AngleY。
④计算外环的误差。
Ax=-FR1+a_x-AngleX; 其中FR1为遥控器发来的横滚摇杆数据,ax为遥控器发来的横滚微调数据,AngleX为俯昂角。
⑤外环误差积分与限幅。
ERRORX_Out += Ax; //外环积分
if(ERRORX_Out > ERR_MAX)ERRORX_Out = ERR_MAX;//积分限幅
else if(ERRORX_Out < -ERR_MAX)ERRORX_Out = -ERR_MAX;//积分限幅
⑥算出外环的PID。
PID_Output = Ax*Out_XP + ERRORX_Out*Out_XI+(Ax-Last_Ax)*Out_XD; //外环PID
⑦计算内环误差。
gy=PID_Output-Angle_gy;PID_Outpu为外环的输出,作为内环的输入,Angle_gy为Y轴的陀螺仪值。
⑧内环误差积分与限幅。
if(YM > 30)ERRORX_In += gy;//内环积分(油门小于某个值时不积分)
else ERRORX_In = 0; //油门小于定值时清除积分值
if(ERRORX_In > ERR_MAX) ERRORX_In = ERR_MAX;
else if(ERRORX_In < -ERR_MAX) ERRORX_In = -ERR_MAX;//积分限幅
⑨算出总环的PID及限幅。
PID_Output = gy*In_XP + ERRORX_In*In_XI + (gy-Last_gy)*In_XD;
if(PID_Output > 1000) PID_Output = 1000;//输出量限幅
if(PID_Output < -1000) PID_Output = -1000;
⑩PWM控制四轴飞机的电机。
speed0 = 0 + PID_Output;speed1 = 0 - PID_Output;
speed3 = 0 + PID_Output;speed2 = 0 - PID_Output;
2.4 无线通讯子程序设计
主程序上电,通过SPI总线初始化NRF24L01,并配置为接收方式,当NRF24L01模块接收到数据后传递给主控制器,由主控制器进行数据处理。
NRF24L01模块每个数据帧为11个字节,这11个字节的功能依次为:失联变量、解锁或上锁命令值、油门变量、高低字节、航向变量、横滚变量、俯仰变量、设置参数变量、横滚微调值、俯昂微调值、航向微调值。单片机就是根据无线模块发来的数据,对飞行器进行控制。
参考文献:
[1]刘乾,孙志锋.基于ARM的四旋翼无人飞行器控制系统[J].机电工程,2011(10).
[2]赵鹤,王喆垚.基于UKF的MEMS传感器姿态测量系统[J].传感技术学报,2011(05).
[3]周江华,苗育红.四元数在刚体姿态仿真中的应用研究[J].飞行力学,2000(04).