精华内容
下载资源
问答
  • 现在将串行PID控制做下总结,如下图所示:

    现在将串行PID控制做下总结,如下图所示:

    展开全文
  • 比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID 参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算, 而将所有参数全部用整数,运算到最后再...
  • 串级PID的一些理解

    万次阅读 多人点赞 2019-05-12 21:29:34
    本篇博文主要来回答为何多旋翼无人机控制使用的是串级PID而非单级PID这一问题。 我们可以从如下几个角度来回答这个问题: 1.输出反馈和状态反馈 首先,以无人机的姿态通道为例,系统的状态变量为姿态角和姿态角...

    本篇博文主要来回答为何多旋翼无人机控制使用的是串级PID而非单级PID这一问题。

    我们可以从如下几个角度来解释这个问题:

    1.输出反馈和状态反馈

    首先,以无人机的姿态通道为例,系统的状态变量为姿态角和姿态角速度,对于这样的一个多变量系统,如果系统的状态反馈不全的话很可能导致系统控制性能变差甚至不稳定(实际使用单环PID控制进行实测时能明显感觉到动态性能比较差,振荡较大,阻尼较小,增加D性能提升有限甚至会导致系统发散);单级PID相当于输出反馈(只将系统的姿态角反馈回前端),串级PID可看作状态反馈(两个状态变量均反馈回控制器前端);输出反馈的反馈值只反映了系统状态的一部分,不能完全表征系统的状态变化量,所以控制性能比状态反馈差

    2.PD控制和速度反馈

    串级PID和单级PID最大的区别在于级联PID引入了内回路,这个内回路的作用可以从PD控制器与速度控制器的角度来阐述。

    首先来看一个简单的PD控制器用于控制二阶系统的例子,系统的框图如下所示:

    在这里插入图片描述

    由上图可知,系统的开环传递函数为:

    G ( s ) = ω n 2 ( T d s + 1 ) s ( s + 2 ξ ω n ) = K ( T d s + 1 ) s ( s 2 ξ ω n + 1 ) G(s)=\frac{\omega_{n}^{2}\left(T_{d} s+1\right)}{s\left(s+2 \xi \omega_{n}\right)}=\frac{K\left(T_{d} s+1\right)}{s\left(\frac{s}{2 \xi \omega_{n}}+1\right)} G(s)=s(s+2ξωn)ωn2(Tds+1)=s(2ξωns+1)K(Tds+1)

    式中 K = ω n 2 ζ K=\frac{\omega_{n}}{2 \zeta} K=2ζωn为开环增益,闭环传递函数为:

    Φ ( s ) = ω n 2 ( T d s + 1 ) s 2 + 2 ζ d ω n s + ω n 2 \Phi(s)=\frac{\omega_{n}^{2}\left(T_{d}s+1\right)}{s^{2}+2 \zeta_{d}\omega_{n} s +\omega_{n}^{2}} Φ(s)=s2+2ζdωns+ωn2ωn2(Tds+1)

    式中,等效阻尼比 ζ d \zeta_{d} ζd为:

    ζ d = ζ + 1 2 T d ω n \zeta_{d}=\zeta+\frac{1}{2} T_{d \omega_{n}} ζd=ζ+21Tdωn

    由此可见,PD环节调整了系统的阻尼比 ( ζ d > ζ ) \left(\zeta_{d}>\zeta\right) (ζd>ζ),这将使得系统的动态过程超调量下降,调节时间变短,同时开环增益 K = ω n 2 ζ K=\frac{\omega_{n}}{2 \zeta} K=2ζωn保持不变,即PD控制器不改变系统的稳态精度,也不改变系统的无阻尼振荡频率。由于其在二阶系统中增加了一个闭环零点,因此不能用经典的二阶系统性能公式来计算其时域性能指标。但是,我们可以通过调整微分环节的时间常数 T d T_{d} Td来使系统获得良好的动态性能。

    采用速度反馈控制二阶系统的框图如下所示
    在这里插入图片描述

    其中 K t K_t Kt为速度反馈系数,可知上述系统的开环传递函数为:

    G ( s ) = ω n 2 s ( s + 2 ζ ω n + K t ω n 2 ) = K s ( s 2 ζ ω n + K t ω n 2 + 1 ) G(s)=\frac{\omega_{n}^{2}}{s\left(s+2 \zeta \omega_{n}+K_{t} \omega_{n}^{2}\right)}=\frac{K}{s\left(\frac{s}{2 \zeta \omega_{n}+K_{t} \omega_{n}^{2}}+1\right)} G(s)=s(s+2ζωn+Ktωn2)ωn2=s(2ζωn+Ktωn2s+1)K

    式中 K = ω n 2 ζ + K t ω n K=\frac{\omega_{n}}{2 \zeta+K_{t} \omega_{n}} K=2ζ+Ktωnωn为系统的开环增益。可知,速度反馈使系统的开环增益减小了,这将会降低系统的稳态精度。

    相应的其闭环传递函数为:

    Φ ( s ) = ω n 2 s 2 + 2 ζ t ω n s + ω n 2 \Phi(s)=\frac{\omega_{n}^{2}}{s^{2}+2 \zeta_{t} \omega_{n} s+\omega_{n}^{2}} Φ(s)=s2+2ζtωns+ωn2ωn2

    式中: ζ t = ζ + 1 2 K t ω n \zeta_{t}=\zeta+\frac{1}{2} K_{t} \omega_{n} ζt=ζ+21Ktωn。可见,引入速度反馈可以使得系统的阻尼比增加,且不改变系统的无阻尼振荡频率,这与PD控制器的作用相同;但值得注意的是,速度反馈的引入使系统的开环增益减小,这将降低系统的稳态精度。因此再加入速度反馈的同时需要适当提高系统的开环增益,以补偿稳态误差的变化。

    重要结论:内环的加入相当于增加了系统的阻尼

    从具体实现的角度来讲,微分器对输入信号中的高频噪声具有放大作用,而速度反馈中噪声成分很弱,因此速度反馈抗干扰性能由于PD控制器;

    因此,从增加系统阻尼,改善系统的动态性能的角度来讲,速度反馈优于PD控制。

    一般的,以姿态角控制为例,当系统的角速度信号不可测时,使用单环的PID控制器,为系统加入角度的微分项来增加系统的阻尼比;当系统的角速度信号可测时,使用级联的PID控制,通过引入速度反馈回路增加系统的阻尼比。

    拓展

    Q:为何串级PID使用的是P-PID而不是PID-PID?
    A:虽然从时域来看,微分的引入可以增加系统的阻尼比并改善系统的动态特性;但是从频域来看微分项的引入会增加系统高频段的幅值,这会放大输入信号中的高频噪声,会降低控制器的性能;两个微分项串联更会加剧这一影响。
    同样的,控制器的滞后主要来源于积分项,两个积分项串联更会加剧滞后,使控制器的性能下降。

    展开全文
  • 基于STM32F407四旋翼无人机---PID算法控制(五)

    基于STM32F407四旋翼无人机---PID算法控制(六)

    PID介绍

    PID介绍

    此算法是由P(比例)、I(积分)和D(微分)通过线性组合构成控制器,由于PID控制器结构较为简单,参数整定也较为容易,所以应用非常广泛。

    在这里插入图片描述

    P(比例):==通俗的讲就是放大误差,==计算出实际测量值和期望值差值,然后和比例系数Kp相乘,这种控制器输出的变化与输入控制器的偏差成比例关系。一个简单的比例控制会使系统震荡,使测量值在期望值周围来回变换,而P较大时,对误差放大就会更大,虽然到达期望值所需要的时间变短,但是震荡时间变长,还会产生超调,P过大时会使系统不稳定;P较小时又会使达到期望值所需的时间变长,但是震荡时间变短,但是容易造成四旋翼无人机反应不灵敏。 
      I(积分):来控制过去,积分项是将误差对采样时间进行积分,然后乘以一个积分系数Ki,然后不断的累加,也就是过去一段时间的误差和,他的作用就是在测量值在趋近于期望值的时候给一个反作用的量,依次来消除稳态误差,提高系统的控制精度。
      D(微分):将误差进行导数,再乘以一个Kd,微分系数较大时,超调会变大,但是调节时间变短。当微分系数较小时超调也会变大,调节时间也会较长,只有微分系数合适,才会使超调量较小,调节时间也会变短。

    PID仿真分析

    调节PID多了就会有经验,什么现象会合适,先调什么再调什么。调节PID需要一个调试架,也可以自己做,千万不要调PID的时候直接飞,在调试架调试的时候也要小心,不要被桨叶打着手。

    在这里插入图片描述

    在四旋翼中,有两个输入量,这样我们就可以写一个二阶的PID控制器,也就是常说的串级PID,当然可以使用单级PID,但是调节效果不如串级PID,输入量为角度和角速度,那么可以设置一个内外环,先进行外环控制,将角度先传入一个PID控制器,由于我们想要四旋翼飞行平稳,则横滚和俯仰的期望值为0,所以期望值赋值为0,此时控制器的输出为期望的角速度,那么我们就可以进入到另一个单级PID中,将外环的输出值作为角速度环(内环)的期望值,将实时测量的角速度值设为内环的测量值,那么内环的输出作为给电机的控制量。

    在调节时需要把P、I、D三个系数归零,开始调节Kp,先设置Kp小一点的值,增大油门临界到将要起飞的状态,然后晃动杆子,让四旋翼晃动,观察飞机能否调节到平衡位置,如果感觉没有力气或者调节不回去或者比较慢就表明Kp值小了,就需要慢慢往上调,那么什么时候合适呢?当四旋翼开始在水平位置震荡时,就说明Kp值已经快要接近合适值了,再调大一点时,四旋翼会大幅度震荡,有时可能会呈现发散现象,就是调节的幅度会越来越大,最终达到不可控的状态,此时就要减小一些Kp值,这样的比例系数就算是合适。
    在这里插入图片描述

    接下来我们就要消除P值带来的震荡,调节Ki值,当Ki值较小时,对于消除震荡气的作用不大,则依然在震荡,可能会有些作用,但也是在轻微震荡。当Ki值合适时,就可以消除震荡,并且反应时间在我们的接收范围之内。在这里插入图片描述

    当Ki值过大时就会使整个系统的反应时间拉长。
    在这里插入图片描述
    当Ki值合适的时候,一般的控制系统当Kp和Ki值调好了其实就可以了,Kd值可以不用调,Kd作用就是起一些抗干扰的作用,就像是一辆汽车从路边驶到路中间,可能在行驶过程中路上会有一些坑,那么就会影响到路中间的时间和效果,那么Kd的作用就是这样。
    在这里插入图片描述

    那么就需要根据这些系数的特性去写控制器了。

    void UpdatePID(PID_t* pid, const float dT)
    {
    	pid->Err = pid->desired - pid->measured;
    
    	if(pid->Err < pid->DeathArea && pid->Err > -pid->DeathArea)
    	{pid->Err = 0;}
    	//做误差限幅
    	if(pid->Err_LimitHigh != 0 && pid->Err_LimitLow != 0)
    	{pid->Err=LIMIT(pid->Err,pid->Err_LimitLow,pid->Err_LimitHigh);}
    
    	pid->integ += pid->Err * dt;  //积分项 
    	//积分限幅    
    	if(pid->IntegLimitHigh != 0 && pid->IntegLimitLow != 0)
    
    	{pid->integ=LIMIT(pid->integ,pid->IntegLimitLow,pid->IntegLimitHigh);}
    
    	deriv = -(pid->measured - pid->prevError)/dt; // 微分项
    	pid->out=pid->kp*pid->Err+pid->ki*pid->integ+pid->kd * deriv;//PID的输出结果
    
    	//PID输出限幅
    	if(pid->OutLimitHigh != 0 && pid->OutLimitLow != 0)
    	{pid->out=LIMIT(pid->out,pid->OutLimitLow,pid->OutLimitHigh);}
    	pid->prevError = pid->measured;//微分先行(变式)用法
    

    那么串级PID需要将输出值当做下一个PID的期望值,角速度作为观测值。

    展开全文
  • 串级PID算法

    千次阅读 多人点赞 2019-07-25 17:18:45
    单环PID和串级PID的区别(框图表示) 串级PID的优势:增加稳定性,增强抗干扰性(其实不是太理解。。。) 代码实现 定义4个PID的结构体,分别用于x方向内环、外环以及y方向内环、外环(当初做板球系统xy方向用的都...

    单环PID和串级PID的区别(框图表示)

    在这里插入图片描述
    在这里插入图片描述
    串级PID的优势:增加稳定性,增强抗干扰性(其实不是太理解。。。)

    代码实现

    定义4个PID的结构体,分别用于x方向内环、外环以及y方向内环、外环(当初做板球系统xy方向用的都是同一个PID结构体变量,最后居然能调出来,惊了。。。PID真是玄学)
    (一)结构体变量

    //定义PID结构体
    typedef struct
    {
    	float ek;
    	float ek1;
    	float esum;
    	float kp;
    	float ki;
    	float kd;
    } PID_StructureDef;
    
    //需要开x,y两个方向的pid结构体
    PID_StructureDef PID_shell_Structure_x={0,0,0,0,0,0};	//x外环pid结构体
    PID_StructureDef PID_core_Structure_x={0,0,0,0,0,0};	//x内环pid结构体
    
    PID_StructureDef PID_shell_Structure_y={0,0,0,0,0,0};	//y外环pid结构体
    PID_StructureDef PID_core_Structure_y={0,0,0,0,0,0};	//y内环pid结构体
    

    (二)PID结构体变量的参数设置函数

    //设置PID结构体的初始化参数
    void Set_PID_para(float kp,float ki,float kd,PID_StructureDef *PID_Structure)
    {
    	PID_Structure->kp=kp;
    	PID_Structure->ki=ki;
    	PID_Structure->kd=kd;
    }
    

    (三)PID输出计算函数,输入的是外环的误差,返回的是内环的输出

    //PID计算输出
    int PID_Calculate(float error,float gyro,PID_StructureDef *PID_shell_Structure,PID_StructureDef *PID_core_Structure)
    {
    	float shell_output,core_output;
    	
    	PID_shell_Structure->ek=error;
    	//积分限幅
    	if(PID_shell_Structure->esum>300)
    		PID_shell_Structure->esum=300;
    	else if(PID_shell_Structure->esum<-300)
    		PID_shell_Structure->esum=-300;
    	else
    		PID_shell_Structure->esum+=error;
    	shell_output=(PID_shell_Structure->ek)*(PID_shell_Structure->kp)+(PID_shell_Structure->esum)*(PID_shell_Structure->ki);
    	
    	//外环输出,作为内环输入 用陀螺仪当前的角速度作为实际值
    	PID_core_Structure->ek=shell_output-gyro;
    	//内环积分限幅
    	if(PID_core_Structure->esum>500)
    		PID_core_Structure->esum=500;
    	else if(PID_core_Structure->esum<-500)
    		PID_core_Structure->esum=-500;
    	else
    		PID_core_Structure->esum+=PID_core_Structure->ek;
    	core_output=(PID_core_Structure->ek)*(PID_core_Structure->kp)+(PID_core_Structure->esum)*(PID_core_Structure->ki)+(PID_core_Structure->ek-PID_core_Structure->ek1)*(PID_core_Structure->kd);
    	PID_core_Structure->ek1=PID_core_Structure->ek;
    	
    	return (int)core_output;
    }
    

    (四)使用的时候,输入角度误差,以及陀螺仪当前的角速度

    //计算当前姿态的坐标x和y,并实现控制
    void Calculate_Control(void)
    {
    	float temp_pitch,temp_roll,pid_x,pid_y;
    	//获取陀螺仪的三个角速度
    	MPU_Get_Gyroscope(&GRY_x,&GRY_y,&GRY_z);
    	
    	//计算误差值 以及PID xy坐标换算到角度,利用串级pid控制
    	temp_pitch=atan2(Height,Goal_X)-pitch;
    	pid_x=PID_Calculate(temp_pitch,GRY_x,&PID_shell_Structure_x,&PID_core_Structure_x);
    	if(pid_x)
    	{
    		motor_1=0;
    		motor_3=pid_x;
    	}
    	else
    	{
    		motor_3=0;
    		motor_1=-pid_x;
    	}
    	
    	temp_roll=atan2(Height,Goal_Y)-roll;
    	pid_y=PID_Calculate(temp_roll,GRY_y,&PID_shell_Structure_y,&PID_core_Structure_y);
    	if(pid_y)
    	{
    		motor_4=0;
    		motor_2=pid_y;
    	}
    	else
    	{
    		motor_2=0;
    		motor_4=-pid_y;
    	}
    }
    

    注:代码虽然过了编译,但由于硬件出了问题,代码能否实现功能还不知道。。。

    串级PID调参技巧

    Reference:https://blog.csdn.net/nemol1990/article/details/45131603

    展开全文
  • 这时我们平衡车的抖动消失了,当小车不再抖动的时候,一般PID参数是越大越好的,我们试着增加KD值,PID参数越大系统的响应就会越快。 (13)这时我们把KP值还是设置成500,KD值增大到1,看到情况比之前好,但是 还...
  • 本文提供粒子群算法简介和一个算法举例,提供粒子群算法仿真PID的M文件代码及simulink仿真。另外,本文还提供了一种动态simulink仿真方法,可以让M文件和simulink文件之间互相交换数据,实现仿真与程序的反馈,增加...
  • PID及串级PID的理解

    2020-12-04 08:24:46
    PID及串级PID的学习比例环节(P)积分环节(I):微分环节(D): (仅供本人学习使用) 在四轴中,PID起着至关重要的作用,对PID学习更加深入才能更了解四轴的平衡状态时如何实现的。 暂时还不理解的内容: pid...
  • 串级PID与单极PID的区别

    千次阅读 2021-02-05 20:26:52
    前言 本文将讲述串级PID与单极PID的区别,并由此引出什么时候用串级PID,对于想深入学习PID的你有一定的帮助。
  • Datalogger应用程序安装程序,可用于与Arduino建立串行通信。 该应用程序将所需的设定值发送到Arduino,并将Arduino的Measured信号读取到应用程序中。 它可以绘制设定点和测量值,并允许导出在执行过程中获取的数据...
  • PID算法原理及模板讲解

    千次阅读 多人点赞 2020-04-02 21:16:27
    很早都想写一栏关于PID算法的专栏,整个大学期间把谈女朋友的时间都拿来搞PID算法了(这样你们还不信我是真的搞PID的嘛。。)。为了学习PID算法买过平衡小车之家的平衡车(最后拆成玩具了),买过正点原子的minifly...
  • 获取指定USB设备的VID PID和SerialNumber, VID: 厂商号,PID :产品号
  • 为了实现对直流电机快速、准确调速的要求,提出了一种基于串口通信的直流电机PID调速系统设计方案。并实现系统的软硬件设计。采用按键、OLED显示屏等人机交互工具进行参数设置及显示.通过PID控制器闭环反馈控制调节...
  • 串级PID控制(多闭环PID控制)的理解

    万次阅读 多人点赞 2018-06-22 11:03:00
    网络上很多双闭环或者三闭环PID控制的讲述,其实就是串级PID控制,之前一直没能理解,更不知道如何应用。 现在用伺服电机为例,一起理解一下PID串级控制。 伺服电机一般为三个环控制,所谓三环就是3个闭环负反馈...
  • stm32版八位串行595数码管 #include "sys.h" //点击魔术棒加入对应的文件夹地址,FWLIB里加入相应的头文件 #include "delay.h" #include "usart.h" #include "led.h" #include "key.h" //////////////////////////...
  • 压力测试工具

    万次阅读 多人点赞 2018-12-20 16:06:28
    目录 1 性能测试...... ...2 压力测试(Stress Test)......2.1 网站测试......2.2 系统测试要求......3 测试工具......3.1 Webbench.... tcpcopy pid file: "/usr/local/tcpcopy/logs/tcpcopy.pid" ...
  • 进程和线程的区别

    千次阅读 2018-12-21 15:19:18
    4、体现在程序结构上,举一个简明易懂的列子:当我们使用进程的时候,我们不自主的使用if else嵌套来判断pid,使得程序结构繁琐,但是当我们使用线程的时候,基本上可以甩掉它,当然程序内部执行功能单元需要使用的...
  • 并发与串行

    2019-07-02 21:17:00
    目录 并发编程 并发与串行 学习并发的目的 如何实现并发 进程和程序 多道技术 一个进程的三种操作 并发重要概念 PID和PPID join的使用 进程对象常用属性 ...
  • 经过实验调试,该系统能够实现工作人员不同权限登录密码设置,实时数据、故障报警的显示,闭环PID参数的在线修改等功能,且系统能够稳定的运行。  在现代工业控制中,常用的人机接口界面依然采用的是键盘和液晶...
  • 一、并发与串行 1、目前程序存在的问题 程序默认执行方式就是 串行 即,程序自上而下,一行一行顺序执行,必须把当前任务执行完毕才能执行下一个任务无论当前任务需要多长时间 问题举例: 如tcp服务器的服务器中 ,如果...
  • 温度调理芯片AD7711对其施加激励电流,Pt100两端的电压差分输入AD7711,经滤波、放大、A/D后,串行送至TMS320F240。TMS320F240系列是美国TI公司于1997年推出的,专为数字电机控制和其它控制应用系统而设计的16位定点...
  • stm32+增量式pid+max6675 PWM温度控制

    千次阅读 多人点赞 2018-11-09 16:48:42
    stm32+增量式pid+max6675 PWM温度控制 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 之前spi通讯的max6675代码: https://blog.csdn.net/answerMack/article/details/83310370 模拟io通讯的max6675代码: ...
  • dto.setPid(pid); dto.setDiscountIdsSet(discountIds); dto.setGoodIdsSet(new HashSet(i)); return discountGoodsRelationshipDao.queryActiveGoodsByDiscountIdsAndGoodIds(dto); }, DiscountThreadPoolManager....
  • 经过实验调试,该系统能够实现工作人员不同权限登录密码设置,实时数据、故障报警的显示,闭环PID参数的在线修改等功能,且系统能够稳定的运行。  在现代工业控制中,最常用的人机接口界面依然采用的是键盘和液晶...
  • PID代码例子51单片机

    千次阅读 多人点赞 2020-07-27 17:40:06
    PID代码例子51单片机 #include<reg51.h> #include<intrins.h> #include<math.h> #include<string.h> struct PID { unsigned int SetPoint; // 设定目标 Desired Value unsigned ...
  • 引言  随着4C 技术的迅猛发展...FPGA 可固件串行与并行实现算法,从本质上提高了处理速度,对实时性要求较高的智能控制过程来说是一种有效的实现途径。  随着FPGA技术的不断发展,各种智能控制策略的FPGA 固核实现
  • pid控制器代码matlab ArduinoThermoControlWeb 一个烧瓶服务器,应简化我们的温度控制的日志记录。 该网站假定Arduino通过串行设备连接。 目前,我们必须具备以下能力: 添加一些arduinos。 在概述中给出设定点和...
  • 》 51、《再讲自动化控制中的PID》 52、《集线器、交换机、路由器、网关含义详解》 53、《CPU双核是什么意思 和四核有什么区别》 54、《PLC编程应用案例,双恒压无塔供水系统》 55、《图解组态王一●组态王软件》 56...
  • 经过实验调试,该系统能够实现工作人员不同权限登录密码设置,实时数据、故障报警的显示,闭环PID参数的在线修改等功能,且系统能够稳定的运行。  在现代工业控制中,最常用的人机接口界面依然采用的是键盘和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,445
精华内容 8,178
关键字:

串行pid