aeLab
  • home
  • aeDesign
  • aeLab
  • 购买

aebalance教程

2017年6月7日sjm15
轻松入门
运动原理
速度传感器
倾角传感器
电机控制
PID控制
参考文献
轻松入门
  • 小车介绍

不多说直接上小车的零部件:

  • 程序下载与调试

我们的小车主控芯片采用的是STM32系列的MCU,可以使用多种工具进行程序下载和调试,其中程序调试工具Jlink除了可以下载程序还能进行程序的debug,详细的教程可以参考你所使用的程序调试工具的连接说明。我们在《STM32 JLink工具使用教程.pdf》里面进行了分享。

如果你实在没有程序调试工具我们可以采用STM ISP下载方式进行下载,其所使用的是我们提供的CP2102串口工具,详细连接方式参考CP2102模块的应用手册《STM32 ISP Download.pdf》。但是我强调一下如果想认真学习自平衡小车的一定要具备程序调试工具。

  • 调试与控制工具

上面介绍的是基本程序下载与程序调试,但是在实际中我们的小车需要不停地调整参数来使小车的姿态和控制更加稳定,我们提供了Windows版的桌面调试工具和Android版手机调试工具。

在工具上我们能设置小车的各种参数,并且能实时通过图形化界面来了解小车的姿态,通过Android版本的调试控制工具能够通过无线蓝牙来调整小车的参数以及能控制小车的运动,让你的制作更加自由自在。

在工具上我们能设置小车的各种参数,并且能实时通过图形化界面来了解小车的姿态,通过Android版本的调试控制工具能够通过无线蓝牙来调整小车的参数以及能控制小车的运动,让你的制作更加自由自在。

另外在学习的过程中我们会了解串口工具,以及了解小车传感器的工作原理时我们会使用到串口助手工具——串口猎人。

最后最重要的就是Keil-MDK,这是编写STM32程序最常用的工具,我们在编写程序阶段是离不开它。

运动原理
  • 姿态平衡分析

  • 运动轨迹分析

  • 快速理论分析

自平衡小车的理论研究有很多,有复杂的也有简单的,这里为了快速入门我们只进行简单的理论分析。

1、直立控制分析

我们先分析一个很常见的普通单摆,如下图。一个质量为m kg的铁球,由一根线拉着,当我们拉到°后,自由释放小球,这时小球会在中心点左右摇摆几次后停止。

大家都很清楚铁球之所以能摆动是因为重力的作用和惯性的存在,铁球不会不停地左右摇摆下去是因为空气的摩擦力F存在。现在我们想让铁球能够快速地停下来,有什么方法?答案很明显,1)加快铁球往下的速度2)减少左右摆动的次数。

1)加快铁球往下的速度。提高铁球的加速度,在没有外力的作用下提高加速度只能提高g,那只能移到外星去了。这里只是说明加快速度的方法,就是增加加速度。

2)减少左右摆动的次数。增加摩擦力,如果让铁球在水里做这个实验就会摆动次数很少。在实际中这个摩擦力是和速度是成正比的F=kv,作用力方向相反。

回到自平衡小车,如上图。小车发生了°的倾斜,如果没有任何动作,下车就在重力的作用下倒下。现在小车以加速度为a m/往前加速,这个加速度会在车上产生一个反作用力。现在我们把小车的重力和加速度的反作用力分解为上图中红色的两个力,如果这两个力大小相等、方向相反,小车就不会继续往下倒。

如果当下车就不会倒下,和上文描述的单摆一样,由于惯性小车会在平衡点左右摆动。因此需要阻尼力(摩擦力)来加快小车的平衡,空气的阻力显然是不够的,需要额外添加阻力来加快平衡,,这个力大小和角速度成正比,方向相反。因此通过电机来产生的回复力为:

这两个系数的作用见下图,其中决定了小车是否能够平衡以及平衡的速度,决定了小车的阻尼力大小,适当的大小能减小小车的振荡,加快小车稳定。

2、速度控制分析

前面的分析已经能使小车保持平衡了,不会受重力的作用倒下了。但是如果仔细回过来看一下下面两条公式:

