精华内容
下载资源
问答
  • 增量式pid调节

    2017-05-09 22:14:46
    pid学习
  • PID调参过程详解(包括增量式和位移式)

    万次阅读 多人点赞 2017-07-30 16:03:57
    位置式PID调参步骤: 预设目标值是11000 1.首先,我们进行PID参数整定的时候,先设I D为0,然后把P值从0逐渐增大,直到系统震荡.如下图(P值设的500,这是因为P值过大,出现了震荡.这时我们就需要调整P值大小,让...

    位置闭环控制就是根据编码器的脉冲累加测量电机的位置信息,并与目标预设值做比较,得到控制偏差,然后通过对偏差的P比例,I积分,D微分进行控制,使偏差趋于零的过程

    位置式PID调参步骤:

    预设目标值是11000

    1.首先,我们进行PID参数整定的时候,先设I D为0,然后把P值从0逐渐增大,直到系统震荡.如下图(P值设的500,这是因为P值过大,出现了震荡.这时我们就需要调整P值大小,让曲线出现静态,而静态一般实在P值较小而且I值为0情况下才出现,如第二个图,我将P设置为50即)

    ps:(我使用的是串口打印出实际值和预测值,然后word打印的表格 未使用串口波形助手,也可百度收缩串口波形助手 原理一样 这里注重调参过程)

     

     

     

    由上图可以看出,我们提高了P的值一定程度上消除了静差,提高了响应速度,但是会导致系统震荡,故我们加入微分D可以有效抑制震荡.

    故我们加入KD试试效果

     

     

     

    可以确定KD的值即为500了,然后我们就调整KPKI,调试电机,一般KI的值都很小或者根本不需要.

    调试KP,一般应该把P给小一点,然后KD应该尽可能大点,I值一般都是0.

     

     

    总结:一开始先加大比例Pp小了会达不到目标速度,会差很多,所以再加大p,知道电机出现嗒嗒嗒的抖动或者观察上位机的波形剧烈抖动的时候,这时候p就过大了,实际上p可以不是很大,比如400,调试时候增加幅值可以设为20I稍微来点就可以,平衡车的工程经验是ki=kp/200,但是这里我给的是0.2,还要看具体情况,积分参数过大,实际速度和目标速度的静差会很大。

     

    电机速度闭环控制使用增量式PI调参  和上面的方法一样的,只是步骤稍微有点不一样

    增量式pid调节目标速度时候参数整定:

    先加大KI,这时候会越来越接近实际速度,当KI过大的时候,在切换目标速度的时候,就会抖动,这时候就是KI大了响应速度高了,但导致超调量增加,这时候就加大增量式的KP,来缓减抖动,减小超调量。

    展开全文
  • 飞思卡尔智能车增量式pid调节方法,如何更有效的调节pid参数,使小车稳定运行。
  • STM32cubeMX--增量式PID调节电机速度(霍尔编码器)

    千次阅读 多人点赞 2021-05-08 10:32:22
    //当前PWM数值加上增量式PID计算所得 //限制PWM最大范围 if(speed>100)speed = 100; else if(speed)speed = 1; //将PID计算后的PWM写入系统 SetMotorVoltageAndDirection(speed); /* 每隔(5*100...

    前言

    趁你们不注意,我突然更!!
    在这里插入图片描述


    一、直流减速电机与霍尔编码器

    1.1、编码器介绍与选择

    是一种可以测量目标机械运动或者目标位置的传感器或装备,分为线性编码器和旋转编码器,我们这里测的是电机速度,很明显,电机是旋转的,所以是旋转编码器

    一般旋转编码器又有两种类型

    • 增量编码器:增量式旋转编码器在电机旋转时输出脉冲。 要使用增量编码器确定轴
      位置, 您必须知道起始位置并使用外部电路来计算输出脉冲数。
    • 绝对编码器:绝对旋转编码器输出对应于旋转角度的数字代码。 无需计算脉冲了解电
      机轴的位置。 您只需要读取编码器的数字输出。

    我来翻译一下,增量编码器就是通过是输出脉冲让后让单片机计数脉冲数来算速度,绝对编码器就是直接输出角度变化的数字量。

    打开淘宝搜,很明显,增量编码器占一大半儿,所以我们用增量编码器

    增量编码器还可以分:

    • 光电:我来翻译一下这张图的意思,LED灯光穿过这个码盘的孔后就会输出一个脉冲,让后单片机计数脉冲就行了,不同的码盘通常转一圈发送的脉冲数也不一样,一般是300-500个脉冲。在这里插入图片描述

    • 霍尔:由霍尔开关集成传感器和磁性转盘组成, 霍尔式转速传感器结构如下图所示。 将磁性转盘的输入轴与被测转轴相连, 当被测转轴转动时, 磁性转盘便随之转动, 固定在磁性转盘附近的霍尔开关集成传感器便可在每一个小磁铁通过时产生一个相应的脉冲, 检测出单位时间的脉冲数,便可知道被测对象的转速。一般霍尔编码器的精度比较低。 在这里插入图片描述

    1.2、编码器参数

    根据题目可知,我买的是直流减速电机和霍尔编码器。
    如图在这里插入图片描述

    参数表:在这里插入图片描述
    红色是我买的型号,蓝色是很重要的参数。

    翻译:

    • 电压控制好,这玩意儿挺贵的,别给烧了昂。
    • 磁环式就是霍尔磁环式。
    • 精度就是每圈可以发送的脉冲数。
    • 霍尔

    1.3、编码器测速原理

    编码器使用的是“正交”这一原理将信号(光束)分为两个平行的,称为A和B。且他们通过编码器盘时相差90°。
    偏移后会出现这种情况
    在这里插入图片描述

    1.3.1、方向判断

    鲁迅说过:运动是相对的。
    我们知道了A和B的输出相差90°,所以我们只要检测两个脉冲信号的相对位置就能检测出其方向

    1.3.2、速度获取

    首先知道精度CPR
    在一个规定时间 t 内单片机获取脉冲总数 Num 。
    F是一个周期测量的脉冲数,由图一个周期四个脉冲,对于32来讲,F一般是4或者2。
    在这里插入图片描述

    速度v 就相当于

    v = (Num/(CPR*F))/t

    因为时直流减速电机,所以还得除以减速比,但是这里就先不除了。我的电机减速比为1:10。
    所以算出的v再除以10。

    二、STM32cubeMX库配置编码器模式

    2.1、连线分析

    我所购买的编码电机的连线
    在这里插入图片描述
    我这里用的时野火的 指南者STM32F103VET6开发板。
    STM32F103的高级定时器拥有编码器功能,所以我们直接匹配高级定时器的编码器功能的引脚!
    电机驱动我们使用TB6612模块,不知道TB6612怎么用?请看这里

    所以单片机上需要设置的引脚有:
    1、高级定时器编码器模式(CH1,CH2通道)
    2、串口(调PID不要串口真的大丈夫?)
    3、通用或高级定时器的PWM输出模式
    4、两个GPIO控制电机转方向
    5、板载用来LED测试BUG
    6、基本定时器计算时间
    六色战队(不是)

    在这里插入图片描述

    2.2、cubeMX设置

    2.2.1、cubeMX初始化

    配置RCC外部晶振
    在这里插入图片描述
    改为72Mhz
    在这里插入图片描述
    仿真更改
    在这里插入图片描述

    2.2.2、高级定时器编码器模式(CH1,CH2通道)

    在这里插入图片描述
    编码器计数有三种模式
    通道CH1计数
    通道CH2计数
    通道CH1、CH2双通道计数

    编码器A相—CH1 简称CHA
    编码器B相—CH2 简称CHB

    此处需要说一点,上图种绿框部分通道x计数模式并不是如它英文Rising Edge一样的上升沿计数的意思,而是计数模式的意思,这里算是cubeMX的小问题。

    他的真实含义是相对信号的电平计数模式。
    什么是相对信号?其实就是CHA相对CHB的的电平或者CHB相对CHA的电平。
    在这里插入图片描述
    Rising Edge模式下CH1通道是遇到虚线出数值发生一次变化,左边为每次遇到虚线加一,右边为每次遇到虚线减一。即一个周期编码器计数两次。(Falling Edge模式加减相反)

    知道Rising Edge什么意思了,CHB的就略过了,可以直接看下图理解。

    TI1是CHA,TI2是CHB
    计数规则如下图:
    在这里插入图片描述
    由图,TI1是一个周期CH1通道捕获两次脉冲,TI2是一个周期CH2通道捕获两次脉冲。
    TI1和TI2就是两个同时捕获,一个周期可以捕获4次脉冲
    精度更大更爽!!!
    所以我们用TI1和TI2有效边缘检测!!!

    CH1和CH2双通道捕获计数:在这里插入图片描述
    由图一个周期捕获四次脉冲,所以我们得除4,也就是上面的公式中 F = 4

    2.2.3、串口DMA

    配置串口DMA的目的1是为接收速度数据调整速度,2是为了方便调BUG和参数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.2.4、PWM输出

    在这里插入图片描述

    频率f = TimCLK/((PSC+1)x(ARR+1))

    占空比 = (Pulse+1)/(ARR+1)

    Pulse的值可以在代码中调
    TIMx->CCRx = N;

    2.2.5、GPIO控制电机方向

    GPIO不多说,不知道的建议先学一下32。

    2.2.5、LED

    在这里插入图片描述
    配置LED

    2.2.6、基本定时器

    在这里插入图片描述
    是能基本定时器,频率为200HZ,每隔5ms进入一次中断

    在这里插入图片描述
    使能中断

    2.2.6、配置中断优先级

    在这里插入图片描述
    配置中断优先级
    TIM3为编码器捕获
    TIM7为定时器中断

    三、离散PID简介

    PID分为位置式和增量式,位置式是普通的PID,增量式可以理解为式位置式的微分形式
    由于编程系统时离散的,所以我们用离散的PID。
    也就是说
    累加代替积分
    前后相减代表微分

    3.1、位置式

    通过直接改变输出来保证被控制量(一般为控制位置)的稳定。
    大概意思就是:
    就拿无人机来说明,当无人机距离所设定高度比较远时,电机转速变大,当无人机接近所设定位置时电机速度逐渐减小。
    公式为:
    在这里插入图片描述

    3.2、增量式

    通过改变输出的增减来保证被控制量(一般为控制速度)的稳定
    其实就是:
    我们要控制电机的速度,不是通过直接改变PWM的值,而是改变每次PWM的增减来控制速度的稳定。
    公式为:
    在这里插入图片描述

    这里只对PID做简要概述,具体可以看
    PID教学

    四、代码及其讲解

    生成代码后
    我们设置三个全局变量

    int Timer = 0;			//时间
    uint8_t speed = 0;		//当前PWM
    short TargetSpeed = 10; //目标速度
    

    在主函数前初始化我们的设置

    	TIM1->CCR1 = speed;           //写入PWM
    	Motor_1(GPIO_PIN_SET);		  
    	Motor_2(GPIO_PIN_RESET);	  //给电机一个电压,让他转起来!!
    
    	/*打开PWM输出*/
    	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
    	/*打开定时器中断*/
    	HAL_TIM_Base_Start_IT((TIM_HandleTypeDef *)&htim7);
    	/*开启串口DMA接收,默认DMA为循环模式,千万不要放在循环里!!*/
    	HAL_UART_Receive_DMA(&huart1,(uint8_t*)&TargetSpeed,sizeof(TargetSpeed));
    	/*打开编码器捕获*/
    	HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);
    

    我们之前设置每5ms进入一次中断
    并在中断中进行PWM输出的的计算

    /*中断回调函数*/
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	short fSpeed;
    	short ERROR;
    	static uint8_t i = 0;
     	
     	/*判断当进入定时器7中断时*/
    	if(htim->Instance == TIM7)
    	{
    		fSpeed = GetSpeed();			//获取当前速度	
    		speed += PID_Cal(fSpeed,&ERROR);//当前PWM数值加上增量式PID计算所得
    		
    		//限制PWM最大范围
    		if(speed>100)speed = 100;
    		else if(speed<1)speed = 1;
    		
    		//将PID计算后的PWM写入系统
    		SetMotorVoltageAndDirection(speed);
    
    		/* 每隔(5*100)ms打印一次速度数据 */
    		i++;
    		if(i >= 100)
    		{
    			i = 0;
    			Led_Toggle();
    			printf("速度数据为%d\n",fSpeed);
    			printf("目标速度为%d\n",TargetSpeed);
    			printf("误差为%d\n",ERROR);
    		}
    	}
    	
    	if(htim->Instance == TIM3)
    	{
    		
    	}
    }
    

    离散PID计算与速度获取控制函数

    Contral.c
    
    #include "main.h"
    #include "dma.h"
    #include "tim.h"
    #include "usart.h"
    #include "gpio.h"
    
    #include "Contral.h"
    #include <stdio.h>
    #include <math.h>
    
    /*PID参数*/
    #define kp 0.86
    #define ki 0.012
    #define kd 0.005
    
    
    /******************************
    	功能:每5ms在定时器中执行一次,
    				获取电机速度SPEED
    	返回值:电机速度SPEED
    	形参:无
    *******************************/
    short GetSpeed()
    {
    	short SPEED = 0;
    //	static short last = 0;
    	SPEED = (short)(__HAL_TIM_GET_COUNTER(&htim3)*100)/(4*16);
    	__HAL_TIM_SET_COUNTER(&htim3,0);
    	return SPEED;
    }
    
    
    /******************************
    	功能:每5ms在定时器中执行一次,
    				计算pwm返回值
    	返回值:电机速度SPEED
    	形参:无
    *******************************/
    short PID_Cal(short Speed,short *error)
    {
    	short Error = TargetSpeed - Speed;
    	short Error_last = 0,Error_prev = 0;
    	short pwm_add=0;
    	*error = Error;
    	pwm_add = kp*(Error - Error_last) + ki*Error + kd*(Error-2.0f*Error_last+Error_prev);
    	
    	Error_prev = Error_last;	  	    // 保存上上次误差
      Error_last = Error;	              // 保存上次偏差
    	
    	
    	return pwm_add;
    }
    /******************************
    	功能:判断电机正反转,
    			并将计算所得的PWM数值
    			写入单片机中
    	返回值:无
    	形参:无
    *******************************/
    void SetMotorVoltageAndDirection(int Pwm)
    {
    	if(Pwm<0)
    	{
    		Motor_1(GPIO_PIN_RESET);
    		Motor_2(GPIO_PIN_SET);
    	}
    	else if(Pwm>0)
    	{
    		Motor_1(GPIO_PIN_SET);
    		Motor_2(GPIO_PIN_RESET);
    	}
    	Pwm = fabs(Pwm);
      TIM1->CCR1 = Pwm;
    }
    

    让后你就可以开心的调参了~~~~
    调参口诀:
    在这里插入图片描述


    后记

    陈你们不注意,突然更新!!!!
    这不给一键三连????

    老样子:
    度娘网盘:https://pan.baidu.com/s/1f7Jwmn6I8JZgZ3HuCw4MLQ
    提取码:z5a4

    展开全文
  • C语言实现PID算法:位置式PID和增量式PID

    万次阅读 多人点赞 2018-06-26 11:00:30
    大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID控制在其中起到了关键的作用。 说来惭愧,大学这门课程学的不咋滴,老师讲的课基本没听进去过。直到后面接触...

    原创者微信公众号

     

    PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛。

     

    大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID控制在其中起到了关键的作用。

     

    说来惭愧,大学这门课程学的不咋滴,老师讲的课基本没听进去过。直到后面接触竞赛,算是对PID有了很基础的一点点认识,直到现在工作实际应用的比较广泛才知道它的重要性。所以,这里特地回顾一下。

     

    Ⅰ什么是PID

    PID,即比例Proportion、积分Integral和微分Derivative三个单词的缩写。

     

    闭环自动控制技术是基于反馈的概念以减少不确定性,在闭环自动控制原理中,我们把它叫做“PID控制器”,拿控制电机来说,参考下面模型:

     

    下面引用一段网上经典的话:

    在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。

     

    ⅡPID原理

    常规的模拟 PID 控制系统原理框图如下:

    该系统由模拟 PID 控制器和被控对象组成。

     

    上面框图中, r(t) 是给定值, y(t) 是系统的实际输出值,给定值与实际输出值构成控制偏差e(t) = r(t) − y(t).

     

    e(t) 作为 PID 控制的输入, u(t)作为 PID 控制器的输出和被控对象的输入。 所以模拟 PID 控制器的控制规律为:

     

    三个重要的参数

    Kp:控制器的比例系数.

    Ti:控制器的积分时间,也称积分系数.

    Td:控制器的微分时间,也称微分系数.

     

    1、P - 比例部分

    比例环节的作用是对偏差瞬间作出反应。偏差一旦产生控制器立即产生控制作用, 使控制量向减少偏差的方向变化。 控制作用的强弱取决于比例系数Kp, 比例系数Kp越大,控制作用越强, 则过渡过程越快, 控制过程的静态偏差也就越小; 但是Kp越大,也越容易产生振荡, 破坏系统的稳定性。 故而, 比例系数Kp选择必须恰当, 才能过渡时间少, 静差小而又稳定的效果。

     

    2、I  - 积分部分

    从积分部分的数学表达式可以知道, 只要存在偏差, 则它的控制作用就不断的增加; 只有在偏差e(t)=0时, 它的积分才能是一个常数,控制作用才是一个不会增加的常数。 可见,积分部分可以消除系统的偏差。

     

    积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数Ti越大,积分的积累作用越弱,这时系统在过渡时不会产生振荡; 但是增大积分常数Ti会减慢静态误差的消除过程,消除偏差所需的时间也较长, 但可以减少超调量,提高系统的稳定性。

     

    当 Ti 较小时, 则积分的作用较强,这时系统过渡时间中有可能产生振荡,不过消除偏差所需的时间较短。所以必须根据实际控制的具体要求来确定Ti 。

     

    3、D - 微分部分

    实际的控制系统除了希望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间, 不但要对偏差量做出立即响应(比例环节的作用), 而且要根据偏差的变化趋势预先给出适当的纠正。为了实现这一作用,可在 PI 控制器的基础上加入微分环节,形成 PID 控制器。

     

    微分环节的作用使阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化的越快,微分控制器的输出就越大,并能在偏差值变大之前进行修正。微分作用的引入, 将有助于减小超调量, 克服振荡, 使系统趋于稳定, 特别对髙阶系统非常有利, 它加快了系统的跟踪速度。但微分的作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分, 或在微分起作用之前先对输入信号进行滤波。

     

     

    ⅢPID算法代码

     PID 控制算法可以分为位置式 PID 和增量式 PID 控制算法。

     

    两者的区别:

    (1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;

     

    (2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

     

    (3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。

     

     

    下面给出公式直接体现的C语言源代码(请结合项目修改源代码):

    1.位置式PID

     

    typedef struct
    {
      float Kp;                       //比例系数Proportional
      float Ki;                       //积分系数Integral
      float Kd;                       //微分系数Derivative
    
      float Ek;                       //当前误差
      float Ek1;                      //前一次误差 e(k-1)
      float Ek2;                      //再前一次误差 e(k-2)
      float LocSum;                   //累计积分位置
    }PID_LocTypeDef;
    
    /************************************************
    函数名称 : PID_Loc
    功    能 : PID位置(Location)计算
    参    数 : SetValue ------ 设置值(期望值)
                ActualValue --- 实际值(反馈值)
                PID ----------- PID数据结构
    返 回 值 : PIDLoc -------- PID位置
    作    者 : strongerHuang
    *************************************************/
    float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID)
    {
      float PIDLoc;                                  //位置
    
      PID->Ek = SetValue - ActualValue;
      PID->LocSum += PID->Ek;                         //累计误差
    
      PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);
    
      PID->Ek1 = PID->Ek;  return PIDLoc;
    }

     

     

    2.增量式PID

     

     

    typedef struct
    {
      float Kp;                       //比例系数Proportional
      float Ki;                       //积分系数Integral
      float Kd;                       //微分系数Derivative
    
      float Ek;                       //当前误差
      float Ek1;                      //前一次误差 e(k-1)
      float Ek2;                      //再前一次误差 e(k-2)
    }PID_IncTypeDef;
    
    /************************************************
    函数名称 : PID_Inc
    功    能 : PID增量(Increment)计算
    参    数 : SetValue ------ 设置值(期望值)
                ActualValue --- 实际值(反馈值)
                PID ----------- PID数据结构
    返 回 值 : PIDInc -------- 本次PID增量(+/-)
    作    者 : strongerHuang
    *************************************************/
    float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID)
    {
      float PIDInc;                                  //增量
    
      PID->Ek = SetValue - ActualValue;
      PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);
    
      PID->Ek2 = PID->Ek1;
      PID->Ek1 = PID->Ek;  return PIDInc;
    }
    展开全文
  • 位置型PID增量PID调节直流电机

    千次阅读 2019-04-24 21:38:06
    位置型PID增量PID调节直流电机 一、思路: 无论是位置型还增量型的PID都是为了调节PWM波,使电机的转速达到设定值。这次实验目的主要是实现用机智云app控制电机并使电机的转速达到设定值后保持稳定。 二、实现过程:...

    位置型PID增量PID调节直流电机

    一、思路
    无论是位置型还增量型的PID都是为了调节PWM波,使电机的转速达到设定值。这次实验目的主要是实现用机智云app控制电机并使电机的转速达到设定值后保持稳定。
    二、实现过程

    1. 材料:正点原子stmf4探索板及其配套的esp8266、0~6v直流电机、L9110s芯片的驱动模块,对射光计数芯片。
    2. 接下来要实现一个闭环的,主要的思路是将,通过计数器的算成对应的速度,通过pid公式调节,反馈回去,调节PWM波自至速度达到设定值。
    3. 我是通过TIM4_CH1输出PWM波,控制电机转速;通过短时间定时器和对射管计数器传过来的信号,高低电平来测量速度的。
    4. 这是我的pid笔记
    PID算法重要知识点:一种可以自我调节,稳定输出,实现实际值十分接近设定值的方法。
    一、类型
    (1).位置型pid
    实现的步骤:
    	1.建立一个结构体其中包括:
              比例系数(Kp)Proportion,
              积分系数(Ki)Integral,
              微分系数(Kd)Derivative,
              当前误差current_error,
              上次误差S_error,
              累计误差Sum_error,
              设定目标SetValue
              实际数值actualValue
    
            2.位置型PID的公式:increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid
                                ->SUM_error)+(Pid->Kd)*(Pid->error-Pid->S_error);
    
    	3.初始化函数,调整函数:
              /*------------------------------------------
               函数功能:位置型pid参数初始化min~max
               函数说明:			
              ------------------------------------------*/
               void PositionPid_Init(PID Pid)
              {
                  Pid->Kp=0.8;
                  Pid->Ki=0.1;   
                  Pid->Kd=0.1;
    	      Pid->error=0.0;
                  Pid->S_error=0.0;
                  Pid->SUM_error=0.0;
                  Pid->actualvalue=0.0;
                  Pid->setvalue=0.0;
              }
              /*------------------------------------------
       	   函数功能:位置型PID调整
    	   函数说明:利用本次误差和上次误差进行反馈调节		
    	  ------------------------------------------*/
    	   float PositionPid_adjust(PID Pid,float setpoint)
    	  {
     	     float increment;
    	     Pid->setvalue=setpoint;
    	     Pid->error=setpoint-Pid->actualvalue;
                 Pid->SUM_error+=Pid->error; 
    	     /*采用的是位置型pid*/
                 increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid->SUM_error)+(Pid->Kd)*             (Pid->error-Pid->S_error);//这个是位置式PID的灵魂
                  Pid->S_error=Pid->error;
                 return (318-increment);//这里318是根据实际需要增加的。
               }
              
    
            4.思路及要点:位置型PID首先要解决的问题是闭环反馈的事,就是要有测量反馈给单片                      机结构体变量Pid->actualvalue,然后在调整中会根据不断更新的实际值,带入公式进行不断调节,以达到目标。
    
    (2)增量型PID
            1.建立结构体
              /*------------------------------------------
     	   结构体说明:这是位置式、增量式PID的结构体,包括基本的
    						PID调节参数.
    	  ------------------------------------------*/
    	  typedef struct node
    	 {
     	  /*1.比例系数Kp 2.积分系数Ki 3.微分系数Kd
      	  4.本次的误差error 5.上次的误差S_error
      	  6.用于积分的误差和SUM_error
      	  7.设定的值setvalue 8.实际的值actualvalue
     	 */
    	/*下没有特别说明就代表是共同变量*/
     	  float Kp;
     	  float Ki;
     	  float Kd;
    	  float error;
              float S_error;
              float SS_error;   //上上次误差,增量型PID需要 
              float SUM_error; //累计误差,位置型PID需要
              float setvalue;
              float actualvalue;
    	  }PIDN,*PID;
            2.初始化函数 ,调整函数:
     /*------------------------------------------
     函数功能:增量型PID初始化
     函数说明:			
    ------------------------------------------*/
    void IncrementPid_Init(PID Pid)
    {
    	  
        Pid->Kp=0.1;
        Pid->Ki=0.85;
        Pid->Kd=0.15;
        Pid->error=0.0;
        Pid->S_error=0.0;
        Pid->SS_error=0.0;
        Pid->actualvalue=0.0;
        Pid->setvalue=0.0;
    }
    /*------------------------------------------
     函数功能:增量型PID调整
     函数说明:			
    ------------------------------------------*/
    float IncrementPid_adjust(PID Pid,float setpoint)
    {
       float increment;
       float fanhuizhi;
       Pid->setvalue=setpoint;
       Pid->error=setpoint-Pid->actualvalue;
       increment=(Pid->Kp)*((Pid->error)-(Pid->S_error))+(Pid->Ki)*(Pid->error)*i+(Pid->Kd)*(Pid->error-2*Pid->S_error+Pid->SS_error);//这个是增量式PID的灵魂
       adjust_shuzhi-=increment;//根据实际应用的时候adjust_shuzhi的值太大了,所以有点像下降型pid调节。
       Pid->SS_error=Pid->S_error;
       Pid->S_error=Pid->error;
    }
    一、实际使用PID的经验
        a.有些变量只能初始化一次,注意看
        b.对于直流电机调速的结果看,增量型越接近越慢
        c.实际值->公式-> =? 设定值,否则返回。
        d.在调节pid参数的时候,最好设置一个些printf用观察数字的变化。
    
    
    
    
    
    
    
    
    
    
    
    
    

    4.这是我参考的pid算法的资料:
    链接:https://pan.baidu.com/s/1bYmddMa1DavPCMzIDd9E1g
    提取码:5lga
    四、总结:首先声明我这里并没有将我这个项目的所有的资料,只是将其中对pid的资料及相关思路写了下来。

    展开全文
  • 当我们给小车设定速度时,自然是希望它能够按照预设的速度运行,但因为外界阻力...谈到闭环控制算法,最经典的当然是PID了,rt-robot 中提供了PID的算法,其中有增量式PID和位置式PID,对于电机的控制,增量式P...
  • 直流减速电机增量式PID 通俗易懂版 对于我一个双非学校没上过自控的电子专业本科生而言,这个东西真的是太难了,之前研究了一个A4950驱动,价格便宜,驱动能力高,安全性高,便捷性高,一句话就是比L298N好用,我写完之后发...
  • 21-2-17 PID调试——增量式PID速度PID测试数据 速度PID 速度PID采用增量式PI控制 源码: 内联代码片。 void Motor_Speed_PI(motor_parameter_st *Motorx) { (*Motorx).PID_speed.bias = (*Motorx).actual_speed-(*...
  • 增量式PID的两种计算方式及C代码

    万次阅读 2019-05-05 09:55:04
    最近笔者在项目中需要使用到增量式PID进行电机控制,参考网上增量式PID算法,发现有两类算法的代码,便产生疑惑,究竟是哪 一种算法是正确的?——最终发现两种表达方式均为正确的! 从原理出发,分析如下: 位置...
  • 之前章节已经把PID从理论到时间基本上讲完了,剩下一个位置式PID就能收尾了。赶紧更完,就开始平衡小车下一步制作了。最近也是比较忙,更贴慢了很多。不过,这个零基础教程我还是要坚持写完的。 位置式PID部分主要...
  • PID介绍 PID调参 串级PID

    万次阅读 多人点赞 2019-06-19 13:44:38
    鉴于串级PID在pixhawk系统中的重要性,无论是误差的补偿,如姿态解算;还是控制的实现,如姿态控制,位置控制,靠的都是串级的pid,这里我们先对串级pid做一个介绍,后面会再接着分析,姿态的控制以及位置的解算和...
  • 调试增量式PID时遇到的问题

    千次阅读 多人点赞 2020-11-03 22:02:41
    最近因为项目需求,需要用到PID,然后就在网络上翻PID算法,然后就随便找了一个直接用,调试的时候才发现不对劲啊,怎么网上流传的PID参数整定都不管用,然后去深入理解PID算法,才发现掉坑了。 下面是我翻到的源码...
  • PID增量式算法

    2021-10-13 12:24:02
    ​     这里先提供博主的学习资源:PID算法从理论到实践 小游戏让你秒懂调参技巧 - 软件调参 - FPV帮 - 分享飞行的技巧与乐趣 (fpvbang.com) ​     PID是我们最常见的控制算法之一,全名为(Proportion ...
  • 增量式和位置式PID

    千次阅读 2015-04-13 12:42:07
    先介绍几个概念,首先是比例带 ...以智能车速度控制为例,使用增量式PI 自己确定好比例带和积分时间,测量周期,很容易就可以确定公式中的几个参数,当然需要经过大量实验来实现参数的最优化。
  • 增量式pid分析 及 参数整定

    万次阅读 多人点赞 2017-01-16 14:19:13
    /************************************************************************** 函数功能:增量PI控制器 1.入口参数:编码器测量值,目标...根据增量式离散PID公式 pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k
  • 这是本人参考网上的资料,然后总结写下的PID控制算法,属于最基本的版本,对于后期的参数调节,和算法使用可根据实际情况做调整。就是赚个辛苦费。
  • 对于增量式PID 代码实现的详细说明;应给可以给部分人解疑。
  • 上篇介绍了连续系统的PID算法,但是计算机控制是一种采样控制,他只能根据采样时刻的偏差来计算控制量,因此计算机控制系统中,必须对公式进行离散化,具体就是用求和代替积分,用向后差分来代替微分,使模拟PID...
  • 上篇介绍了连续系统的PID算法,但是计算机控制是一种采样控制,他只能根据采样时刻的偏差来计算控制量,因此计算机控制系统中,必须对公式进行离散化,具体就是用求和代替积分,用向后差分来代替微分,使模拟PID离散...
  • 经典PID原理解析,PID参数整定工具书。涵盖了PI、PD、PID等位置式和增量式PID的调试方法。并且结合波形解说,十分适合初学者理解和进一步学习。
  • 在分析增量式数字 PID基本算法的基础上,讨论了PID调节器参数对控制性能的影响及PID调节器控制参数的整定,并利用具有积分分离和消除设定值变化冲击的PID控制算法来实现具有最佳组合的PID控制。仿真实验结果表明,经...
  • 1、PID算法离散化 在采样周期足够小时,可以作如下近似: u(t)≈u(k)u_{(t)}\approx u_{(k)}u(t)​≈u(k)​ ;e(t)≈e(k)e_{(t)}\approx e_{(k)}e(t)​≈e(k)​ ∫0te(t)dt=∑i=0ke(i)Δt=∑i=0kTe(i)\int_{0}^{t}e_{...
  • PID算法是一种很常用的算法,对于PID算法最关键的是调参,关于调参的文章会在后续去发表,这次想简要的阐述下PID算法的应用 P:Proportion(比例),就是输入偏差乘以一个常数。 I :Integral(积分),就是对输入...
  • 而串级PID也是一个经典且牛批的方案而广为人知,所以在这样的比赛结束之后作为俩套方案都试过的我,谈一谈平衡小车之家的代码即并行的pid和串级pid的优缺点以及调参经验。 废话少说正题开始 我相信大家都应该很了解...
  • PID参数理解及调参方法(附典型PID算法程序)

    万次阅读 多人点赞 2019-04-05 22:51:36
    调PID步骤 (1) 确定比例系数Kp 确定比例系数Kp 时,首先去掉PID 的积分项和微分项,可以令Ti=0、Td=0,使之成为 纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp 由0 开始逐渐增 大,直至...
  • 漫谈PID——实现与调参

    千次阅读 多人点赞 2018-03-16 12:04:52
    闲话:作为一个控制专业的学生,说起PID,真是让我又爱又恨。甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂。所以在看懂pid的基础上,写下这篇文章,方便学习和交流。==...

空空如也

空空如也

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

增量式pid调参