轮式驱动单元电机PID控制说明
2015-09-14 21:24
176 查看
PID控制是一种简单有效且具有较强鲁棒性较强的控制手段,在任何一本关于自动控制的教材中均可找到相应的介绍,在此不过多介绍基本原理,而侧重于程序的使用方法及其在轮式驱动单元中的测试结果。
目前机器人的电机大多采用脉宽调制(Pulse width modulation)或简称PWM进行控制,而不是使用模拟功率电路。在软件中通过改变脉冲宽度(如图1,上图对下图),我们可以改变等效的模拟电机信号,从而达到控制电机转速的目的。电机系统的行为就像是一个积分器,在一定时间的范围内对数字信号进行积分。而 则称为占空比。
图1 PWM
问题1 电机控制的非线性
比较遗憾的是,通常情况下,电机所产生的速度与PWM信号比并非是线性关系,如图2是我们对轮式驱动单元进行实验的结果,而图3右图则是我们查阅得到的Faulhaber 2230电机的测量曲线,图3左图是电机的阶跃响应。由于实验的电机的减速箱和速度的单位的不同,图2、3所得到的具体数值不尽相同,但它们却共同反映了电机PWM控制的一个特性——非线性!
图2 轮式单元车轮转速(周每秒)/PWM
图3 Faulhaber 2230电机的阶跃响应与速度/PWM比
问题2 开环控制的不准确
通常电机可以实现正/反转、速度调节。但是,我们却并不知道电机实际的运行速度。应当注意到电机的实际运行速度并不仅仅只与输入的PWM信号有关,还会受到例如负载(例如机器人的重量或是驱动区域的倾斜程度)等外部因素的影响。如果使用开环控制的话,在低速情况下,电机的扭矩通常也非常的小。
解决方法 增加PID控制
电机增加编码盘后,便为闭环控制的实现提供了物质基础。但仅仅是简单的反馈是不够的,简单的比例P反馈控制利用误差进行校正,而误差却是始终存在的(只是能将控制在有限的范围内),若想实现零稳态误差响应,还需要增加一个积分I环节。如果想进一步提高机器人的灵敏度(动态响应性能)还可以增加一个微分环节D,这样便可以组成一个PID控制器。但在这里不建议大家使用微分D环节,因为稍有不慎便有可能造成振荡,而在此应用中D环节对性能的提升也十分有限。下面我们介绍一下我们编写的程序。
PID控制程序
注:我们是在Arduino下进行的开发,但此程序进行简单的修改便可移植到任何类型的单片机上。
1、连接接口针号设置
A、B、C分别表示三个不同的轮式单元,ctrl_1、ctrl_2、ctrl_3表示三个电机控制线,counter是编码盘输入,analog是电机电流检测(用于观测电机是否堵转,当读数超过532并持续一段时间时,表示堵转,应及时断开电机以避免烧毁)
2、主要参数设置
Kp为比例值,我们设为1,通常越大调节速度越快,代价是有可能出现超调,或超调过大甚至是不稳定。Ki是积分项,我们设为4.
3、PI控制程序
我们首先需要将码盘连接至一个中断,每来一次中断便counter++。当中断设为FALLING或RISING时NUM_C设为100,因为码盘100个齿每转一周产生100个FALLING中断。当中断设为CHANGE时,则是NUM_C设为200,因为码盘100个齿每转一周产生200个CHANGE中断。然后我们通过记录一个周期looptime内counter的增加数便可得到实际的转动速度(转/秒),如下。
误差项为期望速度(转/秒)减去实际速速。
PID控制量如下:
更新积分值,注意last_I应使用静态变量,以不断积分。
PI完整代码如下,我们的代码非常简单,关键的只有几行(便于学习),并且在经过了实际的测试,即使在低速的情况下仍能保持较大的力矩,无论上坡还是下坡均能保持指定的速度巡航。我们发现在Arduino论坛里有一个PID类(附件中),感兴趣的读者可以拿来研究使用一下。
目前机器人的电机大多采用脉宽调制(Pulse width modulation)或简称PWM进行控制,而不是使用模拟功率电路。在软件中通过改变脉冲宽度(如图1,上图对下图),我们可以改变等效的模拟电机信号,从而达到控制电机转速的目的。电机系统的行为就像是一个积分器,在一定时间的范围内对数字信号进行积分。而 则称为占空比。
图1 PWM
问题1 电机控制的非线性
比较遗憾的是,通常情况下,电机所产生的速度与PWM信号比并非是线性关系,如图2是我们对轮式驱动单元进行实验的结果,而图3右图则是我们查阅得到的Faulhaber 2230电机的测量曲线,图3左图是电机的阶跃响应。由于实验的电机的减速箱和速度的单位的不同,图2、3所得到的具体数值不尽相同,但它们却共同反映了电机PWM控制的一个特性——非线性!
图2 轮式单元车轮转速(周每秒)/PWM
图3 Faulhaber 2230电机的阶跃响应与速度/PWM比
问题2 开环控制的不准确
通常电机可以实现正/反转、速度调节。但是,我们却并不知道电机实际的运行速度。应当注意到电机的实际运行速度并不仅仅只与输入的PWM信号有关,还会受到例如负载(例如机器人的重量或是驱动区域的倾斜程度)等外部因素的影响。如果使用开环控制的话,在低速情况下,电机的扭矩通常也非常的小。
解决方法 增加PID控制
电机增加编码盘后,便为闭环控制的实现提供了物质基础。但仅仅是简单的反馈是不够的,简单的比例P反馈控制利用误差进行校正,而误差却是始终存在的(只是能将控制在有限的范围内),若想实现零稳态误差响应,还需要增加一个积分I环节。如果想进一步提高机器人的灵敏度(动态响应性能)还可以增加一个微分环节D,这样便可以组成一个PID控制器。但在这里不建议大家使用微分D环节,因为稍有不慎便有可能造成振荡,而在此应用中D环节对性能的提升也十分有限。下面我们介绍一下我们编写的程序。
PID控制程序
注:我们是在Arduino下进行的开发,但此程序进行简单的修改便可移植到任何类型的单片机上。
1、连接接口针号设置
A、B、C分别表示三个不同的轮式单元,ctrl_1、ctrl_2、ctrl_3表示三个电机控制线,counter是编码盘输入,analog是电机电流检测(用于观测电机是否堵转,当读数超过532并持续一段时间时,表示堵转,应及时断开电机以避免烧毁)
Kp为比例值,我们设为1,通常越大调节速度越快,代价是有可能出现超调,或超调过大甚至是不稳定。Ki是积分项,我们设为4.
我们首先需要将码盘连接至一个中断,每来一次中断便counter++。当中断设为FALLING或RISING时NUM_C设为100,因为码盘100个齿每转一周产生100个FALLING中断。当中断设为CHANGE时,则是NUM_C设为200,因为码盘100个齿每转一周产生200个CHANGE中断。然后我们通过记录一个周期looptime内counter的增加数便可得到实际的转动速度(转/秒),如下。
相关文章推荐
- 研究生选导师失败经历
- Linux_rpm和yum实现程序包管理功能
- 对多线程对订单更新竞争的锁机制的实现-初构
- Spring缓存注解@Cache使用
- 解决toolbar嵌套nav进行页面跳转的时候有向下动作的问题
- 万事开头难,开了头就不难
- Win32汇编使用SQLite数据库
- Android网络连接----使用URLConnection连接网络简单例子
- Docker Runs on Windows Server 2016
- 3D GAME PROGRAMMING WITH DIRECTX11 (2)
- 数据结构实践——初始化顺序表怎么就内存溢出了?
- [LeetCode]:171:Excel Sheet Column Number
- Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)
- java基础-线程间的通讯问题
- 【硬件测试】华为2016校招·硬件技术工程师机考试题
- hdu 5363 组合数学 快速幂
- B\S备忘录28——EF强行多租户效果?谁来进谁的库
- using 与 派生
- (5.2.3) 写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket
- 第一天(开始尝试实例和阅读博客了)