假设现在小车已经平衡了,也就是θ^‘=0,此时小车加速产生的反向作用力的分量F:ma∙cosθ和小车自身重力的分量mg∙sinθ,由于小车是一个机械系统时常受外力的干扰,平衡时的θ不会总是为0°,这样总要一个不为0的小车加速度a存在,这样就需要小车不停地加速,但是小车不可能一直加速下去,这样小车仍然会倒下。

那么如何解决这个问题,不让下车不停地加速?控制小车的电机反向转?如上图的转速方向,但这个很明显,如果加了这个速度,前面的直立所要的条件就无法满足了,小车会更快地倒下。

实际的解决方法是,再加一个如上图的加速前进的加速度,这个相当于当发现小车不停地往前加速时,小车需要一个更快的速度来加上这个速度。这个加速度和前面小车直立控制中一样,也需要一些输入量来输出电机的控制力,在直立控制中我们使用了角度和角速度作为输入量。显然在速度控制中我们肯定需要速度相关的量作为输入量,速度的相关量有:速度的积分(路程),速度的微分(加速度)。

根据上面的分析,小车会不停地往前加速跑,我们需要一个更大的回复力来消除这个倾角θ_2 ,小车的速度量可以作为输入量,小车的路程也很明显也能作为输入量。

最终电机对小车的控制力:

速度传感器
  • 硬件原理

检测小车的速度,最简单的方式是检测电机的转速,我们采用的是霍尔传感器。霍尔传感器的工作原理我们不做介绍了,我们检测速度的传感器的结构如下图:

图中所示的是一个经向8极性磁铁,A、B是两个霍尔传感器,其摆放的位置呈一定的角度,使得A、B输出的周期方波相位相差90°。在图示的传感器结构中,电机转一圈每个霍尔传感器会产生4个脉冲,两个霍尔传感器之间会有90°相位差(如上右图所示)。上图只是一个示例,在我们的小车所使用的磁铁的极性会更多,因此会产生更多的脉冲。

  • 速度编码


下面我们分析A、B产生的电平的每一个状态,用二进制表示。

上表已经把正转、反转时的编码信息列出来了,因此我们只要对A、B传感器的输入电平分别设置中断,来捕获H->L和L->H越变的时刻,并组合A、B通道在这一时刻的前后的电平值来获得编码值,最后查表来判断是正转还是反转,正转就+1,反转-1。下面是对应得表格数组:Encode[16]={0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0},数组元素的编号就是对应的编码值,其中没有对应的正反转编码值的结果就定义为0,就是电机没有正转也没有反转。

  • 软件实现

我们的小车使用的STM32控制器,本身的定时器就具备编码器模式,无需我们自己编写中断程序来实现转速的判断,我们只需设置好STM32的寄存器,然后直接读寄存器内的结果就能知道转速了。[1]
每个通用定时器都有4个输入通道CH1~CH4,CH1和CH2能够作为AB相霍尔传感器的两个输入,实现编码器模式需要对定时器进行如下寄存器配置[1]:

我们的小车采用了TIM3和TIM4两个定时器分别来获取两个电机的编码值,在程序的编写中采用的是库函数。具体对定时器的配置如下:

Click Me
倾角传感器
  • 原理分析

在我们的小车中获取倾角的器件采用的是六轴传感器芯片MPU6050,其能直接输出三轴的加速度量和三轴的角速度量(详细教程参考MPU6050系列视频)。
我们先来直接看一下结果,把小车放正我们会发现其加速度Z轴的值很大,其它两轴的值会很小,有人会问我们没有移动小车为什么会有Z轴加速度,其实这个值就是重力加速度。我们就是要利用这个重力加速度来获取小车的倾角。

在小车发生倾斜时,重力加速度会在Z轴和Y轴上分别产生分量,根据这两个值就能计算出小车的倾角θ°。
另外MPU6050是具有陀螺仪功能的,能够直接测量角速度θ^’,我们需要的是绕X轴的角速度值。

到此为止我们在小车姿态平衡分析中,电机控制力的两个角度相关的输入量θ和θ^’已经都获取到了。

  • 互补滤波

