自动平衡悬浮平台

要:

要求设计制作一个基于自动控制的,依靠自身动力悬浮的平台。我队三位成员通过对赛题的分析,结合我们的优势最终选择了制作一个基于MC9S12XS128单片机的自动平衡悬浮平台。在设计方案上,根据材料和能力仔细推敲方案的实际性和稳定性,我们最终确定了用四旋翼平台,主控板上的MCU通过处理ADXL345加速速计和HMC5883L磁罗盘的数据,解算出平台的姿态角(倾斜角、横滚角,自旋角)。将需要控制的信息传给KK板,KK板调节四个电机的转速改变平台姿态。整个系统是一个闭环控制系统,为达到控制系统的稳定性,我们将传感器信息通过软件滤波减少噪声,将控制信号通过PID调节达到稳定控制。

关键词:MC9S12XS128单片机、陀螺仪、加速度计、磁罗盘、无刷电调、PWM脉宽调制波、SCI串口通信、KK板、人体热释电传感器。

原文档内含文档内各种作图,如需原文档参考学习,请关注微信公众号
回复文章标题即可免费获取。文档仅供参考学习使用。

  • 引言

1.1自动悬浮平台设计理念

根据赛题要求,悬浮平台距离地面高度10cm以上,悬浮过程能维持15秒,以及平台前后位移不超过2cm,自旋不超过30°。要达到赛题的要求,必须要有一个稳定性很高的平台,而要让这个平台脱离地面并保持悬浮,首先想到的飞行器,而且是垂直起降的飞行器。因此,我们讨论了两种比较可行的方案,即单轴UFO和四旋翼飞行器。

在考虑姿态调整时,我们查阅了大量的资料,资料中显示一般采用三轴陀螺仪和三轴加速度计以及三轴磁罗盘通过捷联式惯性导航的算法解算姿态角,一般有AHRS和IMU两种。在此处我们遇到了庞大的理论壁垒,初次了解这样的理论我们确实觉得在电赛期间难以实现。于是我们进行理论的简化,根据我们理解,加速度计就可以确定平台的倾斜角和横滚角,条件是平台两个方向上的加速度为零,也就是平台是匀速倾斜。磁罗盘可以确定平台的航向角,这样我们可以让平台在调整姿态是自旋小于30°的。

在姿态调整时,控制电机方案上,我们最终通过KK板来控制电机,主控板通过给KK板发送调整命令,让KK板去具体实施调整。

在搜集四轴或单轴飞行器资料的时候发现,飞行器都是遥控控制。而我们采取的方案即类似人为的遥控信号,来完成平台的自动平衡。

第二章 统筹规划与设计方案

2.1设计方案

根据题目要求,我们认为有以下几种方案:

  1. 磁悬浮

磁悬浮主要包括电磁悬浮、光悬浮、声悬浮、气流悬浮、静电悬浮、粒子束悬浮……,由于磁悬浮系统是以电磁力完成悬浮、导向和驱动功能的,断电以后悬浮物体不易控制,容易给人或物体造成伤害,且磁悬浮系统中使用的永磁体造价高,系统较复杂,在电赛期间很难完成。

  1. 气垫船

按照气垫的形成和维持方法,气垫可分为周边射流式和增压室式两种。资料显示边射流式气垫是用风扇驱动空气进入气道,由周边的喷口喷出并拐折向外,形成射流式气幕,使内侧压力高于外侧压力,将航行器抬升起来。被封闭的气垫的压力大小同气幕喷射的速度、垫升高度和喷射角度有关。增压室式气垫是在航行器和运行表面之间构成一个较大的气室,空气经风扇驱动,进入气室,在底部周围泄出,气流流过气室后受到阻滞,空气由动压头转化为静压头,产生增压效应。我们认为在实际的应用中,对于气垫的流量、压力、垫升高度以及有关几何参数的计算比较复杂,我们经常用到的仪器都不能测量这些值,所以我们决定开辟新的思路。

  1. 飞行器

飞行器有很多种类:固定翼,单轴、双轴、多轴,火箭……,我们认为通过飞行器解决题目的只有垂直起降的飞行器,而在垂直起降的飞行器里面,我们比较容易实现的就是单轴和四轴。单轴飞行器有一个主螺旋桨,它提供升力,机体的下方有四个可以摆动的下摆,通过舵机控制。单轴是通过改变下方的摆页来改变空气流动方向从而改变姿态的。四轴飞行器的机体有四个电机,机体成十字型。通过改变四个电机来改变姿态,同时提供升力。

