双轮自平衡车设计报告.docx
- 文档编号:24289616
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:18
- 大小:687.62KB
双轮自平衡车设计报告.docx
《双轮自平衡车设计报告.docx》由会员分享,可在线阅读,更多相关《双轮自平衡车设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
双轮自平衡车设计报告
双轮自平衡车设计报告
学院…………..........
班级……………………
姓名………………..手机号…………………..
姓名………………..手机号…………………..
姓名………………..手机号…………………..
一、双轮自平衡车原理
二、总体方案
三、电路和程序设计
四、算法分析及参数确定过程
一.双轮自平衡车原理
1.控制小车平衡的直观经验来自于人们日常生活经验。
一般的人通过简单练习就可以让一个直木棒在手指尖上保持直立。
这需要两个条件:
一个是托着木棒的手掌可以移动;另一个是眼睛可以观察到木棒的倾斜角度和倾斜趋势(角速度)。
通过手掌移动抵消木棒的倾斜角度和趋势,从而保持木棒的直立。
这两个条件缺一不可,让木棒保持平衡的过程实际上就是控制中的负反馈控制。
图1木棒控制原理图
2.小车的平衡和上面保持木棒平衡相比,要简单一些。
因为小车是在一维上面保持平衡的,理想状态下,小车只需沿着轮胎方向前后移动保持平衡即可。
图2平衡小车的三种状态
3.根据图2所示的平衡小车的三种状态,我们把小车偏离平衡位置的角度作为偏差;我们的目标是通过负反馈控制,让这个偏差接近于零。
用比较通俗的话描述就是:
小车往前倾时车轮要往前运动,小车往后倾时车轮要往后运动,让小车保持平衡。
4.下面我们分析一下单摆模型,如图4所示。
在重力作用下,单摆受到和角度成正比,运动方向相反的回复力。
而且在空气中运动的单摆,由于受到空气的阻尼力,单摆最终会停止在垂直平衡位置。
空气的阻尼力与单摆运动速度成正比,方向相反。
图4单摆及其运动曲线
类比到我们的平衡小车,为了让小车能静止在平衡位置附近,我们不仅需要在电机上施加和倾角成正比的回复力,还需要增加和角速度成正比的阻尼力,阻尼力与运动方向相反。
5平衡小车直立控制原理图
5.根据上面的分析,我们还可以总结得到一些调试的技巧:
比例控制是引入了回复力;微分控制是引入了阻尼力,微分系数与转动惯量有关。
在小车质量一定的情况下,重心位置增高,因为需要的回复力减小,所以比例控制系数下降;转动惯量变大,所以微分控制系数增大。
在小车重心位置一定的情况下,质量增大,因为需要的回复力增大,比例控制系数增大;转动惯量变大,所以微分控制系数增大。
二.总体方案
■小车总框图
三.电路和程序设计
1.主要元器件选型
A.STM32F103RCT6最小核心板
■小容量增强型,32位基于ARM核心的带16或32K字节闪存的微控制器USB、CAN、6个定时器、2个ADC、6个通信接口功能。
■内核:
ARM32位的Cortex™-M3CPU
−最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHz(Dhrystone2.1)。
−单周期乘法和硬件除法。
■存储器
−从16K到32K字节的闪存程序存储器。
−从6K到10K字节的SRAM。
■时钟、复位和电源管理
−2.0~3.6伏供电和I/O引脚。
−上电/断电复位(POR/PDR)、可编程电压监测器(PVD)。
−4~16MHz晶体振荡器。
−内嵌经出厂调校的8MHz的RC振荡器。
−产生CPU时钟的PLL
−带校准功能的32kHzRTC振荡器
■低功耗
−睡眠、停机和待机模式
−VBAT为RTC和后备寄存器供电
■2个12位模数转换器,1μs转换时间(多达16个
输入通道)
−转换范围:
0至3.6V
−双采样和保持功能
−温度传感器
■DMA:
−7通道DMA控制器
−支持的外设:
定时器、ADC、SPI、I2C和USART
■多达80个快速I/O端口
−26/37/51个I/O口,所有I/O口可以映像到16个外部中断;几乎所有端口均可容忍5V信号
B.L298N双直流电机驱动模块
■板载一个L298N马达控制芯片和一个7805稳压芯片。
■模块可以同时驱动2个直流电机或者一个五线四相式步进电机。
■模块输入电压6~12V
■常用的电机驱动功能够用切资料也很好找。
C.传感器MPU6050模块
■此六轴模块采用先进的数字滤波技术(卡尔曼滤波),能有效降低测量噪声,提高测量精度。
模块内部集成了运动引擎DMP,获取四元数得到当前姿态。
姿态测量精度0.01度,稳定性极高,性能甚至优于某些专业的倾角仪!
采用高精度的陀螺加速度计MPU6050通过IIC协议输出保证数据的准确性。
■电压:
3V~6V。
电流:
<10mA。
体积:
17.8mmX17.8mm重量:
1.1g
■测量维度:
加速度:
3维,角速度:
3维,姿态角:
3维
■量程:
加速度:
±16g,角速度:
±2000°/s。
■分辨率:
加速度:
6.1e-5g,角速度:
7.6e-3°/s。
■稳定性:
加速度:
0.01g,角速度0.05°/s。
■数据输出频率100Hz(波特率115200)/20Hz(波特率9600)。
■波特率115200kps/9600kps。
D.HC-05蓝牙主从一体模块
■供电电压3.3V~3.6V;
■支持AT指令集配置模块;
■采用CSR主流蓝牙芯片,蓝牙V2.0协议标准;
■波特率最高为1382400bps;
■配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持8位数据位、1位停止位、无奇偶校验的通信格式,这也是最常用的通信格式,不支持其他格式。
2电路设计
■STM32核心板原理图
■电机驱动原理图
■MPU6050原理图
■蓝牙模块原理图
四.算法分析及参数确定
■小车直立环使用PD(比例微分)控制器,其实一般的控制系统单纯的P控制或者PI控制就可以了,但是那些对干扰要做出迅速响应的控制过程需要D(微分)控制。
直立控制的PD代码
intbalance(floatAngle,floatGyro)
{
floatBias,kp=300,kd=1;
intbalance;
Bias=Angle-0;//计算直立偏差
balance=kp*Bias+Gyro*kd;//计算直立PWM
returnbalance;//返回直立PWM
}
参数是平衡小车倾角和Y轴陀螺仪(这个取决于MPU6050的安装),
调试过程包括确定平衡小车的机械中值、确定kp值的极性(也就是正负号)
和大小、kd值的极性和大小等步骤。
在调试直立环的时候,我们要在定时中断服务函数里面屏蔽速度环和转向
环。
■确定平衡小车的机械中值
把平衡小车放在地面上,绕电机轴旋转观察小车什么时候平衡用量角器量大概中值在哪。
本小车为2度。
■确定kp值的极性(令kd=0)
首先我们估计kp的取值范围。
我们的PWM设置的是7200代表占空比100%,假如我们设定kp值为720,那么平衡小车在±10°的时候就会满转。
根据我们的感性认识,这显然太大了,那我们就可以估计kp值在0~720之间,首先大概我们给一个值kp=-200,我们可以观察到,小车往哪边倒,电机会往那边加速让小车到下,就是一个我们不愿看到的正反馈的效果。
说明kp值的极性反了,接下来我们设定kp=200,这个时候可以看到平衡小车有直立的趋势,虽然响应太慢,但是,我们可以确定kp值极性是正的。
具体的数据接下来再仔细调试。
■确定kp值的大小(令kd=0)
确定参数的原则是:
kp一直增加,直到出现大幅度的低频抖动。
定kp=200,这个时候我们可以看到,小车虽然有平衡的趋势,但是显然响应太慢了。
定kp=680,这个时候我们可以看到,小车的响应明显加快,而且来回推动
小车的时候,会有大幅度的低频抖动。
说明这个时候kp值已经足够大了,需要增加微分控制削弱p控制,抑制低频抖动。
■确定kd值的极性(令kp=0)
我们得到的MPU6050输出的陀螺仪的原始数据,通过观察数据,我们发现最大值不会超过4位数(正常应用在平衡小车上的时候),再根据7200代表占空比100%,所以我们估算kd值应该在0~3之间,我们先设定kd=-0.5,当我们拿起小车旋转的时候,车轮会反向转动,并没有能够实现跟随效果。
这说明了kd
的极性反了。
接下来,我们设定kd=0.5,这个时候我们可以看到,当我们旋转小车的时候,车轮会同向以相同的速度跟随转动,这说明我们实现了角速度闭环,至此,我们可以确定kd的极性是正的。
具体的数据接下来再仔细调试。
■确定kd值的大小(令kp=500)
确定参数的原则是:
kd一直增加,直到出现高频抖动。
设定kd=0.5,这个时候我们可以看到,低频大幅度频抖动已经基本消除。
设定kd=1,这个时候我们可以看到,整体性能已经非常棒。
设定kd=3.8,这个时候我们可以看到,小车开始出现剧烈抖动
至此,我们可以确定得到kp=500,kd=1.7是P、D参数的最大值。
然后我们进行最关键的一步,对每个系数乘以0.6,取整得到kp=680,kd=2,这就是最终我们需要的参数,这样做的原因是,我们之前得到的参数是kp、kd最对每个数据乘以0.6得到。
这个时候我们可以看到,小车没有任何的抖动,非常平稳,但是依然无法保持长时间的直立,直立很短一段时间后会往一个方向加速倒下。
这个等我们下面加上速度环才能得到更好的性能。
只有直立环是很难让小车达到很好的直立效果的。
■平衡小车速度控制调试
平衡小车速度环使用PI(比例积分)控制器,这也是速度控制最常使用的控制器。
PI控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差,将偏差的比例(P)和积分(I)通过线性组合构成控制量对被控对象进行控制。
■计算速度偏差
根据公式
偏差=测量值-目标值
测量值我们使用左右编码器之和表示,我们没有必要纠结于是否要除以2,因为这样就引入舍去误差,我们需要的其实是一个可以表示速度变化的变量。
另外,我们的目标速度设置为零。
所以,可以得到
Encoder_Least=(Encoder_Left+Encoder_Right)-0;
然后,我们对速度值进行低通滤波,具体的系数由工程经验得到。
这样做的目的是为了减缓速度值的变化,防止速度控制对直立造成干扰,因为平衡小车系统里面,直立控制是主要的,其他控制对于直立来说都是一种干扰。
■确定kp与ki值的极性
为了调试方便,接下来我们先关闭之前已经调试好的直立控制部分,积分项由偏差的积分得到,所以积分控制和比例控制的极性是相同的。
的平衡小车速度控制系统里面,一般我们可以把ki值设置为ki=kp/200;这样,只要我们可以得到kp值的大小和极性,就可以完成速度控制部分的参数整定了。
显然,这样大大缩短了PID参数整定的时间。
另外要说明的是,虽然这里的PI控制器是速度控制常用的一种控制器,但是和普通的调速系统不一样,这里的速度控制是正反馈的,当小车以一定的速度运行的时候,我们要让小车停下来,小车需要行驶更快的速度去“追”,小车运行的速度越快,去“追”的速度也就越快,所以这是一个正反馈的效果。
如果使用常规的速度负反馈,当小车以一定的速度运行的时候,我们通过减速让小车慢下来,小车会因为惯性向前倒下。
下面介绍一种确定速度控制是正反馈还是负反馈的方法。
根据之前的估计,先设定kp=-50,ki=kp/200,当我们拿起小车,旋转其中一个小车轮胎的时候,根据我们设定的速度偏差
Encoder_Least=(Encoder_Left+Encoder_Right)-0;
另外一个车轮会反向转动,让偏差趋向于零。
这就是常规的速度控制里面的负反馈,不是我们需要的效果。
接下来设定kp=165,ki=kp/200,此时,当我们旋转其中一个小车轮胎的时候,两个轮胎会往相同的方向加速,直至电机的最大速度,这是典型的正反馈效果,也是我们期望看到的。
至此,我们可以确定kp,ki的符号应该是正的。
■确定kp与ki的大小(开启直立控制)
我们进行平衡小车速度控制kp与ki值的整定,此时需要打开直立环,因为我们需要结合直立环观察速度环对直立环的影响。
衡小车速度控制系统里面,一般我们可以把ki值设置为ki=kp/200,所以我们只需要对kp值进行整定即可。
在调试的过程中设定速度控制的目标为零,所以,调试的理想结果应该是:
小车保持平衡的同时,速度接近于零。
实际上,小车存在比较大的转动惯量和惯性,并且齿轮减速器存在死区,很难调试到让小车完全保持静止的,我们调试平衡小车只是为了学习PID控制算法,所以,并在这个过程对PID有进一步的了解即可。
kp=40,ki=kp/200这个时候我们可以看到,小车的速度控制比较弱,很难让速度恒定。
kp=60,ki=kp/200这个时候我们可以看到,小车的速度控制的响应有所加快,但是来回摆动还是有点大,还是不足以让小车保持接近于静止的状态。
此处略去好多手写的数据。
。
。
。
。
。
。
kp=80,ki=kp/200这个时候我们可以看到,小车已经性能很完美了,我们接下来尝试加大kp值看一下效果。
kp=165,ki=kp/200这个时候我们可以看到,小车虽然回正力度增大了,而且响应更加快了,但是稍微加入一点的干扰都会让小车大幅度摆动,抗干扰能力明显不足,所以这组参数不可取。
此处经过大量的实验大量的测试数据的都是手写。
至此,我们可以确定得到kp=165,kd=0.789是速度控制P、I参数的理想值。
我们再来体检一下速度控制负反馈在平衡小车里面的效果。
■加入遥控前进后退功能的话,速度PI控制函数应该改成如下所示(其中加粗部分为是实现遥控功能的代码):
intvelocity(intencoder_left,intencoder_right)
{
staticfloatVelocity,Encoder_Least,Encoder,Movement;
staticfloatEncoder_Integral;
floatkp=80,ki=0.4;
if(1==Flag_Qian)Movement=-90;//如果前进标志位置1位移为负
elseif(1==Flag_Hou)Movement=90;//如果后退标志位置1位移为正
elseMovement=0;
Encoder_Least=(Encoder_Left+Encoder_Right)-0;//获取最新速度偏差==测量速度(左右编码器之和)-目标速
Encoder*=0.7;//一阶低通滤波器
Encoder+=Encoder_Least*0.3;//一阶低通滤波器
Encoder_Integral+=Encoder;//积分出位移积分时间:
10ms
Encoder_Integral=Encoder_Integral-Movement;//接收遥控器数据,控制前进后退
if(Encoder_Integral>10000)Encoder_Integral=10000;//积分限幅
if(Encoder_Integral<-10000)Encoder_Integral=-10000;//限制遥控最大速度
Velocity=Encoder*kp+Encoder_Integral*ki;//速度控制
if(Turn_Off(Angle_Balance,Voltage)==1)Encoder_Integral=0;//电机关闭后清除积分
returnVelocity;
}
关于这个包括了遥控前进后退的速度控制函数,做如下解析:
1.在usart3.c中的串口3接收中断函数,改变Flag_Qian和Flag_Hou,进而遥控小车。
2.Encoder_Integral=Encoder_Integral-Movement;遥控的速度通过积分融入速度控制器,减缓了速度突变对直立控制的影响。
3.积分限幅是增加了遥控之后必不可少的,如果没有积分限幅,就无法限制小车的最大前进速度。
这样在遥控的过程中,小车很容易倒下。
换句话说积分的最大赋值决定了小车的最大前进速度,而Movement值决定了小车的给定速度。
■平衡小车转向控制调试
■小车转向环使用P(比例)控制器或者P(比例)D(微分)控制器,我们前面说过,一般的控制系统单纯的P控制或者PI控制就可以了,转向环就是这种“一般的控制系统”,对响应要求不高,所以我们只使用P控制即可。
其实转向信息可以通过编码器和陀螺仪获取,所以转向环有多种控制方式。
总结如下:
■用左右轮编码器数据之差的积分值作为偏差,以Z轴陀螺仪作为微分控制的输入进行PD控制,目标是保持转向角为设定值。
优点是算法比较科学,引入微分控制可以增大比例控制系数以提高系统的响应。
缺点是较复杂,积分项影响用户体验、编码器对车轮滑动无法检测、陀螺仪存在漂移。
■Z轴陀螺仪的数据积分得到转向角作为偏差,以Z轴陀螺仪作为微分控制的输入进行PD控制,目标是保持转向角为设定值。
优点是避免了编码器对车轮滑动无法检测现象,引入微分控制可以增大比例控制系数以提高系统的响应。
缺点是陀螺仪的漂移长时间积分导致系统误差增大。
■使用左右轮编码器数据之差作为转向速度偏差进行P控制,目标是保持转向速度为设定值。
优点是简单,缺点是编码器对车轮滑动无法检测,对编码器精度有较高要求。
■使用Z轴陀螺仪的数据作为转向速度偏差进行P控制,目标是保持转向速度为设定值。
优点是算法简单、避免了编码器对车轮滑动无法检测现象、陀螺仪漂移等问题,缺点是陀螺仪对高频信号采样失真。
我们本次调试使用了简单可靠的第4套方案。
在平衡小车里面,相比于直立环和速度环,转向环是最不重要的,如果缺少了直立环和速度环,小车无法长时间保持直立。
转向环的作用是使小车行驶的过程中,跟随我们给定的Z轴角速度,具体来说,如果我们设定的Z轴目标角速度为零,那么小车应该走一个直线,这也是我们本次实验需要完成的目标。
调试过程包括确定kp极性和大小。
■确定kp的极性
为了方便本小节的实验,我们先关闭之前调试好的直立环和速度环。
我们得到的MPU6050输出的陀螺仪的原始数据,通过观察数据,我们发现最大值不会超过4位数(正常应用在平衡小车上的时候),再根据7200代表占空比100%,所以我们估算kp值应该在0~2之间。
先设定kp=-0.6,我们可以看到,当我们把小车摁在地上旋转的时候,我们可以很轻易的转动小车,说明目前小车没有通过负反馈把目标角速度控制在零附近,而是通过正反馈帮助我们旋转小车,说明了这个时候小车的转向系统是正反馈的。
然后我们设定kp=0.6,这个时候我们把小车摁在地上旋转会发现使用很大的力也难以转动小车,小车会反抗我们,并通过电机保持角速度为零,这就是典型的角速度负反馈效果,也是我们需要看到的效果。
■确定kp的大小
下面我们进行平衡小车转向控制kp值的整定,此时需要打开直立环和速度环。
首先设定kp=0.2,这个时候我们可以看到,小车的转向控制比较弱,走直线的偏差非常大。
设定kp=0.6,这个时候我们可以看到,小车的角速度控制的响应有所加快,但是走直线还不是特别理想。
设定kp=1,这个时候我们可以看到,小车走直线的效果已经很不错了,我们接下来尝试加大kp值看一下效果。
设定kp=1.6这个时候我们可以看到,小车虽然走直线的效果更好了,但是小车在急停的时候有剧烈的抖动。
所以这组参数不可取。
我们可以确定得到kp=1是转向控制P参数的理想值。
至此,转向控制调试部分就告一段落了,如果要加入遥控转功能的话,转向控制函数应该改成如下所示(其中加粗部分为是实现遥控功能的代码):
intturn(intencoder_left,intencoder_right,floatgyro)
{
floatTurn,Kp=1,Bias;
if(1==Flag_Left)Turn_Amplitude=1100;
elseif(1==Flag_Right)Turn_Amplitude=-1100;
elseTurn_Amplitude=0;
Bias=gyro-0;
Turn=-Bias*Kp;
Turn+=Amplitude;
returnTurn;
}
关于这个包括了遥控左右转向的转向控制函数,做如下解析:
1.在usart3.c中的串口3接收中断函数,改变Flag_Left和Flag_Right,进而
遥控小车。
1.Turn+=Amplitude;转向遥控叠加在转向控制里面。
附录1.双轮自平衡车物料清单:
部分
名称
个数
价格
底座
铝合金底座
1
电机
带编码器和减速器电机带轮胎
2
电机驱动
L298N双直流电机驱动
1
传感器模块
MPU6050传感器GY-87
1
超声波模块
HC-SR04超声波模块
2
降压模块
LM2596DC-DC降压可调
1
电源
12V可充电电池带充电器
1
核心控制板
STM32F103RCT6最小核心板
1
STM下载器
ST-LINKV2
1
蓝牙模块
A09HC-05主从机一体蓝牙模块
1
Wifi模块
ESP8266串口wifi模块CH-340
1
万能板
7*9万能版
3
电源座及插头
5.5*2.1
2
导线和杜邦线
导线母对母杜邦线
若干
铜柱及螺丝
普通
若干
附录2
摘要1、STM32F103RCT6芯片资料
2、买模块自带的资料。
3、飞思卡尔设计的方案。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双轮 平衡 设计 报告