我们很高兴地获得了角度和角速度,那能够实现小车的平衡了吗?在实际小车运动的时候,加速度不仅有重力加速度,还有因小车运动时产生的加速度对角度的计算会产生很多噪声干扰,因此我们需要引入滤波算法[2]。

我们可以看出直接采用加速值获得的角度,其噪声只要表现为高频噪声,因此我们引入低通滤波器,实现的方式可以采用下面的计算方式:

但是这种方式的缺点是输出信号和实时的信号有较大的延时,无法实时反应小车的实际倾角情况。

我们也可以通过对加速度的积分来获得小车的倾斜角度,实现的方式可以采用下面的计算方式:

但是这种方式的缺点是陀螺仪本身会有漂移,就是当实际转速为0时,通过陀螺仪读到的值不为0,这样的话积分会不停地累计误差,造成角度值计算不准确。

互补滤波会结合上述两种滤波方法,使用加速度传感器获得角度值对陀螺仪积分值进行校准,从而实现角度获取的实时性同时也能降低小车运动时的高频干扰。实现的方式可以采用下面的计算方式:

电机控制
  • 原理分析

根据前文快速理论分析一章中,已经分析了小车需要电机输出可控的推力

那么问题来了,如何使用电气信号来控制电机输出的推力?

直流电机的结构如上图,主要有永磁体和绕线转子,还有给绕线转子提供电压的电枢,当我们给绕线转子提供一定电压后,在绕线转子上产生和磁场和永磁体的磁场形成相互作用力,绕线转子就会开始旋转。
这个力在就是我们在学校里面学过的安培力,就是磁场对电流的作用力,其定量的值是F=BIL,B是磁场的大小,L是导线的长度,I是电流大小。因此只要我们控制着三个值得大小就能实现对电机输出的推力的控制,很明显磁场大小由永磁体本身的磁场大小决定着,我们无法实时改变它,导线的长度在电机出厂的时候就已经固定了,也无法改变。因此我们只能控制电流大小来改变电机输出的推力。

  • 电压控制

很多朋友可能直接想到,控制绕线转子的两端电压就能控制其电流大小。如左图,采用电阻分压就能实现对电压的调节,从而控制电流的大小。但是这个控制中接入的电阻会发热带来额外的损耗,同时调节电阻的大小在实际的控制中很难操作。

  • PWM控制

脉冲宽度调制“Pulse Width Modulation”大量应用在工业控制等很多领域,其控制比电压控制简单很多,其基本的原理也是控制电流的大小。
顾名思义PWM控制会输出一系列的“ON-OFF”脉冲信号,并且能够改变占空比。当ON的时候,会有电压直接作用在电机上从而电机旋转,当OFF的时候,就没有电压作用在电机上,那么电机就会停止吗?如果停止了那么PWM控制方式会出现电机转转停停的情况,就不满足我们的控制需求,但实际中没有出现这种现象。为什么呢?
其实在电机内的绕线可以等同于电感,其特性是电流不会突变,就是当电压从有到无时,其电流不会立刻消失,而是缓慢降下来,这就能让电机在无电压时也能保持短时间内的旋转。另外电机是机械体其旋转会有惯性,也能让电机连续转动,让你感觉不出电机的停顿。
我们可以换一种简单的理解,当改变了占空比之后其平均电压也会随着改变,从而电机的平均电流也会发生改变,进而电机的推力能够被控制。[3]

显然PWM控制比电压控制简单,并且无需特别复杂的器件,只需一定的占空比来控制MOS管的导通,我们的aebalance就是通过PWM来控制小车的电机的。
使用PWM控制虽然简单,但是也需要关注一些事项:
频率:既然PWM控制,那就需要基本的控制频率,如果需要一个高效精确的控制,控制频率是需要结合电机的各个参数,如电感、永磁体强度等,来确定这个值。我们这里只遵循一些简单的原则。频率不要选择在人耳敏感的频率范围,会有刺耳的噪声。频率不要太小,会造成电机电流的不连续,电机会出现抖动。频率也不能太大,会造成MOS管的开关损耗加大。不做过多复杂分析,我们选择的频率是20KHz。
死区:由于电机的摩擦力存在,在占空比极小的情况下虽然有电流存在,但是电机是不会转动的,这对我们的控制带来一些不利的地方,尤其在静态直立平衡控制中,因此需要一些死区处理