通过比较我们认为选择四轴飞行器的易实现性更大一点。

通过比较我们最终确定的设计方案是基于四轴飞行器的平衡平台,飞行器的姿态调整时通过改变轴上的电机来实现的(四轴飞行器的电机具体调节过程参照2.4 电机部分设计)。电机的控制直接由KK板来控制。控制KK板的信号由主控板根据平台的姿态给出合理的控制。

整个系统可以这样理解。飞行器成品一般是遥控方式。人通过启动飞行器,观察飞行器的姿态,给出不同的控制信号通过遥控器在2.4G的通信频带上发送给接收机,接收机将信号调制出来给KK板。由KK板控制电机的转动来控制飞行器姿态。方案示意图如下图2.1:

2.2电机部分设计

四轴电机控制由4路占空比为50HZ 的PWM波控制,主轴为正桨,电机逆转。侧轴为反桨,电机正转。

四轴平台在空中的姿态主要靠四个电机改变——{航向角(yaw)、

横滚角(pitch)、俯仰角(roll)}

航向角(yaw):

航向角通过改变主轴和侧轴电机的速度,改变电机的自旋力。电机在空中转动的时候,除了提供向下的推力之外,自己还会产生于绕轴相反的自旋力。我们将主轴电机的速度调的和侧轴速度不一样就可以实现航向角的改变。可以控制向两个方向旋转。

横滚角(pitch):

横滚角是通过定主轴的电机速度,改变两个侧轴电机的速度实现的。可以控制向左、向右两个方向翻滚。

俯仰角(roll):

俯仰角是通过定侧轴的电机速度,改变两个主轴电机的速度实现的。可以控制向前后两个方向旋转。

2.3姿态调整部分设计

自平衡的悬浮平台上用来姿态调整的传感器有加速度计——ADXL345、磁罗盘——HMC5883L、以及KK板上的陀螺仪模块。

ADXL345加速度计是ANALOG DEVICES公司生产的三轴数字加速度计,分辨率可高达13位。可通过SPI(三线和四线)和I2C数字接口读取数据。

加速度计

输出响应与相对于重力的方向关系如图2.3所示:

HMC5883L是HITTITE公司的一款三轴数字式磁罗盘传感器。HMC5883L 包括最先进的高分辨率HMC118X 系列磁阻传感器,并附带霍尼韦尔专利的集成电路包括放大器、自动

消磁驱动器、偏差校准、能使罗盘精度控制在

1°~2°的12 位模数转换器。

通过磁罗盘解耦出来的角度值,可以得到机体的自旋角,也就是航向角。

KK多轴控制器是一款用遥控器控制的2,3,4,6个动力多轴飞行控制板。它是用固定翼模式飞行的。要做到这样,它通过3个陀螺仪传感器将姿态信号反馈给主控芯片(Atmega168AP)然后通过KK软件处理姿态信息,传出控制信号给连接到KK控制板的电机电调。当接收到主控芯片的信号电调会加快或减慢电机速度来控制飞行状态。KK板的主控芯片可以通过ISP编程器来烧写程序。

KK板有很多飞行模式的固件。我们使用的是四轴十字飞行的固件,十字飞

行模式示意图如图2.4:

我们通过加速度计和罗盘得出机体的姿态角,将信息通过IIC总线传递给MC9S12XS128。这一步相当人将人眼观察到的飞行器姿态反馈给大脑。然后主控芯片给出四路控制信号——AIL横滚角、

ELE俯仰角、THR油门、RUDD方向给KK板。这一步相当于人通过大脑处理信息然后用遥控器将四路信息传给KK板。整个过程是个闭环的控制系统。

2.4软件设计

核心程序由两部分组成。主程序部分,通过单片机来实现SCI串口、IIC总线、ADXL345、HMC5883L、PIT定时中断、键盘等的初始化;PIT定时中断部分在子程序中实现启动KK板和平台的悬浮以及姿态调整。

下面是软件流程简图:

第三章 悬浮平台架构与设计实现

3.1 机体架构之四轴机体架构

悬浮平台所使用的材料如下表3.1:

材料名称

型号

个数

无刷电机

新西达 XXD A2212 KV1000

6个

无刷电调

XXD XXD 新西达 HW 30A

6个

锂电池

ACE 格11.1V 2200mAh

2块

四轴机架

X600

一架

魔术贴

---

若干

螺旋桨

正反桨 1045螺旋桨 10寸 10x4.5

2对

姿态传感器板

10DOF,L3G4200D…

一个

主控芯片

飞思卡尔“MC9S12XS128”

