直流电机PID调节——P

2023-10-30

其实要用PID调节的话,最好是使用带有编码器的比较高端一点的直流减速电机,但是因为它价格有点贵,所以我们一般做智能小车就会选用普通的直流电机,但是普通的直流电机也是可以使用PID调节的,虽然它的效果没有带编码器得到直流减速电机的好,但是我们也可以在调节的过程中慢慢地深刻的理解PID调节的含义。今天先来分享一下我刚刚涉及的PID中的P调节。

P就是比例:Proportion
它直接影响的是我们整个系统的响应速度,P参数越大,系统对外界的响应速度越快,P参数越小,系统对外界的响应速度越慢,当然P也不是越大越好,P大的话,就会让我们的系统产生比较大的超调量,这当然不是我们想要的结果,所以说任何事物都要适度才好。

我们都知道,PID调节中的一个很重要的参数就是误差,误差顾名思义就是我们目标值和实际值的差值,而这个P就是直接作用于这个差值上的,我们来看下部分代码

void SetLeftSpeed(u16 LeftSet,u16 LeftReal)//入口参数:目标值,实际值
{
    static int  LeftMotorPWM=0;
    int  LeftError=0,LeftIncPWM=0;

    LeftError=LeftSet-LeftReal;//本次偏差等于目标值减去实际值

    LeftIncPWM=(int)(LeftPID_Kp*LeftError);
    LeftMotorPWM+=LeftIncPWM;

    if(LeftMotorPWM>=90)
        LeftMotorPWM=90;
    else if(LeftMotorPWM<=10)
        LeftMotorPWM=10;

    SetLeftPWM(LeftMotorPWM);
}

上面这个子函数就是我小车上左轮子的PID调节(里面只有P调节)。
我们需要注意的是里面的几个变量:
1、LeftMotorPWM:通过PID调节出来的要赋给电机的PWM,它是本次PID调节和前面所有的PID调节共同积累出来的数值,所以它需要用static来进行修饰,把它变成静态变量,并且它的值有正有负,所以我们定义成int,而不是unsigned int。
2、LeftIncPWM:本次通过PID调节算出来的PWM值,他不是直接赋给电机的PWM,它只是本次PWM算出来的值,这也就是它和LeftMotorPWM的区别了。LeftIncPWM也是有正有负,我们同样需要定义成int,但它不是静态变量。
3、LeftError:本次PID调节中目标值与实际值的差值,这是一个很重要的参数。同样他也是有正有负,我们把它也定义成int,它也不是静态的。

然后我们来看一条重要的语句

LeftIncPWM=(int)(LeftPID_Kp*LeftError);

这个说白了就是PID调节中的P调节,没错就这么简单的一条语句。
他其实就是在我们的本次目标值与实际值的差值上面乘上了一个参数,这个参数就是Kp,回想一下我开头说的那句话,P参数越大,系统的响应速度就越快,仔细想一下是不是这个道理,我们要给电机的PWM就是由目标值与实际值的差值来实时决定的,误差越大,计算出来的PWM就越大,误差越小计算出来的PWM就越小,而P参数就相当于一条直线的斜率,斜率越大,纵坐标对于横坐标的变化就越敏感,也就是系统对于外界的变化的响应速度越快。

接下来看一下调试数据

其中Kp*100就是我设置的P参数,为了显示方便,我是让真正的P参数乘以100之后再用串口打印出来,也就是说,此时真正的P参数是0.12,左轮值是测速模块(测速光耦)返回来的电机实际速度值(其实不是电机的实际速度,只是测速模块触发的外部中断次数,在这里我就先称它为电机实际速度,它是可以代表电机速度变化的一个数值,所以说我们现在没有必要再去用公式计算电机的物理实际速度),这个电机实际速度是统计周期是100ms,即我是统计100ms测速模块触发的外部中断的次数。
设定值就是我们的目标值,就是我们想要电机达到的速度值,这里我同样是用相对于测速模块触发外部中断的次数来进行设定的,然后PWM值就是PID调节之后要赋给电机实际的PWM数值。
从串口打印的数据我们可以看出,刚开始电机的速度是0,设定值时3,因为实际值没有达到设定值,所有PID调节中P调节就会使PWM值一直在增加,增加到我们测到了电机实际值最大为12,我们设定值时5,他现在加速到了12,这个12-5=7就是所谓的超调量。继续往后看串口的数据,我们就会发现,电机的实际值慢慢地又降下来了,最终稳定在了设定值(也就是5)的附近,这就说明达到了PID调节中P的效果。

然后我简单的用matlab画了一下速度的大概曲线,虽然不是很专业,但是将就着看看效果吧

从曲线上我们可以看到,最终速度会稳定在设定值5附近,当然他不会一直稳定在5,他会一直在5附近上下波动。

接下来我把P参数调大,再来看一下效果

从串口打出来的数据就可以看出来,P调大之后,系统的响应速度变得快了,即它现在可以花很少的时间就可以把速度调到我们的目标值,但是随之而来的缺点就是,它现在对于外界的变化过于敏感,以至于它调节出来的PWM值会不停地波动,或者我们来看左轮值,也就是电机的实际值,它没有像刚才那样基本稳定在我们的设定值5附近,而是变化很大,这就是所谓的抖动现象,造成抖动的原因就是P参数太大,这个时候我们就应该再把P参数调小一点,直到达到我们想要的效果。然后看一下matlab画出来的曲线

我们发现,我们把P调大之后,电机的实时速度和我们设定的速度的差值就变得大了,即曲线波形的振幅变得更大了。

在串口打印的数据中,由于我设定的目标值有点小,所以可能只通过数据看的不是很清楚,但是整体上可以大概反映出PID调节的效果,具体参数是个人情况而定。

