智能车调速部分

来源:互联网 发布:csol怒海狂鲨加6数据 编辑:程序博客网 时间:2024/04/28 18:46

下载本文: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算法的通俗理解(转)_小桥流水_新浪博客



0 0
原创粉丝点击