一片

保护圈

KT板

--

姿态调整板

KK V5.5

一片

热释电传感器

D203S

表3.1材料清单

平台完全由买回来的期间自己组装而成,所选材料都经过精心的挑选,满足负载能力,并有效的控制了制作成本(包括时间成本)。

3.4 硬件设计之主控板设计

本次悬浮平台的主控板采用的主控芯片是MC9S12XS128芯片,设计主控板主要考虑到我们要使用:SCI串口,两个按键,IIC总线口(I/O口模拟),四路级联的PWM输出口。以及检测人体热式电的传感器(具体电路图见附图A 电路图)

3.7 悬浮平台设计实现

悬浮平台各个部分安装好后,首次使用,或者更换电池需要对KK板校准,我们否则会有误差,误差的影响暂时没有把握。

校准后,就可以让KK板处在准备飞行的状态了。这个时候将按键P6按下,启动KK板,主控板也进入悬浮稳定状态。在平衡悬浮状态,平台角度超过危险角度或者电机转速增加到一定阶段,油门减少到最低档,暂停10秒钟后再次增加PWM波。

若想完成发挥部分,我们仅需要在上面的基础上加上定时15秒后进入移动模式。

用运动传感器检测运动的人体,得到信号后悬停住,LED灯显示危险信号

用NRF24L01将位移量和旋转量传送到PC机。

第四章 软件设计及测试过程

4.1前期测试

因为采用的方法是模拟遥控的方式,所以前期我们需要用遥控的方式使飞行器悬浮,然后测量控制信号。我们的测量分为校准、启动KK板部分的信号和持续时间和控制信号的占空比范围和控制效果。测量结果见表4.1:

4.2自控测试

得到前期测量的结果后,我们将数据融合到自控的程序中去。模拟遥控控制模式。在测试时,主控板将KK启动后,KK板的调节信息由姿态模块解算得出。我们发现,由于电机的不可避免抖动,加速度计比实际测试时的波动大很多,无法保证输出准确的倾角值,通过查阅资料,我们找到用卡尔曼滤波器的方案去解决,但是由于对这个复杂理论一时难以掌控,我们很难达到效果。这也是我队未能达到要求的主要原因。自控测试时的倾角信息采集如表4.2

4.3测试结果

由于时间仓促,以及测试调试的时间太为短暂,悬浮平台在悬浮超过一定高度后偏离过大。我们也很难马上得到解决平台悬停不稳的方法。

测试结果如下表所示:

设定值

启动模式

设定值偏小

设定值超过半值

设定值偏大

缓慢启动平台

波动小、原地转动

波动大;原地转动

原地向一边移动

中速启动平台

原地向一边旋动

总是有一边着地

一边翘起;移动

快速启动平台

一边翘起;移动较快

升起;受保护降落

升起较高,倾斜落下

表4.3 测试结果

在比赛的四天时间内我们没有得到比较好的悬浮效果。只要时间充足,本方案肯定是可以的。

第五章  结论及心得体会

总结此次比赛过程,我们发现我们存在以下方面的不足:

  1. 倾角传感器滤波没有掌握和运用

2、实际测试和理论存在比较大的偏差却没有想好补救措施

这些不足都让我们体会到在以后的工作学习过程中要博学、勤思。

本次电赛虽然没有达到比赛的要求,但是我们通过整个参赛过程学到了很多关于姿态调整的自动控制理论,这些理论不是短时间能够掌握的,但是相信在以后的学习过程中,我们会深入的了解和运用它。在电赛期间,我们的队员配合默契,在交流合作的过程中互相学习,学习到了宝贵的经验,相信在电子设计的道路上我们会越走越宽、勇往直前!

附录A电路图

图3.1主控板原理图

图3.2主控板PCB图

图3.3热释电传感器原理图

附录B 软件程序

部分程序

#include <hidef.h>      /* common defines and macros */

#include "Includes.h"      /* derivative-specific definitions */

#define OUT_X_L 0x28

#define OUT_X_H 0x29

#define OUT_Y_L 0x2A

#define OUT_Y_H 0x2B

#define OUT_Z_L 0x2C

#define OUT_Z_H 0x2D

#define PWMDTYMAX 1997

#define PWMDTYMID 1400

