1、 本科生单片机课程设计报告湖南大学电气与信息工程学院本科生单片机课程设计报告课 题:光电平衡小车专业班级:电自六班目录第一章车模整体设计方案31.1两轮自平衡智能车整体框架31.2直立任务分解.51.3车模直立控制.91.4车模速度控制101.5车模方向控制10第二章程序控制说明112.1主程序框架116.1电机死区补偿126.2角度单闭环控制136.3角度、速度双闭环控制14第二章车模机械设计153.1车模地盘安装153.2车模编码器安装153.3车模电池位置改装16第三章车模硬件电路设计18第四章卡尔曼滤波184.1卡尔曼滤波简介184.2使用卡尔曼滤波的原因184.3卡尔曼滤波原型204
2、.4卡尔曼滤波化简214.5卡尔曼滤波参数整定23第五章车模参数调试图解29附录源代码30附录硬件电路图30个人总结30第一章 车模整体设计方案1.1两轮自平衡智能车整体框架智能车是在车模结构的框架上,搭上硬件结构,通过MC9S12XS128单片机的处理能力,将传感器采集到的信息处理分析后得出运算结果,指挥电机做出适应赛道及战术策略的响应的一套系统。其硬件结构框架如下图:电源模块S12XS128控制核心单片机加速度计模块控制器模块CCD路径检测测速模块陀螺仪模块电机驱动模块1.2 直立行走任务分解电磁组比赛要求车模在直立的状态下以两个轮子着地沿着赛道进行比赛,相比四轮着地状态,车模控制任务更为
3、复杂。为了能够方便找到解决问题的办法,首先将复杂的问题分解成简单的问题进行讨论。为了分析方便,根据比赛规则,假设维持车模直立、运行的动力都来自于车模的两个后车轮,后轮转动由两个直流电机驱动。因此从控制角度来看,由控制车模两个电机旋转方向及速度实现对车模的控制。车模运动控制任务可以分解成以下三个基本任务:(1) 控制车模直立:通过控制两个电机正反向运动保持车模直立状态;(2) 控制车模速度:通过控制两个电机转速速度实现车模行进控制;(3) 控制车模转向:通过控制两个电机之间的转动差速实现车模转向控制。以上三个任务都是通过控制车模两个后轮驱动电机完成的。可以假设车模的电机可以虚拟地被拆解成三个不同
4、功能的驱动电机,它们同轴相连,分别控制车模的直立平衡、前进行走、左右转向,如图2.1所示。图 2.1 车模运动控制分解示意图直流电机的力矩最终来自于电机驱动电压产生的电流。因此只要电机处于线性状态,上述拆解可以等效成三种不同控制目标的电压叠加之后,施加在电机上。在上述三个任务中保持车模直立是关键。由于车模同时受到三种控制的影响,从车模直立控制的角度,其它两个控制就成为它的干扰。因此在速度、方向控制的时候,应该尽量平滑,以减少对于直立控制的干扰。三者之间的配合如图2.2所示。图 2.2 三层控制之间相互配合,底层尽量减少对于上层的干扰上述三个控制各自独立进行控制,它们各自假设其它两个控制都已经达
5、到稳定。比如速度控制时,假设车模已经在直立控制下保持了直立稳定,通过改变电机的电压控制车模加速和减速。车模在加速和减速的时候,直立控制一直在起作用,它会自动改变车模的倾角,移动车模的重心,使得车模实现加速和减速。1.3 车模直立控制控制车模直立的直观经验来自于杂技表演。一般的人通过简单练习就可以让一个直木棒在手指尖上保持直立。这需要两个条件:一个是托着木棒的手掌可以移动;另一个是眼睛可以观察到木棒的倾斜角度和倾斜趋势(角加速度)。通过手掌移动抵消木棒的倾斜角度和趋势,从而保持木棒的直立。这两个条件缺一不可,实际上就是控制中的负反馈机制,参见图2.3。世界上还没有任何一个天才杂技演员可以蒙着眼睛
6、使得木棒在自己手指上直立,因为没有了负反馈。图 2.3 通过反馈保持木棒的直立车模直立也是通过负反馈实现的。但相对于上面的木棒直立相对简单。因为车模有两个轮子着地,因此车体只会在轮子滚动的方向上发生倾斜。控制轮子转动,抵消倾斜的趋势便可以保持车体直立了。如图2.4所示。图 2.4 通过车轮运动控制保持车体直立那么车轮如何运行,才能够最终保持车体垂直稳定?为了回答这个问题,一般的做法需要建立车模的运动学和动力学数学模型,通过设计最优控制来保证车模的稳定。为了使得同学们能够比较清楚理解其中的物理过程。下面通过对比单摆模型来说明保持车模稳定的控制规律。重力场中使用细线悬挂着重物经过简化便形成理想化的
7、单摆模型。直立着的车模可以看成放置在可以左右移动平台上的倒立着的单摆。如图2.5所示。图 2.5 车模可以简化成倒立的单摆普通的单摆受力分析如图2.6所示。图 2.6 普通的单摆受力分析当物体离开垂直的平衡位置之后,便会受到重力与悬线的作用合力,驱动重物回复平衡位置。这个力称之为回复力,其大小为在此回复力作用下,单摆便进行周期运动。在空气中运动的单摆,由于受到空气的阻尼力,单摆最终会停止在垂直平衡位置。空气的阻尼力与单摆运行速度成正比,方向相反。阻尼力越大,单摆越会尽快在垂直位置稳定下来。图2.7显示出不同阻尼系数下,单摆的运动曲线。图 2.7 单摆在不同阻尼下的运动情况总结单摆能够稳定在垂直
8、位置的条件有两个:(1) 受到与位移(角度)相反的恢复力;(2) 受到与运动速度相反的阻尼力。如果没有阻尼力,单摆会在垂直位置左右摆动。阻尼力会使得单摆最终停止在垂直位置。阻尼力过小(欠阻尼)会使得单摆产生震荡,阻尼力过大(过阻尼)会使得单摆到达平衡位置时间拉长。存在一个阻尼临界阻尼系数,使得单摆最快稳定在平衡位置。为什么倒立摆在垂直位置时,在受到外部扰动的情况下,无法保持稳定呢?分析倒立摆的受力,如图2.8所示。图 2.8 在车轮上参照系中车体受力分析倒立摆之所以不能像单摆一样可以稳定在垂直位置,就是因为在它偏离平衡位置的时候,所受到的回复力与位移方向相同,而不是相反!因此,倒立摆便会加速偏
9、离垂直位置,直到倒下。如何通过控制使得倒立摆能够像单摆一样,稳定在垂直位置呢?要达到这一目的,只有两个办法:一个是改变重力的方向;另一个是增加额外的受力,使得恢复力与位移方向相反才行。由此,能够做的显然只有第二种方式。控制倒立摆底部车轮,使得它作加速运动。这样站在小车上(非惯性系)看倒立摆,它就会受到额外的力(惯性力),该力与车轮的加速度方向相反,大小成正比。这样倒立摆所受到的回复力为q (2-1)式中,假设控制车轮加速度与偏角成正比,比例为。显然,如果,(g是重力加速度)那么回复力的方向便于位移方向相反了。此外,为了使得倒立摆能够尽快地在垂直位置稳定下来,还需要增加阻尼力,与偏角的速度成正比
10、,方向相反。因此式(2-1)可变为 (2-2)按照上面的控制方法,可把倒立摆模型变为单摆模型,能够稳定在垂直位置。因此,可得控制车轮加速度的控制算法(2-3)式中,为车模倾角; 为角速度;k1、k2均为比例系数;两项相加后作为车轮加速度的控制量。只要保证在、条件下,可以维持车模直立状态。其中, 决定了车模是否能够稳定到垂直位置,它必须大于重力加速度;决定了车模回到垂直位置的阻尼系数,选取合适的阻尼系数可以保证车模尽快稳定在垂直位置。因此控制车模稳定,需要下列两个条件:(1)能够精确测量车模倾角的大小和角速度的大小;(2)可以控制车轮的加速度。1.4车模速度控制车模运行速度是通过控制车轮速度实现
11、的,车轮通过车模两个后轮电机经由减速齿轮箱驱动,因此通过控制电机转速可以实现对车轮的运动控制。电机的运动控制有三个作用:(1) 通过电机加速度控制实现车模直立稳定。(2)通过电机速度控制,实现车模恒速运行和静止。虽然本届比赛规则中没有要求车模速度恒定,也没有要求车模在比赛之前和冲过终点之后保持静止状态。但是通过速度控制,可以提高车模稳定性。在将来的比赛中,如果规则增加了静止要求,或者需要通过路桥等障碍,速度控制将会发挥作用。(3)通过电机差速控制,可以实现车模方向控制。电机运动控制是通过改变施加在其上的驱动电压实现的。对于电机的电磁模型、动力学模型以及车模的动力学模型进行分析和简化,可以将电机
12、运动模型简化成如下的一阶惯性环节模型。施加在电机上一个阶跃电压,电机的速度变化曲线为((2-4)式中,E为电压;为单位阶跃函数;为惯性环节时间常数;为电机转速常数。对应不同的电压,电机的速度变化曲线如图2.9示。图 2.9 电机在不同电压下的速度由图2.9可以看出,电机运动明显分为两个阶段:第一个阶段是加速阶段;第二个阶段为恒速阶段。其中,在加速阶段,电机带动车模后轮进行加速运动,加速度近似和施加在电机上的电压成正比,加速阶段的时间长度取决于时间常数,该常数由电机转动惯量、减速齿轮箱、车模的转动惯量决定;在恒速阶段,电机带动车模后轮进行恒速运行,运行速度与施加在电机上的电压成正比。调整车模直立
13、时间常数很小,此时电机基本上运行在加速阶段。由上一节式(2-3)计算所得到的加速度控制量a再乘以一个比例系数,即为施加在电机上的控制电压,这样便可以控制车模保持直立状态。车模运行速度调整时间相对很长,此时,电机速度与施加在其上的电压成正比。通过传统的PID反馈控制,便可以精确控制电机的运行速度,从而控制车模的运行速度。1.5 车模方向控制略第二章 程序控制说明2.1 主程序框架 中断服务程序框架2.2电机死区补偿由于摩擦力等因素的存在,电机与PWM给定信号存在非线性死去特性。为了使系统具有更好的线性,首先需要对电机死区进行补偿。2.3角度单闭环控制首先我们忽略速度控制,仅仅只考虑角度闭环系统。
14、那么在这个前提下,只有两个速度量:角度和角速度;被控变量只有角度。那么就可以使用PID控制器。这里需要进行解释,为何有两个输入变量任然可以使用SISO系统才能使用PID。虽然角度和角速度是不同的量,但是角速度就是对角度求微分。而使用陀螺仪获得的角速度比对卡尔曼滤波后求微分获得的角速度更准确,而D控制器输入变量正好是角速度,所以此处使用PID完全没有问题。常用的PID控制器及其变形有P控制器、PI控制器、PD控制以及PID控制器。分析系统要求,仅有P控制器,系统极易发散造成不稳定,而积分环节对于这个需要快速调整的系统,要求不大。因此最后我们选择了PD控制器。控制系统框图如下:在实际调试过程中,倒
15、立摆可以进行短时间的直立,但是会朝向一个方向加速运行,最后车模会倒下。这是由于未加速速度闭环的结果,未对车轮转速进行必要的控制,则最终由于电机转速的饱和,而发生了无法对倒立摆进行调整的后果。为了解决这个问题,必须要引入速度闭环控制。2.4角度、速度双闭环控制对于直立车模速度的控制相对于普通车模的速度控制则比较复杂。由于在速度控制过程中需要始终保持车模的平衡,因此车模速度控制不能够直接通过改变电机转速来实现。下面先分析一下引起车模速度变化的原因。假设车模在上面直立控制调节下已经能够保持平衡了,但是由于安装误差,传感器实际测量的角度与车模角度有偏差,因此车模实际不是保持与地面垂直,而是存在一个倾角
16、。在重力的作用下,车模就会朝倾斜的方向加速前进。首先对一个简单例子进行分析。假设车模开始保持静止,然后增加给定速度,为此需要车模往前倾斜以便获得加速度。在车模直立控制下,为了能够有一个往前的倾斜角度,车轮需要往后运动,这样会引起车轮速度下降(因为车轮往负方向运动了)。由于负反馈,使得车模往前倾角需要更大。如此循环,车模很快就会倾倒。原本利用负反馈进行速度控制反而成了“正”反馈。在直立控制下的车模速度与车模倾角之间传递函数具有非最小相位特性,在反馈控制下容易造成系统的不稳定性。但根据实际经验,是可以通过速度控制进行车模倾角控制的。而速度闭环控制仍然可以看做是一个SISO系统。所以使用PID控制器
17、来完成控制。由于系统对于静态误差存在一定要求,所以使用PI控制器。正如前文所述,直立控制和速度控制存在强耦合,所以这里我们使用的分立控制周期的方法。每10个直立控制周期进行一次速度控制。这样,可以将速度控制视为对于直立控制的一种扰动。下图为速度闭环的控制框图。直立、速度闭环控制框图第三章 车模机械设计3.1车模地盘安装C车模地盘由两部分组成,电机部分以及前地盘部分。两部分的连接可以采用弹性连接或者刚性连接。在经过几次测试后我们发现,如果使用弹性连接,且将MEMS传感器安装在前部地盘上,由于弹性将使得角度信号产生滞后,对于信号的处理带来很大影响,因此,这部分使用了刚性连接,为了减轻重量,考虑使用
18、2mm碳纤维版作为连接部件。图3.1 车模地盘安装3.2车模编码器安装测速编码器对于摄像头组以及光电组而言,起到速度闭环的作用,而对于两轮车的选题,编码器不仅起到速度闭环,还对直立控制有很重要的作用,因此,编码器对于电磁组两轮车而言,是不可或缺的一部分。但是由于直立行走,相较于摄像头组与光电组,电磁车编码器安装的额位置受到了较大制约。同时,为了控制的简便,我们使用了双向增量式编码器。通过选型,决定使用欧姆龙E6A2-CW3C双向增量式测速编码器。欧姆龙编码器体积较大,我们将其放置在车轮上方,自己设计了碳纤维支架以及齿轮,使编码器可靠安装于车身上。图3.2 编码器安装3.3车模电池位置改装C车模
19、的电机标称值为4.17W,在三组车模中属于最弱的一只,但是对于直立车而言,电机的功率对于车模直立的效果有着决定性因素。在无法修改电机的情况下,必须对结构进行优化。合理降低重心是最为行之有效的一个方法。为了降低重心,我们对车模各个部件进行了称重,具体数据如下:部件质量(克)前底板100电路板(包含驱动)72MEMS电路板10测速编码器36电池300从上表中不难看出,质量最大的部件是电池,同时,电池的位置可以方便更改,所以我们决定尝试改动电池的安装位置。为此,我们拟定了三种安装方式:方式一:原始位置。图3.3.1 电池安装方案一。方案一的优势在于无需对于机械结构进行任何改动,可以直接安装。缺点在于
20、电池高度过高,导致重心整体偏高。方案二:背面纵向安装图3.3.2电池安装方案二。方案二的优势在于转向惯量较小,转向灵活,重心低于方案一。缺点在于重心依然较高。方案三:背面横向安装图3.3.3电池安装方案三方案三的优势在于将电池重心降到最低,对于直立控制而言存在较大优势。缺点在于转向惯量略大于方案二。经过综合比较和测试,选用方案三。第四章 车模硬件电路设计详见原理图。第五章 卡尔曼滤波4.1卡尔曼滤波简介卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态。简单来说,卡尔曼滤波器是一个“optimal recursive data p
21、rocessing algorithm(最优化自回归数据处理算法)”。对于解决很大部分的问题,他是最优,效率最高甚至是最有用的。他的广泛应用已经超过30年,包括机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。近年来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等等。5.2使用卡尔曼滤波的原因当决定使用加速度计(反应角度)以及陀螺仪(反应角速度)以后,我们对参考的论文中为何要同时使用加速度计以及陀螺仪产生过一些疑问。因为如果需要角速度,我们可以通过这样的方法对加速度计进行微分,计算出角速度,或者可以通过对于陀螺仪积分,从而获得角度。既然如此为何我们需要使
22、用两个传感器。于是,我们对两个传感器进行了数据采样,观测其输出信号的关系。由于考虑电机转动产生的震动会对传感器产生比较大的干扰, 随着PWM占空比的不断提高,陀螺仪的噪声也更加显著。之后我们对加速度传感器进行了测试。我们不难获得以下一些结论:1、陀螺仪的噪声还在可以接受范围,但是加速度计噪声已经远远超出可控范围接受2、对于加速度计做一个补充说明,加速度计在车模直立状态下,电机PWM占空比100%噪声情况下,幅值映射到实际角度大约是60度左右。根本不能直接使用。3、方差(可以等效理解为噪声大小)随着占空比不断增加。4、加速度计虽然噪声很大,但是长时间来看,他的数学期望是非常稳定的。5、陀螺仪的噪
23、声比较小,但是他的误差会对积分造成漂移。无论是加速度计还是陀螺仪,都有自己的优势和劣势。简而言之:加速度计短时间内不可信,但是长时间内可信。陀螺仪短时间内可信而长时间内不可信。这也就是为什么车模直立必须使用两个传感器来完成信号获取。因为单个传感器不可靠,只有取其精华去其糟粕,发挥两个传感器的共同优势,才能够取得好的效果。于是,我们需要一种算法,能够在短时间内置信陀螺仪,而长时间内置信加速度计的算法。这就需要卡尔曼滤波。5.3卡尔曼滤波原型首先我们建立系统的状态方程和测量方程,由于倾角和倾角角速度存在导数关系,系统倾斜真实角度可以用来做一个状态向量。在该系统中,采用加速度传感器估计出陀螺仪常值偏
24、差b,以此偏差作为状态向量得到相应的状态方程和观测方程式中,为包含固定偏差的陀螺仪输出角速度,为加速度计经处理后得到的角度值,为陀螺仪测量噪声,为加速度传感器测量噪声,为陀螺仪漂移误差,和相互独立,此处假设二者为满足正态分布的白色噪声。令为系统采样周期,得到离散系统的状态方程和测量方程:同时,要估算k时刻的实际角度,就必须根据k-1时刻的角度值,再根据预测得到的k时刻的角度值得到k时刻的高斯噪声的方差,在此基础之上卡尔曼滤波器进行递归运算直至估算出最优的角度值。在此,须知道系统过程噪声协方差阵Q以及测量误差的协方差矩阵R, 对卡尔曼滤波器进行校正,Q与R矩阵的形式如下:式中。和分别是加速度传感
25、器和陀螺仪测量的协方差,其数值代表卡尔曼滤波器对其传感器数据的信任程度,数值越小表明信任程度越高。在该系统中陀螺仪的值更为接近准确值,因此取的值小于的值。当前状态: (1)式中,是利用k预测的结果,是k - 1 时刻的最优结果。则有对应于的协方差为: (2)式中,是对应的协方差,表示的转置矩阵,是系统过程的协方差,式子(1)、(2)即对系统的状态更新。则状态k的最优化估算值: (3)其中,为卡尔曼增益: (4)此时,我们已经得到了k状态下最有的估算值,但是为了使卡尔曼滤波器不断的运行下去直到找到最优的角度值,我们还要更新k状态下的协方差: (5)其中为单位阵,对于本系统则有。当系统进入k+1状
26、态时,就是式子(2)的。(3)、(4)、(5)式为卡尔曼滤波器状态更新方程。计算完时间更新方程后,再重复上一次计算得到的后验估计,作为下一次的计算的先验估计,这样,周而复始、循环往复地运算下去直至找到最优的结果。5.4卡尔曼滤波化简上述五个公式便是卡尔曼滤波的五条数学公式在本项目中的使用。但是,以上五个公式,仅仅只是矩阵形式。虽然可以在MATLAB里进行仿真,但是却不能使用单片机进行有效运算。然后,将卡尔曼滤波矩阵形式转化为方程形式:这里,X01即为我们需要的角度卡尔曼滤波值。可以看到的是,卡尔曼滤波方程形式共有14个公式,同时很多参数的运算涉及浮点数,这对于单片机的高效运行时极为不利的,因此
27、我们需要通过一些方法对卡尔曼滤波的公式进行化简,从而在不失精度的情况下,尽可能减小运算量。需要注意的是,Q,R两个参数是关于传感器和系统的方差,他们随着系统的工作状况不同而会产生相应变化,对应到我们的系统,在车模运行状态不同(倾角不同,PWM不同)情况下,Q,R都是不同的。根据相关参考文献,Q,R虽然都是关于时间的变量,但是由于卡尔曼滤波有很好的收敛性,所以可以将Q,R都取比较极端的参数。用常量来定义。然后再看下图注意方框中的公式,根据我们的观察,不难发现,整个方框中都是为了获得卡尔曼增益(矩阵Kg),我们设想,能否使用一个常数来等效替代卡尔曼增益那?根据我们在实验中的观察,卡尔曼增益是一个收
28、敛的变量,并且针对到我们的这个系统,他的值非常小,直立状态下趋近于一个常数。(所有这些工作都在MATLAB下完成)所以,我们将方框中的所有公式完全省略,通过实验整定,选取一个近似Kg来替代方框中的所有运算。同时,通过NATLAB观测各变量的变化趋势,我们尝试让Kg2=0(Kg1,Kg2本身就是非常小的变量,所以可以让其等于0)。并发现Kg2对于整个卡尔曼滤波的影响非常有限。所以将Kg2设定为0。以下就是我们组程序中卡尔曼滤波的简化算法实现X1=X0+gyro*dt;X0=X1+(acc-X1)*kg;化简后的卡尔曼滤波框图如下:5.5卡尔曼滤波参数整定化简后的卡尔曼滤波主要是对dt以及Kg两个
29、参数进行整定。需要特别指出的是,这里的dt并不只是一个采样间隔。由于陀螺仪的输出和加速度计输出的量纲并不相同,所以陀螺仪采样值*dt并不直接反应一个角度,而是与实际角度相差一个系数。因此此处的dt可以等效理解为dt=采样间隔*比例系数。dt越大,积分速度越快,卡尔曼输出追随实际角度的情况越好(当然不能太大,不然可能会出现超前相位)。但是dt越大,陀螺仪漂移造成的影响也就越大。Kg决定了加速度计的权重。Kg越大,实际输出的漂移就越小,但是滤波效果的噪声也就越大。所以dt和kg是一对矛盾,不能太过于极端。首先是静态整定。将车模保持在稳定直立状态,让车轮以恒定PWM(80%以上)转动,然后调节参数。
30、目标是达到上图效果。红色为卡尔曼滤波输出,蓝色为加速度计直接输出。如果红色抖动非常厉害,可以适当减小Kg的大小。接着是动态整定还是保持车轮恒定PWM旋转,同时,摇摆车身。大致调节到上图所示的样子。目前存在一个相位差,这个相位差在后期直立算法的调试中是致命的,必须克服掉。解决方法,逐渐增加dt即可。达到上图效果即可认为卡尔曼滤波参数整定完成。第六章 程序控制说明在完成了信号处理的层面之后,就是对于控制算法的设计。在设计算法之前,让我们对于系统进行一个简单分析。系统虽然是高阶非线性系统,但是由于直立期间,倾斜角度非常小,所以可等等效为一个线性系统。控制输入有三个,分别对应角度,角速度,车轮转速。被
31、控变量有两个:角度以及车轮转速。所以这是一个MIMO系统,因此不能使用简单的PID等SISO控制器进行控制。同时,无论是控制角度还是控制电机,执行机构都为电机,所以系统也具有强耦合性。对于倒立摆的控制,参考的文献中有使用各种算法进行控制,比如状态反馈、自适应算法、神经网络算法、模糊算法等等。这些算法都需要更高深的理论基础,同时,在高阶倒立摆系统中,这些算法拥有不可替代性。但是对于我们的两轮车式倒立摆,这仅仅只是一个一阶倒立摆,可以使用更简单的方法进行控制。我们在本设计中使用了角度、速度双闭环的控制算法。角度控制频率高,速度控制周期频率慢。6.1电机死区补偿由于摩擦力等因素的存在,电机与PWM给
32、定信号存在非线性死去特性。为了使系统具有更好的线性,首先需要对电机死区进行补偿。6.2角度单闭环控制首先我们忽略速度控制,仅仅只考虑角度闭环系统。那么在这个前提下,只有两个速度量:角度和角速度;被控变量只有角度。那么就可以使用PID控制器。这里需要进行解释,为何有两个输入变量任然可以使用SISO系统才能使用PID。虽然角度和角速度是不同的量,但是角速度就是对角度求微分。而使用陀螺仪获得的角速度比对卡尔曼滤波后求微分获得的角速度更准确,而D控制器输入变量正好是角速度,所以此处使用PID完全没有问题。常用的PID控制器及其变形有P控制器、PI控制器、PD控制以及PID控制器。分析系统要求,仅有P控
33、制器,系统极易发散造成不稳定,而积分环节对于这个需要快速调整的系统,要求不大。因此最后我们选择了PD控制器。控制系统框图如下:在实际调试过程中,倒立摆可以进行短时间的直立,但是会朝向一个方向加速运行,最后车模会倒下。这是由于未加速速度闭环的结果,未对车轮转速进行必要的控制,则最终由于电机转速的饱和,而发生了无法对倒立摆进行调整的后果。为了解决这个问题,必须要引入速度闭环控制。6.3角度、速度双闭环控制对于直立车模速度的控制相对于普通车模的速度控制则比较复杂。由于在速度控制过程中需要始终保持车模的平衡,因此车模速度控制不能够直接通过改变电机转速来实现。下面先分析一下引起车模速度变化的原因。假设车
34、模在上面直立控制调节下已经能够保持平衡了,但是由于安装误差,传感器实际测量的角度与车模角度有偏差,因此车模实际不是保持与地面垂直,而是存在一个倾角。在重力的作用下,车模就会朝倾斜的方向加速前进。首先对一个简单例子进行分析。假设车模开始保持静止,然后增加给定速度,为此需要车模往前倾斜以便获得加速度。在车模直立控制下,为了能够有一个往前的倾斜角度,车轮需要往后运动,这样会引起车轮速度下降(因为车轮往负方向运动了)。由于负反馈,使得车模往前倾角需要更大。如此循环,车模很快就会倾倒。原本利用负反馈进行速度控制反而成了“正”反馈。在直立控制下的车模速度与车模倾角之间传递函数具有非最小相位特性,在反馈控制
35、下容易造成系统的不稳定性。但根据实际经验,是可以通过速度控制进行车模倾角控制的。而速度闭环控制仍然可以看做是一个SISO系统。所以使用PID控制器来完成控制。由于系统对于静态误差存在一定要求,所以使用PI控制器。正如前文所述,直立控制和速度控制存在强耦合,所以这里我们使用的分立控制周期的方法。每10个直立控制周期进行一次速度控制。这样,可以将速度控制视为对于直立控制的一种扰动。下图为速度闭环的控制框图。图6.3 直立、速度闭环控制框图第七章车模参数调试图解在完成了所有控制算法方案的制定,以及程序代码的编写之后,接下来需要对一些参数在实际系统运行中进行整定以及微调。整定方法遵从先直立控制再速度控
36、制;先P参数,后I参数,最后D参数的整定顺序。本章节着重介绍在调试环节中不同现象对应的原因以及参数调整方法。在下文中,会使用如下几个变量在此说明。dt:陀螺仪积分参数Kg:加速度计参数(卡尔曼增益)角度闭环,速度开环P:直立算法P参数角度闭环,速度开环D:直立算法D参数速度闭环P:速度控制P参数速度闭环I:速度控制I参数原因:开环P过大,系统震荡解决方法:减小开环P或者增加开环D原因:开环D参数过大,系统抗干扰性降低解决方法:减小开环D,或者适当增加开环P原因:倾角值为0时刻,车身重心不在轴线上解决方法:微调加速度计零偏置,使得角度为0时,重心落在轴线上。也可能是陀螺仪零偏置错误,同理,微调即
37、可。原因:陀螺仪积分速度过慢,导致卡尔曼滤波相位滞后解决方法:适当增加dt原因:速度闭环对系统整体的控制程度过小解决方法:适当增加速度闭环的各个参数原因:速度闭环调节速度过慢解决方法:适当增加闭环P参数原因:速度闭环存在静态误差解决方法:适当增加闭环I参数原因:速度闭环调节速度过慢解决方法:适当增加闭环P参数,或者也可以使用PID(而非PI)进行速度闭环的控制原因:速度控制对于阶跃响应存在超调解决方法:减小闭环P参数,或者加入闭环D参数,也可以不用阶跃信号,而是通过斜波信号慢慢将速度提升。原因:陀螺仪漂移之后和加速度传感器之间的关系发生了变化,导致滤波角度出现比较大的问题。解决方法:增大Kg。
38、附件源代码/*端口初始化void PAC_Init(void) /*计数器接口初始化 -ok(5.9) DDRB = 0X00; /PORTB作为输入 DDRA = 0X00; DDRE_DDRE2 = 1; DDRE_DDRE5 = 1; DDRE_DDRE6 = 1; DDRE_DDRE3 = 1; /*计数器清零 PORTE_PE2 = 0; PORTE_PE5 = 0; PORTE_PE3 = 0; PORTE_PE6 = 0; /*计数使能 PORTE_PE2 = 1; PORTE_PE5 = 1; PORTE_PE3 = 0; PORTE_PE6 = 0; /*电机控制电路接口初始
39、化 -ok(5.9) PUCR = 0X50; /全部禁止上拉电阻 DDRK_DDRK2 =1; /电机IO接口 DDRK_DDRK3 =1; /电机IO接口 PORTK_PK2 =0; PORTK_PK3 =0; /*CCD接口初始化 DDRK_DDRK5 =1; /PORTK_PK1,PORTK_PK3输出 DDRK_DDRK4 =1; /*数码管接口电路 DDRM = 0XFF; /输出 DDRJ_DDRJ6 =1; /*设置系统时钟为64MHzvoid SystemCLK_64M(void) CLKSEL = 0; /使PLL与系统隔离 PLLCTL_PLLON = 1; /打开PLL
40、 SYNR = 0Xc7; /设置 fvc0=2*fosc*(SYNDIV+1)/(REFDIV+1);fpll=fvco/(2*POSTDIV); /fbus=fpll/2;若POSTDIV=0,fbus=fvco/2; REFDV = 0X81; /fbus = 2*16*(9+1)/(1+1)=80m; POSTDIV = 0; /fpll = fvco; _asm(nop); /_asm汇编语言,nop做空操作;延时 _asm(nop); while(CRGFLG_LOCK = 0); /频率稳定后再操作 CLKSEL_PLLSEL = 1;/* PIT中断服务void PIT_Ini
41、t(void) /1ms周期中断 PITCFLMT = 0; / PIT disabled, PITCE_PCE0 = 1; /通道0使能 PITMUX_PMUX = 0; /8位,16位定时器共同作用 PITMTLD0 = 79; /8位定时器初值设定,80 PITLD0 =799; /16位定时器初值设定 time_out period = (79+1)*(799+1)/64000000 = 1ms PITINTE_PINTE0 = 1; /0通道中断有效 PITCFLMT_PITE=1; /定时器使能,初始化一次即可/*功能 :总线频率为64MHz,设置SCI0模块波特率为19200bp
42、s入口参数:无出口参数:无 40000/1152*/void SCI0_init(void) /SCI0BD = 208; /设置波特率为9600Kbps(写一个字) AMAP = 0 /SCI0BD = 104; /设置波特率为19200Kbps(写一个字) AMAP = 0 -总线频率32MHz /SCI0BD = 208; /设置波特率为19200Kbps(写一个字) AMAP = 0 -总线频率64MHz /SCI0BD = 69; /设置波特率为57600Kbps(写一个字) AMAP = 0 -总线频率64MHz /SCI0BD = 35; /设置波特率为115200Kbps(写一
43、个字) AMAP = 0 -总线频率64MHz SCI0BD = 104; /设置波特率为38400Kbps(写一个字) AMAP = 0 -总线频率64MHz /SCI0BD = 139; /设置波特率为28800Kbps(写一个字) AMAP = 0 -总线频率64MHz SCI0CR1 = 0X00; /SCI0工作在正常情况下,禁止奇偶校正,使用8为数据位(共10位) SCI0CR2 = 0X2c; /允许使用发送器,使用接收器,允许接收中断/*函数功能:完成带符号的char型数据传送入口参数:char num,为要传送的数据出口参数:无说明 :每次传送133个数据-上位机定义的一帧数据*