精华内容
下载资源
问答
  • 该资源可用于基于STM32的四轮小车,前轮由舵机控制,后轮由双电机控制,可适用于恩智浦汽车比赛,写有PID算法,可根据自身环境调节训练。
  • 串级PID_平衡小车调节历程

    千次阅读 2020-08-18 15:54:54
    一开始只用单环的时候,我发现结果总是与我事与愿违,因为我希望用小车车身角度(roll)作为反馈作用于PID算法,输出值经过处理映射到PWM值上来作为电机的驱动。这个环导致的结果是,角度到达期望值时角速度还是存在...

    一开始只用单环的时候,我发现结果总是与我事与愿违,因为我希望用小车车身角度(roll)作为反馈作用于PID算法,输出值经过处理映射到PWM值上来作为电机的驱动。这个环导致的结果是,角度到达期望值时角速度还是存在的,这时参数十分难调,小车会在期望位置上左右摇摆。
    在读完这篇文章后
    :飞控算法中双环串级PID如何理解? - zinghd的回答 - 知乎https://www.zhihu.com/question/293450508/answer/1173064155

    我才懂得:

    你的期望值是什么其实完全取决于你的反馈值,如果不表明反馈值,那期望值就是一个数字,或者一条曲线而已。
    这个系统已经不像我之前调滚球系统时控制舵机角度那么简单了,舵机不会有过冲,到达位置时就停下,没有速度,在这里用单环控制 我会以一个无所谓的加速度,和速度,到达我的期望位置
    我所能控制的是小车的电机的速度,反馈的是车身角度,我知道改变电机的速度可以改变车身角度 这其中有关系:在车身角度不为0时需要PID去控制减小角度误差,角度达标时要把速度变为0 所以我的PID控制角度是间接的 并且要符合前面的要求

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 平衡小车arduino代码 ,用pid调节
  • 在循迹小车调节PID参数的一种思路

    千次阅读 多人点赞 2020-12-27 17:31:40
    小车通过6个灰度传感器实现循迹,当中间的2个灯在黑线上时,则认为小车此时正在黑线上,不需要调整小车轮速继续按此速度前进. 当小车中间两个灯不在黑线上时,则认为小车不在黑线上,需要调整小车轮。例如此时右侧的...

    一、背景

    江苏省大学生机器人大赛“密室夺宝”项目。

    1.比赛规则

    a.警方需要找到宝藏并上交给国家,如果宝藏先被歹徒拿到,则警方需要在剩余的比赛时间内(一局比赛为三分钟时间)抓捕到歹徒。
    b.歹徒需要在警方到达宝藏处之前将宝藏带走并在剩余比赛时间内不被警方抓捕。

    2.比赛地图

    比赛地图

    二、任务分析

    小车通过6个灰度传感器实现循迹,从左至右的灯编号依次为2~6号。即如果此时至右2号灯在黑线上,则小车会以最大的调整速度来进行左转,直到2号灯离开黑线。小车展示

    6个灯相较于只用两个灯,虽然PID循迹的稳定度会增加,但是也带了了一些其他的问题,比如下面的一个:
    第一种情况
    另一种情况

    虽然两个偏离的情况并不相同,但是他们的返回值确实一样的!两者返回值均为01100.
    此外,还有一些其他的问题,譬如六个灯总共会有64种返回值,但是如果把每种情况单独进行返回显然是不利于后期调试的。并且每次都需要进行64次判断,甚至可能会对系统的实时性产生影响。基于此,我们设计了如下的算法。该算法采用13种典型的返回值,其他情况均调用最近一次的有效误差。

    int getA(int speed)
    //正面,输入参数为左右轮平均速度,计算误差并返回小车偏离方向。返回值为0:正常;为-1:偏左;为1:偏右。
    {
    	analogRead_To_test();
    	if( speed < speed_LOW_left + 10 )
    	{
    		if(value4 < value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在45
    			error = 0;
    			return 0;
    		}
    		//偏右
    		else if(value4 < value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在4
    			error = 1;//0.68
    			return 1;
    		}
    		else if(value4 < value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在34
    			error = 1.5;//0.77
    			return 1;
    		}
    		else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在3
    			error = 1.9;//0.81
    			return 1;
    		}
    		else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在23
    			error = 2.2;//0.85
    			return 1;
    		}
    		else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在2
    			error = 2.4;//o.90
    			return 1;
    		}
    		else if(value4 < value4_yuzhi && value5 > value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在234
    			error = 1.5;
    			return 1;
    		}
    
    		
    		
    		//偏左
    		else if(value4 > value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在5
    			error = -1;//0.46
    			return -1;
    		}
    		else if(value4 > value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在56
    			error = -1.5;//0.47
    			return -1;
    		}
    		else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在6
    			error = -1.9;//0.51
    			return -1;
    		}
    		else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi)
    		{//黑线在67
    			error = -2.2;//0.53
    			return -1;
    		}
    		else if(value4 > value4_yuzhi && value5 > value5_yuzhi && value3 > value3_yuzhi && value6 > value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi)
    		{//黑线在7
    			error = -2.4;
    			return -1;
    		}
    		else if(value4 > value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi)
    		{//黑线在567
    			error = -1.5;
    			return -1;
    		}
    		//其他
    		else if(value4 < value4_yuzhi && value5 < value5_yuzhi && value3 > value3_yuzhi && value6 < value6_yuzhi && value2 > value2_yuzhi && value7 < value7_yuzhi)
    		{//黑线在4567
    			return 2;
    		}
    		else if(value4 < value4_yuzhi && value5 < value5_yuzhi && value3 < value3_yuzhi && value6 > value6_yuzhi && value2 < value2_yuzhi && value7 > value7_yuzhi)
    		{//黑线在2345
    			return 2;
    		}
    		else
    		{
    			return 2;
    		}
    	}
    	//其他速度不列举,除13种典型值之外调用上一次有效误差的函数不列出。
    	//也不包括PID算法。
    }
    

    首先给出在实验中我们发现的一套较好的三个参数:

    const float Kp_MID=11;
    const float Ki_MID=0.12;
    const float Kd_MID=50;
    

    这套参数的寻找花了我们三个星期,寻找过程十分痛苦,因此为了找到这三个参数的实际意义,加快以后PID的调试工作,接下来对这三个参数进行详细分析。之前查阅文献了解到,三者的比例大概在100:1:10。但如上,Kp与Ki之间符合了资料上的比例,但是Kd却出现了很大的偏差。为了探究快速找到Kd的方法,对小车运行轨迹建立数学模型。

    四、探究Kd的数量级

    1、列出所需数据

    已知比赛地图的黑线宽度为25mm,一个循迹灯的宽度大概是4mm,在测试中,当半个循迹灯压在黑线上的时候,读数便已经有了跃变,因此可以把循迹灯的有效宽度设置为2mm。由实验得到的error返回值,只考虑Kp的影响,我们计算出了各种情况下左右轮速之比,以偏左为例:

    在黑线上的灯号右轮速度pwm左轮速度pwm左右轮速之比基于4、5号灯时的左右轮速之比
    4、5(车身为正)90901:11:1
    584.595.51:1.130.94:1.06
    5、6791011:1.280.88:1.12
    673.5106.51:1.450.82:1.18
    6、7681121:1.650.76:1.25
    762.5117.51:1.880.69:1.31

    列出所有计算需要的数据:黑线宽度为25mm,有效灰度灯宽度为2mm,灰度灯宽度为4mm,灰度板长度为160mm,有效灰度灯距离5 : 5.5 : 6 : 6.5 : 7 之比为7.5 : 16.5 : 25.5 : 36 : 46.5,左右轮距离为160mm,小车在4、5号灯直行的速度为500mm/s。

    2、计算过程

    不妨假设起始时7号灯在左侧黑线,车身为正,如下图所示:
    只有7号灯在黑线上
    根据上面的数据,此时小车应当以左轮117.5,右轮62.5的pwm值向右作圆周运动,直到7号灯出黑线。故7号灯在黑线上的轨迹应当是一段弧。
    理论运动轨迹
    这里认为运动时在车宽的方向的速度线性递增,由左右轮距为160mm,得出从右至左的质点速度的pwm值为如下表达式,其中为灯与右轮的距离:
    公式
    代入7号灯距离得77.2,得该圆周运动的线速度为直行时的77.2/90=86%,即速度为429mm/s。经计算得如下图的数据(计算过程略):
    经计算的结果
    由图得,7号灯在起始方向为竖直时,可以将最大为28度的偏移角度转正,且调整时间(走完黑线上的圆弧所用的总时间)为239ms。
    同理可得,6、7号灯可以将最大为24度的偏移角度转正,且调整时间为285ms;
    6号灯可以将最大为20度的偏移角度转正,且调整时间为304ms;
    5、6号灯可以将最大为16度的偏移角度转正,且调整时间为367ms;
    5号灯可以将最大为11.5度的偏移角度转正,且调整时间为501ms。

    3、补充

    在这里需要指出的是,5号灯与5、6号灯进行调整时调整时间非常之大,与实际情况并不相符。这是可以理解的。因为在在进行微小误差调整时,还会有Ki进行加速,而在上述建模中只考虑了Kp,故计算出来的调整时间会偏大,因此,我们不妨假设所有情况下的调整时间均为300ms,这将在确定Kd的数量级时减少大量的计算。

    4、估算Kd的数量级

    在实际测试的过程中,小车在只有7号灯在黑线上的起始位置的情况下,调整距离通常是2格,一格的长度近似为300mm,则小车两格共调整了1200ms。此外,经过统计,1200ms的调整时间内,小车总共经历了启动、调整(7->5)、过调(5->3)、回正(3->4)、过调(4->5.5)、回正(5.5->5)、过调(5->4.5)、回正(4.5->4)的振荡过程,之后振荡消失,小车处于稳定态。可能这套PID并不是一套最佳的参数,因为我们在算法设计时给它的要求是任何偏差都需要在一格以内调整完毕。但由于在实际行走的过程中,我们会在转弯后起步起步之前以及转弯前都给小车进行半格的减速,以增加循迹的稳定性,这套PID足以胜任,我们就没有再对参数进行改动。
    从振荡过程我们可以看到,第一次调整(7->5)总共经历了7->6.5,6.5->6,6->5.5,5.5->5的过程,也就是Kd总共生效了四次。在建模中没有考虑Kd,故按照建模的初始条件与计算结果,在从七号灯到五号灯的过程中,车身角度应该至多偏移了28+24+20+16+12=110度。考虑到除起始位置为正,其他情况的起始位置车身均有偏移。适当减少偏移角度,最终偏移角度以28+20+12+4+1=65度为宜。计算出总共调整时间为285+304+367+501=1457ms,实际情况应该比理论值短,取1200ms,则想要在1200ms的运动时间,最终理论偏移角度为65度,Kd生效4次的情况下尽可能地减小最终实际偏移角度,下面开始估算:
    由于单位调整时间在实验中设置为40ms,也即1200ms的调整时间中Kd生效的时间为160ms。这意味着Kd需要在160ms内实现转65的大角,因此可以预见到,Kd将会是一个非常大的数值,甚至超过了Kp,因为Kp转同样的角度耗时1200ms。因此:
    Kd

    5、误差分析

    为什么理论值是80而非实验中的50呢?我分析认为可能有以下几个原因:

    1、从实验得出的50用了三次达到稳态,而我们的建模条件是一次达到稳态;
    2、建模过程采用了平均的方法。譬如七号灯转角28度为最大,但调节时间最短,5号灯调节角度最小且时间最大,因此宏观上的理论Kd不能保证单次调节是最完美的,并且由于Kd太大反而会增加系统的振荡,实际值需要比理论值适当地小一点。
    3、对计算结果进行近似时出现了误差,可以不用估算法,用真正的上一次出现角作为下一次调节的入线角度等等。但该做法会增加极大的计算量,在工程中不容易实现。

    因此,上述论述从理论上否决了Kp:Ki:Kd=100:1:10这个参考比例。也从中看出,一套系统设计完成之后,PID的参数没有绝对意义上的参考,具体的比例必须按照实际情况自己加以分析。

    五、结论

    PID调试是一个十分繁琐的工作,调试过程中我们遇到了各种问题,包括电机板控制不稳定、循迹板返回值出现问题等等,但最终都被克服,并在比赛之中取得亚军。这也算是对得起这一个月的努力与近半年的知识积累吧。在调试过程中,我们经历了从无到不断接近理论值的过程。但是在比赛期间,我并没有静下心来去对三个参数的理论值进行估算,而是仅仅通过实验过程得到。这是我应该要反思的地方。此外,由于建模能够大致符合所有基于登的PID循迹,因此在这里可以给出此情况下的通比KP:Ki:Kd=1:0.01:5。
    获奖证书

    六、补充

    由于这是我的一个课程的期末论文,只是稍微修改了一下就发了上来,如果有问题还请多多包涵!

    代码与实际视频等过几天有空我找找上传。

    展开全文
  • MSP430 四驱PID速度调节 蓝牙小车代码程序 通过PID算法,PWM控制可以任意准确调节小车速度,匀速运动,自动调节,直线行走
  • /**函数功能:5ms控制函数 核心代码 作者:平衡小车之家/ void control() { sei();//全局中断开启 Velocity=Velocity_Left*120; //单位时间内读取位置信息 Serial. println("Velocity"); Serial. println(Velocity)...
  • PID-小车类-PID算法控制小车直线行驶(制作步骤+程序+PID库).zip 里面包括了详细的制作步骤以及程序+PID
  • PID控速小车

    2019-04-30 17:17:39
    通过按键改变预设置速度,小车可以通过PID方式从当前速度改到设置速度,使用定时器测试光电编码器速度,使用LCD显示速度值。
  • 教你10分钟完成智能小车PID调速

    万次阅读 多人点赞 2020-03-19 20:17:24
    教你10分钟完成智能小车PID调速 简介 这是我在CSDN上面的第一篇博客,来分享一下我是如何用最短的时间进行智能小车PID调速的。在疫情期间比较无聊,在某宝买了一个智能小车底盘和一堆零件,基于Arduino Due和...

    简介

    这是我在CSDN上面的第一篇博客,来分享一下我是如何用最短的时间进行智能小车的PID调速的。在疫情期间比较无聊,在某宝买了一个智能小车底盘和一堆零件,基于Arduino Due和树莓派进行开发,Due负责底层控制,树莓派进行上层控制器开发,比如斯坦利控制器或者模型预测控制器进行轨迹跟踪。
    本次采用Simulink工具链完成,小车的所有代码均基于Simulink Target Support Package完成。
    在这里插入图片描述

    所需要的硬件&软件

    1.普通带编码器的直流电机。
    2.Arduino Due控制板及数据线(类似dSPACE MAB进行RCP开发,但是性能完全没有可比性,开个玩笑)。
    3.Matlab&Simulink R2019b (民间通用版本即可)。
    4.电脑一台。

    前期准备工作

    (1)安装Arduino硬件支持包

    这并不是本文的重点,网上有许多这方面的教程,包括MATLAB录制的研讨会均有类似的视频教程。有意的同学可以自行查阅相关资料,十分简单。如下类似教程。
    https://blog.csdn.net/u013732401/article/details/70161200

    (2)Simulink模型

    新建Simulink Model,并且打开Library Browser。找到Simulink Supprot Package for Arduino Hardware
    在这里插入图片描述
    按照下图搭建模型。其中Tachometer模块在硬件支持包中的Sensor模块里(2019b有,低版本2018a并没有,需要自己通过编码器脉冲的上升沿或者下降沿捕获进行),具体通过高低电平进行捕获的模型在硬件支持包中的DrivePID例程中的Encoder子模块中有搭建。
    在这里插入图片描述
    可以看到,Tachometer输出量并不是help中讲的RPM,而是脉冲/每分钟。Tachometer模块中设置的即是编码器的单个信号线连接的PIN口(这里用一根信号线就无法测量方向了,请注意编码器信号线是5V电压,本次使用的单片机IO最高容忍3.3V,需要初中知识进行分压电路的搭建,如果使用其他芯片,请查询数据手册该IO口的最高容忍电压),采样时间设置0.05即可。由于我智能小车轮子转一圈采集390个脉冲,轮子直径64毫米。所以简单计算即可得到轮速转一圈行驶的距离,单位m/s。后面经过了一个一阶低通滤波器,这个在网上可以找到关于一阶低通滤波的公式,然后进行搭建,这里就不是赘述了。
    接下来进行驱动模块的搭建,关于L298N驱动模块的使用,这里我使用一路电机进行调试,29和27PIN脚设置成高电平和低电平,PIN2设置为ENA。在Arduino 支持包中,PWM模块输入值0-255对应0-100%占空比,PWM频率在Due中驱动模块固定1KHz。
    在这里插入图片描述
    Step阶跃信号目的在于仿真时间2s时进行阶跃输入,占空比改变至100,我们需要做的就是进行数据记录,记录本次仿真的时间,输入和输出。如何记录呢,那么我们需要在相应的信号线上右键,选择Log Selected Signals。我们需要对Step输出线,低通滤波后的速度进行Datalog。最后设置Arduino外部仿真调试环境。
    采样时间设置硬件设备设置
    在Set COM port端口中可以手动输入您的硬件串口号如果在上传程序失败的时候。接下来进行在线调试,类似keil软件中的debug模式。在2019b以下版本的同学点击仿真按钮旁边的下拉菜单选择External模式即可。我在使用2018a版本无法进行数据datalog,可以通过串口进行数据传输,具体请查阅相关资料。
    在这里插入图片描述
    点击按钮开始离线仿真,模型会编译成代码刷写进硬件。前期准备工作完成,相信无论用基于模型设计的方式还是手动写代码的方式,完成以上工作都不会难。接下来就进入本次教程的正题。

    正题

    数据导出到Workspace

    如图所示,点击Data Inspector
    在这里插入图片描述
    在这里插入图片描述
    分别将左侧数据拖入进对应的框图即可查看数据记录效果,如果您已经有小车并且已经进行开环PWM测速,您需要关注以下的每一步。只要您有相应的PWM和速度值都可以使用以下方法进行PID调速,不仅限于使用Aruduino类似的快速原型开发。如图所示,右键数据,进行导出,导出至Workspace即可。
    在这里插入图片描述
    在这里插入图片描述
    同样的方式将两组数据全部导出,分别是PWM和Speed。
    返回Matlab主界面,您会看在工作空间看到如下图所示。
    在这里插入图片描述
    使用代码即可将数据解析出来,如下图所示。
    在这里插入图片描述
    再看工作空间内容,即可得到我们熟悉的数据类型。

    系统辨识

    我们通过输入和输出基于Matlab的System Identification工具箱即可辨识出小车驱动的传递函数,从而进行PID整定。具体方法如下。打开系统辨识工具箱。
    在这里插入图片描述
    将时域数据导入。
    在这里插入图片描述
    在这里插入图片描述
    导入后,点击导入后的曲线,然后点击Time Plot即可查看曲线。
    在这里插入图片描述
    然后如图选择系统估计的模式。
    在这里插入图片描述
    您可以根据您的需要选择辨识的传递函数结构,这里我选择二阶振荡模型
    在这里插入图片描述
    然后点击Estimate,稍等片刻,可以在工具箱主界面查看我们的辨识结果,高亮辨识后的曲线,点击Model Output,即可查看辨识曲线。我辨识出来后的重合度达到98.2。效果还是可观的。
    在这里插入图片描述
    这一步的最后,右键上面的辨识曲线,即出现需要的传递函数参数了。
    在这里插入图片描述

    离线仿真

    得到系统的传递函数,那当然是十分愉悦的事情,在学习控制理论的时候总是先给出系统模型,但是在实际项目中模型是需要辨识的,这就是课本和实际的差距。我们得到参数后即可在Simulink环境进行仿真环境的搭建了,将上图的参数输入至Transfer Fcn模块中。在进行仿真前,因为进行的是连续系统仿真,所以将仿真时间改成变步长。看一下仿真效果和实际输出基本一致。
    在这里插入图片描述
    因为需要PID控制,那么我们可以添加PID控制器模块进行模型的搭建,搭建完如下图所示。简单仿真一下,没有更改PID模块的任何参数,所以结果很差。
    在这里插入图片描述
    这时我们需要打开PID模块,点击Tune按钮,请求Matlab帮助我们进行自整定!随后自动打开PID Tune的App。
    在这里插入图片描述
    似乎已经帮您完成了整定功能,您只需要调整Robust to Aggressive横条去看系统的响应,选择您喜欢的位置,然后点击Updata Block参数会更新至您的控制器。
    在这里插入图片描述
    在这里插入图片描述此时您发下PID模块的参数已经被更改了,那么调整模型,在Step模块设置您期望速度,例如我需要小车行驶速度为1m/s。点击仿真看看效果。在这里插入图片描述

    控制器离散化

    是不是借助Maltab/Simulink环境很简单就完成了PID的整定了,有同学会问,这有啥用,我需要跑进板子里啊,别急,我们现在研究的是S域,计算机控制器是离散系统,我们需要把控制器从S域转换到Z域去。步骤如下图所示。
    2019b用户如下图找到该App,2019b之前的用户在Analysis->Control Design->Model Disretizer找到即可。在这里插入图片描述
    您可以选择0阶保持或者1阶保持进行离散化,采样时间我个人设置0.05s。然后点击s->z按钮,最后Store Setting

    在这里插入图片描述
    在这里插入图片描述
    回到模型,您可以看见算法和模型都从S域变成Z域了。在Solver中将采样时间改成定步长,采样时间设置成0.05,再次进行仿真。很不幸模型输出已经振荡!这时您需要重复上述步骤再次在PID tune中进行整定。这里我就不重复步骤,直接给整定后的仿真效果。
    在这里插入图片描述
    这是最后自整定的PID参数。
    在这里插入图片描述

    实车效果

    仿真效果可以接受,这个时候我们就完成了PID离散控制器的设计了,接下来就需要刷写到板子里。重新改变模型如下图所示。替换传递函数模型,也可以进行对比。将实车速度替换掉传递函数的反馈值。点击外部模式仿真,看一下实车效果如何。
    在这里插入图片描述
    经过模型自动生成代码刷写到控制器后,实车测试和仿真结果图有如下对比,在超调量上有些区别,但是实际控制器中超调更小。最后都趋于平稳。蓝色是仿真结果,紫色是实际控制器效果
    在这里插入图片描述

    总结

    仿真可以节省我们太多时间,如果您使用STM32,S12K进行手工代码开发,可以通过串口进行数据采集导入Excel,然后导入到Matlab进行模型的系统辨识,将PID控制器生成原子子系统,进行编写数据字典,管理输入输出信号和参数(非常重要),再使用Embedded Coder生成代码,在中断服务函数中调用生成的代码函数,基于模型设计的方法可以加快控制器的开发。这是一次在贵平台分享软件开发的经验。如果有问题可以联系我的qq:664157262,一起进步!

    展开全文
  • 平衡小车PID理解

    千次阅读 多人点赞 2018-08-13 13:19:32
     先来解释一下让平衡小车的原理,设置机械中值为0,平衡小车在不平衡时有偏离机械中值的倾角,为了平衡这个倾角必须让小车向那边赶。如何让小车向有倾角那边赶呢?...这时可以用PID控制了。 ...

     

           先来解释一下让平衡小车的原理,设置机械中值为0,平衡小车在不平衡时有偏离机械中值的倾角,为了平衡这个倾角必须让小车向那边赶。如何让小车向有倾角那边赶呢?这个时候就需要输出一个准确的PWM!这个准确的PWM应该是多少呢?如果能通过数学模型计算出来也是可以的,但是小车在实际跑的过程中会遇到各种外界因数,即使数学模型能计算出来,但也达到不到实际工程中的误差。这时可以用PID控制了。

          何为PID?官方点来说也就是:比列、积分、微分。为什么要用?当然有它的好处,当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时注意这里是精确,如果要达到精确必须考虑外界的各种影响因素,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术就特别方便了。在实际工程中,我们可以根据小车的具体情况对小车的PID参数进行调节,这样就可以使小车的平衡达到极致。

           P:即比列,一般是P、I、D中最大的,在平衡小车直立环中,我们是将Kp与角度相乘的,Kp越大,我们能更快的到达我们想要的PWM附近(也就是所谓的"增大比例系数一般会加快系统响应,Kp越大,调节作用越激进,Kp调小会让调节作用更保守),所以一般达不到准确的PWM值。比如小车的倾角为0时,用Kp与角度相乘得到的PWM并不能使小车平衡,小车会不断抖动,因为小车存在转动惯量,计算的PWM会和目标PWM存在一定的稳态误差(静差)。转动惯量是客观存在的,无法使它等于0;我们需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用,这里便用到微分D了,角度的变化速度是什么,角加速度。D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。一般用了P、D小车就可以稳住了,那么I又是拿来干嘛的呢?前面我说了小车平衡的原理,即小车往哪边倒,小车就往哪边赶。这个时候可能就会出现小车往一边倒,速度越来越快,我们需要将小车平衡倾角后的速度控制在0,那么我们就要用倒I了。设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。

          可能我解释得不是很好,我只是将自己的理解写出来给大家参考,这里有篇大佬写的博客对大家可能会有更多的帮助http://www.dfrobot.com.cn/community/thread-14783-1-1.html

    展开全文
  • 处理过程:采集MPU6050相关参数->结合一些算法对采集到的参数进行滤波->对参数结合PID算法运算->将具体数据发送给双轮电机执行->编码器闭环控制反馈 LOOP 主控芯片 stm32F1C8T6 最小系统板,最好有个串口芯片,方便...
  • 基于stm32四轮小车简易PID控制

    千次阅读 多人点赞 2021-03-31 20:19:23
    看前需知:作者本人使用的是四个普通的TT电机加编码器+增量式PID,适合PID初学者,但是需要对PID和增量式PID有一定的认知,本篇未有详细介绍,以代码应用为主,大佬勿喷。 文章目录一、粗谈PID?二、使用的硬件设备...
  • 如何调节PID参数

    2018-05-28 13:48:24
    深入浅出理解pid参数的文档,并且附有整流器pi参数设计的文献举例,完成pid参数的设计
  • 基于PID调节的两轮自平衡小车的循迹控制

    万次阅读 多人点赞 2014-11-23 19:10:20
    基于PID调节的两轮自平衡小车的循迹控制   硬件电路篇 小车主控芯片使用飞思卡尔公司产的K60。 电源模块 车体电路使用两种电压,分别为3.3v和5v供电。车体使用7.2V的锂电池供电,为提供电路所需电压,设计了...
  • 树莓派SLAM小车操作指南张子豪 同济大学2018级交通运输工程学院 研究生[TOC]源代码源代码都在树莓派操作系统中python源代码:/home/rikirobot/catkin_ws/src/clbrobot_project/clbrobot/scriptC语言源代码/home/...
  • 1、ssh连接机器人 sudo ssh huike@192.168.12.1 2、挂载 huike: sudo /etc/init.d/nfs-kernel-...3、启动小车 roslaunch huanyu_robot_start Huanyu_robot_start.launch 4、启动手柄 roslaunch huanyu_joy huan
  • 这个c8t6小车是我参加学校电赛的时候做的,目前具有红外寻迹,oled实时显示时间,蓝牙通信,在手机端上显示小车运动时间,还有加入了mpu6050模块和pid算法,实现了小车在跷跷板上的平衡。小车的照片和原理图都放在...
  • PID 调节

    2021-08-30 08:28:19
    刚开始对小车的速度控制采用位置式PID控制算法,即常用的PID控制算法。但是位置式PID算法使用过去误差的累加值,容易产生较大的累计误差。而且由于小车的目标速度时刻在变化,err值需要不断的累加,可能出现err_sum...
  • pid实现小车巡线绕桩

    2021-06-29 17:22:05
    【树莓派小车绕桩实验报告】 ...PID调节是一种闭环控制的方式,基于反馈调节实现(示意图见下)。在本实验中,使用PID控制的方式,是输⼊偏差量(速度),计算出调整量(占空⽐),实现对速度的控制。在编程实现时,
  • # Arduino小车PID调速——整定参数初试水

    万次阅读 多人点赞 2017-07-15 01:22:37
    Arduino小车PID调速——整定参数初试水 在实现了小车较为可靠的测速基础上,便可以正式开展PID调速实验了。本文是基于使用Arduino平台上由Brett Beauregard大神写的PID库进行参数整定的,侧重于在对PID算法有基本...
  • Arduino小车PID自整定调速——菜鸟也来写PID自整定库

    万次阅读 多人点赞 2017-08-04 12:00:18
    前言说到PID整定这个问题,它常常是控制领域一...对于有经验的工程师,他们可以通过分析输出波形的变化得出参数调整的正确方向,但作为初学者的我们既缺乏PID调节的经验,又想尽快实现PID调节的目标,这时候便可以采用
  • 包含很多模糊控制的文档,介绍了模糊控制基本原理与实现步骤以及在智能小车中的应用,可用模糊控制调节PID参数
  • 以AT89C52单片机作为控制器的核心,采用PID速度控制算法,设计了一辆简易的智能避障及自主寻迹识别的小车,能 够实现小车沿着黑色引导线进行直线行驶和不同曲率的弯道自动行驶的功能。通过小车的红外检测,感知黑色...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 788
精华内容 315
关键字:

小车调节pid