PID控制

前文已经对小车做了详细的分析,在控制公式中F=k1∙θ+k2∙θ’+h1∙v+h2∙∫v,k1 、k2 、h1 、h2四个参数我们还没有确认,本章节我们就对这四个参数和一些其他相关参数进行确认。这些参数没有一个万能的值,都需要根据实际的情况来进行标定,比如汽车在批产前都需要进行标定来匹配发动机的特性,实现最佳的发动机状态。这些参数也和使用的期望状态有关,比如有些人希望开车舒适一点,有些人希望动力强劲点,这些很难同时满足,只能折中或者根据喜好而定,就像很多汽车能切换工作模式.

  • PID理论

其实这些参数就是PID控制理论中PID参数值,k_1 、k_2分别对应角度PD环的P参数和D参数,h_1 、h_2分别对应速度PI环的P参数和I参数。那么什么是PID控制?百度一下会发下一堆的答案,我找了一个最生动的来分享一下。[4]

有一辆小车需要沿着蓝线行走,它能够控制自己的转向角度,我们如何设计控制程序来让小车一直沿着蓝线行走。很明显我们可以根据离蓝线的远近距离∅来调整我们的转向角度θ,保持其正比关系,表示为θ=Kp*∅,这就是比例调节。但是我们在实际会发现如果Kp值设的比较大,小车不会一到蓝线就一直沿着蓝线前行,它会绕着蓝线走;如果设置的比较小,小车回到直线会比较慢。

我们引入一个新的调节项θ=Kp*∅+Kd*∅^’,∅^’表示小车距离蓝线的远近变化快慢,就是我们希望当小车靠近蓝线速度越快时,我们需要一个及时地控制转向大小,就是要当速度越快阻尼力需要越大,这个可以结合我们小车直立控制分析一起想一下。如下图蓝色的箭头代表Kp*∅产生的转向角,绿色代表Kd*∅^’产生的转向角(减缓蓝色的角度),最后形成红色的转向角,这时能够让小车快速的延蓝线直行。这个新增加的项就是微分控制项。

到这里还有问题,当小车通过前面的转向角度控制后虽然能够延蓝线直行,但是会出现如下的一种情况,小车的中心点没有完全和蓝线重叠,有一定的偏差。在这个时候由于小车离蓝线的距离是不会变化的,因此Kd*∅^’产生的转向角为0,仅有比例项Kp*∅产生的转向角,由于离蓝线很近这个值会很小,另外由于小车和地面有一定的摩檫力,这个很小的转向无法克服这个摩擦力。

为了解决这个问题我们又新增加一个调节项 θ=Kp*∅+Kd*∅’+Ki*∫∅,∫∅ 表示小车距离蓝线距离的积分,即使∅很小也会在一定积分后有足够的转向角度来把小车调整回蓝线。这个项就是积分控制项。

  • 参数标定

下面我们进入小车的各个参数的调整阶段,网上也有很多调试的方法,大家可以参考一下。如何能看我们的视频就直接忽略标定这两节内容,我们这里的调节方法是大概的趋势,不必要把小车调节到完美状态我们是为了学习PID的相关知识。

和其它PID调节方法一样,我们是先调节小车的直立后调节小车的速度环。
1、 调节直立环的P参数,从小往大调直到能够保持小车平衡,继续调大P参数值,会发现小车开始前后抖动;
2、 调节直立环的D参数,从小往大调直到小车的抖动消失;
3、 调节速度环的。

参考文献

[1] AN4013.pdf STM32定时器应用笔记
[2] The Balance Filter.pdf MIT滤波PPT课件
[3] http://www.electronics-tutorials.ws/blog/pulse-width-modulation.html
[4] https://www.youtube.com/watch?v=4Y7zG48uHRo

Previous post aebalance Next post ST-Link V2

2874 comments. Leave new

© 2017 All rights reserved. Designed by aelab