PID中的P调节就说到这吧。

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

直流电机PID调节——P 的相关文章

随机推荐

  • tmux系列:2、tmux会话

    tmux系列 2 tmux会话 文章目录 tmux系列 2 tmux会话 1 前言 2 创建会话 3 状态栏 4 命令和标志 5 命令提示符 6 附加和分离 7 会话清单 8 完全杀死tmux 9 总结一下 1 前言 其实最开始时候我用tm
  • less两种转换方式

    一 浏览器端转换 link导入 less文件
  • 深聊全链路压测之:第二十二讲

    解决 GoReplay 动态数据关联 1 引言 2 中间件 2 1 什么是中间件 2 2 如何使用中间件 3 关联 3 1 什么是关联 3 2 关联回放实现 4 总结 1 引言 第二十讲 我们聊的是GoReplay平台的搭建 在私下里 不少
  • 使用html表单制作简单网页(加表单详细知识点)

    表单也是html非常重要的一块 常用于输入信息 进行信息的收集和提交 属性 action 信息提交地址 method 提交方式 get 信息拼接在地址中 不安全 post 信息打包发送 安全 select 下拉菜单 option 下拉菜单中
  • 无法获取 java Console 对象

    在eclipse环境中调用System console 获取Console对象 打印返回对象为空 反复试验都是相同结果 Console con System console if con null System out println co
  • 分布式系统:数据分区

    数据分区 每一条数据只属于某个特定分区 一个大数据集可以分散在更多的磁盘上 查询负载也随之分布到更多的处理器上 每个节点对自己所在分区可以独立执行查询操作 因此可以提高查询的吞吐量 通常一个节点负责几个分区 采用数据分区的主要目标是提高可扩
  • Python手势识别与控制

    代码地址如下 http www demodashi com demo 12968 html Python手势识别与控制 概述 本文中的手势识别与控制功能主要采用 OpenCV 库实现 OpenCV是一个基于BSD许可 开源 发行的跨平台计算
  • Spring Security集成knife4j访问接口文档出现403

    目录 问题描述 解决过程 问题描述 使用的springboot版本是2 3 12 RELEASE 引用的依赖如下
  • 搜索引擎的故事

    本篇要介绍的搜索引擎包括 Shodan censys 钟馗之眼 Google FoFa Dnsdb等 介绍的内容主要是这几款搜索引擎的一些高级语法 掌握高级语法会让搜索结果更准确 Google搜索引擎 这里之所以要介绍google搜索引擎
  • 日常开发中常用的JVM调优参数有哪些呢?

    下文笔者讲述JVM调优参数的简介说明 如下所示 Xms2g 初始化推大小为 2g Xmx2g 堆最大内存为 2g XX NewRatio 4 设置年轻的和老年代的内存比例为 1 4 XX SurvivorRatio 8 设置新生代 Eden
  • python找不到对象报错代码,python2.7源码安装方式

    安装python2 7 下载Python 2 7 下载地址 解压安装 tar xzvf Python 2 7 15 tgz cd Python 2 7 15 configure prefix opt local python enable
  • Ubuntu下安装MySQL 以及C++连接MySQL

    一 简单分享Ubuntu 16 04下安装MySQL的过程 首先执行下面三条命令 sudo apt get install mysql server 此步骤可以省略 已经启用docker mysql服务容器 sudo apt get isn
  • ctf.show刷题记录_web(1-10)

    ctf平台 ctfshow https ctf show 1 签到 解题 base64解码 ctfshow 0da357d0 359b 47e1 80dc 5c02212725e5 2 web2 解题 正常页面 输入用户名admin 密码a
  • koin框架预研文档

    背景 koin框架简介 Koin框架 适用于使用Kotlin开发 是一款轻量级的依赖注入框架 无代理 无代码生成 无反射 相对于dagger 而言更加适合Kotlin语 引入目的 目前app比较常用的是dagger框架 dagger框架属于
  • echarts显示纵坐标轴上的箭头

    问题描述 提示 这里描述具体问题 在使用echarts时默认纵坐标是不显示的 所以你在怎么设置样式也不会显示出来 需要手动在代码里面写出来 yAxis name type value axisLine show true 这个是需要主动添加
  • java实现插入排序+代码推导

    图解 代码推导 package data structure import java util Arrays public class insertSort public static void main String args int a
  • 使用Eclipse IDE for GNU ARM搭建STM32的开发环境

    01 下载必要的文件 1 1 安装java运行环境 这一步比较简单 就不细说了 1 2 需要下载四个文件gnumcueclipse gcc arm none eabi xpack windows build tools jlink gnum
  • VS2017无法登录:我们无法刷新此账户的凭证、我们无法添加此账户发送请求时出错、评估期已结束,请登录以解除产品锁定

    之前下了vs但是开的有点慢习惯用codeblocks了 之后因为vs有快速生成类getset函数的快捷键就跑回来用 这个时候vs提示我 评估期已结束 请登录以解除产品锁定 问题描述 vs2017许可证到期 如何评估 解决方法 登录更新许可证
  • IRI-2016 Matlab 使用教程

    IRI2016在线计算模型 https ccmc gsfc nasa gov modelweb models iri2016 vitmo php 同时IRI2016还有Matlab和Fortran版本 其中的Matlab也是通过在线的接口进
  • 直流电机PID调节——P

    其实要用PID调节的话 最好是使用带有编码器的比较高端一点的直流减速电机 但是因为它价格有点贵 所以我们一般做智能小车就会选用普通的直流电机 但是普通的直流电机也是可以使用PID调节的 虽然它的效果没有带编码器得到直流减速电机的好 但是我们