概述
下载本文:http://pan.baidu.com/s/1qWAW49m
【杂谈】本文是自己在整理智能车项目相关心得时所作,与大家分享。如需转载请注明出处,谢谢!
【1.1】 智能车简单调速
测速 : 要实现闭环控制,先要进行测速
根据一个稳定可靠的测速值,才能有实现有效的速度控制
/* 定时中断测速 */
void PIT0_IRQHandler(void)
{
PIT_Flag_Clear(PIT0); //清中断标志位
speedValue=speedCounter/6; //读取所测值,除以6是平均滤波,使得测速值稳定,去掉环境一般干扰造成的浮动
speedCounter = 0; //清计数
speedControl();
}
速度控制如何实现,首先大了要调小,小了要调大
void speedControl(void)
{
static u32 duty;
if(speedValue<speedSet) duty++;
else if(speedValue>speedSet) duty--;
SET_MOTOR_DUTY(duty);
}
这样确实可行,但显然调节的太慢了,我们改进一下,变化一下每次调整的幅度,根据什么变化?
误差越大,调整的幅度就越大,误差小了,调整幅度也随之减小,这样与成比例K地调节:
void speedControl(void)
{
static u32 duty;
if(speedValue<speedSet) duty+=K*(speedValue-speedSet);
else if(speedValue>speedSet) duty-=K*(speedSet-speedValue);
SET_MOTOR_DUTY(duty);
}
把两个式子合成一个:
void speedControl(void)
{
static s32 duty;
duty+=K*(speedSet-speedValue);
SET_MOTOR_DUTY(duty);
}
当然,设置占空比前还要先进行限幅。
K如何确定呢?
先进行测速,记录占空比对应的测速值,求出速度和占空比的大致比例,就可以作为初定的K值
实际建议采用高级调速,这种方法只是PID调速的I分量控制(不是P分量控制)。
不是P分量控制?比例项为何不是和当前误差成比例,当前误差越小,调整量越小,这不是比例调节吗?
对增量式的理解有误。
比例项是对当前误差加权作为下次输出值的一个分量,而不是作用于下次输出和上次输出的增量的。
脉冲计数器值除以6还是缩小速度采样周期为原来的六分之一?
前者相当于平均滤波,后者即时性更强。
【1.2】智能车高级调速 PID基础知识
比例、积分和微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)和微分(Differentiation)控制,简称PID控制。比例作用P只与偏差成正比,积分作用I是偏差对时间的累积,而微分作用D是偏差的变化率。
根据上面的定义可以写出公式:
比例P代表着现在,积分I代表着过去,而微分D则代表着未来
(摘自http://www.cnblogs.com/pang123hui/archive/2010/08/16/2309974.html)
为什么这么说?
我们知道一个曲线上的一个点的
e(t)是误差关于时间的函数,一个时刻t0的误差为e0,比例项就反映当前时刻的误差值,积分项是求积分,反映之前误差的累加值,微分项是求导,即斜率,是反映误差的变化趋势。我画个图:
反馈控制思想——利用误差,消除误差
假设要实现控制某量从A调整为B,每一次控制都得到一个输出,而反馈信息就是每次的输出值,一个闭环的控制策略无非就是采用一种方法,利用这些反馈信息指导下一次控制。
PID控制相当于把全部误差数据划分为历史,当前,未来三个分量,并赋予不同权重后加和,得到下一时刻的控制量。
推导增量式PID
对PID基本式求导,就得到下面的式子
d_u=P*d_err+I*err+D*dd_err(dd表示2阶导)
( pk += kp_motor * d_error + ki_motor * error + kd_motor * dd_error; 上面网址里代码的核心部分 )
这就是增量式PID控制,由于运算输出的是增量,所以叫增量式。
离散化,求导就是求此刻与上一时刻的差值,编程就很容易了。
结合上一节,加深增量式PID的理解
首先,如果error越大,即设定值与测得当前值相差很大,则调整值越大,若error很小,则调整值也很小,所以,偏差值error和占空比调整值成正比,可以写出以下语句:
dutySet += K*err;//err= speedSet – currentSpeed;
这就是积分项(err),求导为比例项(∆err),再求导为微分项(∆∆err)(离散的求导即为两次差值,变化量)
当且仅当err=0时,积分项为零,因此,积分项可以消除静态的误差;
而比例项为两次err的差值,为误差的变化率,如果按照积分调节,可以编程绘制一个曲线,曲线越接近设定值越平稳,开始非常抖,也就是说斜率由大变小,那么如果大的斜率对应大的调节,小的斜率对应小的调节,则会进一步加快调节进程。
进一步加快调节进程,就是微分项。
【1.3】PID应用
PID应用
增量式是求导而得,积分即得到位置式
位置式:输出为——固定位置值+偏移量,应用:舵机
增量式:输出为——上次输出值+增量,应用:电机
PID调速的作用:
电池问题
路况问题
上下坡 加PID保证匀速,上坡可以提速,下坡可以减速
障碍 华德车的例子,直道加速,遇到障碍猛地卡住,猛地加速,冲出赛道
改进
修改PID为ABC型,提高效率
dutySet +=Kp(e0-e1)+Ki*e0+Kd*( (e0-e1)-(e1-e2) )
简化为ABC
dutySet +=A*e0-B*e1+C*e2
A=Kp+Ki+Kd
B=Kp+2Kd
C=Kd
其他:
修改代码结构:数据结构改进,改为结构体定义
提升代码速度:算法改进,为指针操作,指针循环移动
添加高阶导数项,调节速度更快
分段控制:全bangbang加速,PID减速,直接置零,反转的PID减速
高级控制思想——自适应控制、模糊控制、预测控制、神经网络控制、专家智能控制等等
注意
写程序
相关变量用static继承或者全局变量、宏定义
数据类型:误差有符号
PID参数整定
调试看什么?改变期望值,看实际值和控制量的变化(控制量:仅仅看实际值不够,还要看控制量是否平滑,控制量即电机占空比。)
整定三个参数要注意:三个系数互补,不能简单的采用控制变量法逐个调节。
[引用]打个比方,如果现在的输出是1,目标输出是100,那么P的作用是以最快的速度达到100,把P理解为一个系数即可;而I呢?大家学过高数的,0的积分才能是一个常数,I就是使误差为0而起调和作用;D呢?大家都知道微分是求导数,导数代表切线是吧,切线的方向就是最快到至高点的方向。这样理解,最快获得最优解,那么微分就是加快调节过程的作用了。
按照PID调好参数后,简化公式为本次误差,上次误差,和上上次误差的线性组合,即可加快PID算法的速度。
【1.4】对PID的理解
[引用]打个比方,如果现在的输出是1,目标输出是100,那么P的作用是以最快的速度达到100,把P理解为一个系数即可;而I呢?大家学过高数的,0的积分才能是一个常数,I就是使误差为0而起调和作用;D呢?大家都知道微分是求导数,导数代表切线是吧,切线的方向就是最快到至高点的方向。这样理解,最快获得最优解,那么微分就是加快调节过程的作用了。
按照PID调好参数后,简化公式为本次误差,上次误差,和上上次误差的线性组合,即可加快PID算法的速度。
为何采用增量式
【引用】 PID一般有两种:位置式PID和增量式PID。在小车里一般用增量式,为什么呢?位置式PID的输出与过去的所有状态有关,计算时要对e(每一次的控制误差)进行累加,这个计算量非常大,而明没有必要。而且小车的PID控制器的输出并不是绝对数值,而是一个△,代表增多少,减多少。换句话说,通过增量PID算法,每次输出是PWM要增加多少或者减小多少,而不是PWM的实际值。
【嵌入式小家】PID控制算法的C语言实现四增量型PID的C语言实现_嵌入式小家_百度空间
【比喻有些牵强】飞思卡尔智能车PID算法的通俗理解(转)_小桥流水_新浪博客
最后
以上就是贪玩时光为你收集整理的智能车调速部分【1.1】 智能车简单调速【1.2】智能车高级调速 PID基础知识【1.3】PID应用【1.4】对PID的理解的全部内容,希望文章能够帮你解决智能车调速部分【1.1】 智能车简单调速【1.2】智能车高级调速 PID基础知识【1.3】PID应用【1.4】对PID的理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复