智能车调速部分

2023-05-16

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



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

智能车调速部分 的相关文章

随机推荐

  • dtsi编译错误

    1 FATAL ERROR Unable to parse input tree DTC arch arm64 boot dts rockchip rk3568 evb1 ddr4 v10 dtb Error arch arm64 boot
  • 理解dtsi中的&

    1 dtsi中的 amp 怎么理解呢 可以把它理解引用 xff0c 因为dtsi中的每个模块 xff08 驱动程序 xff09 都是用 xff5b xff5d 包在内的 xff0c 所以当你要修改某个模块A时 xff0c 可以不直接在它定义
  • 根据用户IP抓取MEC地址

    package com ccit web recommonedCode dao impl import java io BufferedReader import java io InputStreamReader import java
  • 说一说 RTThread 系统 开发过程的坑。。。

    1 系统文件 与 ST 官方的不一致 xff0c 无法兼容Cube MX xff0c 导致用户自行开发 外设时 需要大量初始化工作 xff0c 而且遇到问题难以查找 原因 xff0c 因为系统初始化过程 与官方差异较大 xff0c 这点 入
  • 几种2.4G无线数传模块电路

    一 几种2 4G无线数传模块介绍 无线数传按传输速率区分 分为低速数传模块和高速数传模块两大类 低速数传模块 使用的载频均较低 xff0c 一般都在 315MHz 433MHz 和 915MHz 这几个频段 xff0c 所以一般最高传输速率
  • 自动控制之PID原理

    自动控制原理 从控制的方式看 xff0c 自动控制系统有闭环和开环两种 闭环控制 xff1a 闭环控制也就是 xff08 负 xff09 反馈控制 xff0c 原理与人和动物的目的性行为相似 xff0c 系统组成包括传感器 xff08 相当
  • shell之正则表达式

    一 正则表达式 正则表达式 xff1a 描述某些字符串匹配规则的工具 使用原因 xff1a 程序设计过程中不可避免的遇到处理某些文本情况 xff0c 有时候要查找符合某些比较复杂规则的字符串 正则表达式以非常简单的代码完成 常见的支持正则表
  • Pixhawk在MP上的校准

    一 机架类型 xff08 1 xff09 连接飞控 xff08 2 xff09 初始设置 机架类型 xff08 3 xff09 选择下面对应机型即可如图中红圈 xff0c 另外 xff0c 加载参数项不要加载 xff08 暂时不清楚参数代表
  • Pixhawk在MP上的故障保护

    一 油门故障保护 油门故障保护 xff1a 遥控器油门PWM值低于预设保护值时 xff0c 飞行器触发故障保护 xff0c 避免坠机 触发条件 xff1a 遥控器故障 xff0c 遥控器与飞行器失联 设置 xff1a 地面站初始设置 故障保
  • Pixhawk开发环境搭建之PX4固件编译

    一 Windows环境下编译 1 1编译前期准备 1 软件下载 需要安装CMake Java jre或者jdk以及PX4 Toolchain Installer 下载链接如下 xff1a CMake xff1a https cmake or
  • Pixhawk地面站搭建问题

    一 Misson Planner 1 1 软件安装 http www playuav com article 36下载MissonPlane 安装过程中会自动安装驱动 xff0c 不行再去官网下载PX4drive http dev px4
  • Pixhawk-PX4固件之hellosky

    一 第一个应用程序 环境 xff1a ubuntu14 04LTS 来源 xff1a Firmware src example px4 simple app 两个文件 CMakeLists txt和px4 simple app CMakeL
  • pixhawk-px4之通过串口添加传感器应用

    前言 xff1a 看到有博客通过串口添加自定义传感器 xff0c 按照步骤做了一遍 博客 xff1a http blog csdn net msq19895070 article details 52012190 一 串口选择 Pixhaw
  • python开源项目目录结构参考

    下面列出python开源项目的通常目录结构及说明 xff1a tx 如果你使用Transifex进行国际化的翻译工作 xff0c 创建此目录 config Transifex的配置文件 PROJ NAME 按照你实际的项目名称创建目录 如果
  • 安卓开发环境搭建

    系统 xff1a windows 64位 安卓开发环境是在java jdk的基础上配合android studio 集成开发环境或者eclipse 43 Android SDK 43 ADT的形式 一 JDK安装 JDK的全称是Java S
  • Helloworld应用程序结构分析

    一 新建HelloWorld工程 1 打开 Eclipse xff0c 点击 File gt 34 New 34 gt 34 Project 34 Android Application Project 34 34 在弹出的 New And
  • Ubuntu软件包apt-get无法更新解决办法

    Ubuntu软件更新的时候报错 Reading package lists Building dependency tree Reading state information You might want to run 39 apt ge
  • 游戏开发人员需要看的书籍

    编码习惯及设计基础 程序员修炼之道 http product dangdang com 9053091 html 这本书讲解的一些设计原理很实用 对设计感兴趣的同学可以一看 推荐指数 5星 图形渲染 客户端 3D绘图程序设计 http pr
  • 【MySql】杂记

    1 mysqldump常用于MySQL数据库逻辑备份 二进制日志文件 中提供了执行mysqldump之后对数据库的更改进行复制所需要的信息 2 要显示存储过程传出的值 xff0c 需要使用show关键字 3 MySQL数据类型 decima
  • 智能车调速部分

    下载本文 xff1a http pan baidu com s 1qWAW49m 杂谈 本文是自己在整理智能车项目相关心得时所作 xff0c 与大家分享 如需转载请注明出处 xff0c 谢谢 xff01 1 1 智能车简单调速 测速 要实现