#define PWMDTYMIN 997

   uint8 start=1;

   uint16 TimInterCount;

   uint16 Timercount;

   uint16 PWM=0;

   uint8 ON_OFF=0;

   uint16 time1 = 0;

   uint8 Dangerous=0;

   uint8 *spwm1,*spwm2,*spwm3,*spwm4;

   uint8 i,j;

    int8 dis_data;

    uint8 wan;

    uint8 qian;

    uint8 bai;

    uint8 shi;

    uint8 ge;

    

   //L3G4200D

   int L3GX_data;

   int l3g_data;

   int *dx;

   int *dy;

   int *dz;

    uint8 BUFL3G[8];

    uint8 *time;

   //HMC5883L

    uint8 Rec_Data[8];//HMC5883L

    int HMC_X,HMC_Y,HMC_Z;//HMC5883L

    uint16 Acr; //HMC5883L

   //ADXL345

   uint8 *ax,*ay,*az;

    uint8 BUFADX[8];//ADXL345

    int ADXL_X,ADXL_Y,ADXL_Z;

    //NRF2401

    //uint8 *Rec;

   // uint8 transflag;

   // uint16 Rec_num;

   //volatile char nRF24L01RxBuf[21]="LQsend:000^_^",nRF24L01TxBuf[21]="LQsend:000^_^";

    uint8 msg[15] = "Hello! World!\n";

    uint8 Time[30];

    uint8 BODY[30];

uint8 cheak_key(void);

uint16 change_str(char ch[]);  

void main(void) {

  /* put your own code here */

  //0.1 主函数变量定义

  uint16 count;

  //transflag=1;

  //int8 surex,surey,surez;

  //0.2 关总中断

  DisableInterrupt();

  

  //0.3 芯片初始化

  MCUInit(FBUS_32M);//初始化时钟  32M

  

  //0.4 模块初始化

  SCIInit(0,FBUS_32M,9600);                   //串口0初始化

  SCISendN(0,13,msg);                           //发送"Hello! World!"

  PIT_Init();                                    //PIT中断初始化

  //NRF_Init();

  INIT_IIC();                                   //IIC总线初始化

  //LCD_Init();

  //Init_L3G4200D();

  Init_ADXL345();                               //陀螺仪初始化  

  Init_HMC5883L();                             // 磁罗盘初始化  

  Init_key();                                 //按键初始化

  PWM_Init();                               //PWM模块初始化

  //0.5 开放中断

  EnablePIT0;

  EnableInterrupts;

  //LCD_CLS();

  count=time1;

  Delay(50);

  while(start)

   {

        Delay(20000);

    //启动KK过程程序

       if(ON_OFF)

  {   

     if(start)

     {

   for(PWMDTY01=1400;PWMDTY01<1997;PWMDTY01+=10)

   {

   Delay(100);

   }

   Delay(20000);

   Delay(20000);

   PWMDTY01=1400;

   start=0;

    }

  }

  

   }

  for(;;)

  {

    readADXL345();                       //读取ADXL345数据

    Delay(50);

    recieve_ADXL345();

    Delay(20);

    readHMC5883L();//读取HMC5883L数据

    Delay(10);

    recieve_HMC588L();  

  

    _FEED_COP(); /* feeds the dog */

  } /* loop forever */

  /* please make sure that you never leave main */

}

   // PIT溢出中断处理函数

    __interrupt void isrPIT0ver(void)

    {   

       TimInterCount++;

   if(TimInterCount >= 4)

    {

        TimInterCount=0;

//确认KK板已经启动

        while(start==0)

         {

         Timecount++;

         if(Timecount>=20)//定时

         {

         flag_start=1;//启动油门加速,进入悬停状态

                 start=1;//标志位

         }

         }

         if(flag_start)

         {

         if(PWMDTY23 >= 1400)PWMDTY23=1400;

         else PWMDTY23+=5;

                  //加速时进行空中姿态调整  

           FLY_POR(ADXL_X,ADXL_Y,Acr);

         }

         //调整时如果倾斜角过大,油门熄火

         if(Dangerous)

         {

         PWMDTY23-=20;

         flag_start=0;

         if(PWMDTY23<1000)

         {

         flag_start=1;//一定时间后再次启动

         Dangerous=0;

         }

         }

        

//SCI串口显示数据给PC机 sprintf(BODY,"\nX=%d\tY=%d\tZ=%d\tAcr=%d\n",ADXL_X*3,ADXL_Y*3,ADXL_Z*3,Acr);

             //   SCISendString(0,BODY);

                

    }

   

        PITTF|=1<<0;                                  //清除中断标志位

      //EnableInterrupt();                             //开定时器中断

    }

原文档内含文档内各种作图,如需原文档参考学习,请关注微信公众号
回复文章标题即可免费获取。文档仅供参考学习使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值