速度闭环控制器设计
在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活

图1. PID控制系统原理图
离散化公式:

当|e(t)<=β时

当|e(t)|>β时,q0 = Kp(1+Td/T);q1 = -Kp(1+2Td/T);q2 = Kp Td /T;u(t) = u(t-1) + Δu(t)

参数调整一般步骤:

1、确定比例增益。

P确定比例增益P时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0,PID为纯比例调节。输入设定为系统允许的最大值的60%70%,由0逐渐加大比例增益P,直至系统出现振荡。再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%70%。比例增益P调试完成。

2、确定积分时间常数Ti。比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。

3、确定微分时间常数Td。微分时间常数Td一般不用设定,为0即可。若要设定,与确定P和Ti的方法相同,取不振荡时的30%。

4、系统空载、带载联调,再对PID参数进行微调,直至满足要求。

PID控制器参数整定的方法:

1、理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。

2、工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定。现在一般采用的是临界比例法。利用该方法进行PID控制器参数的整定步骤如下:

(1)首先预选择一个足够短的采样周期让系统工作。

(2)仅加入比例控制环节,直到系统对输入的阶跃响应出现临界振荡,记下这时的比例放大系数和临界振荡周期。

(3)在一定的控制度下通过公式计算得到PID控制器的参数。

控制器主要由两个数据结构类型:

typedef struct{float de ;                             //各个电机当前误差值float fe ;                              //各个电机误差积分float de1;                            //各个电机历史误差1float de2;                            //各个电机历史误差2int out;                             //各个通道最终PWM输出}PIDDateBaseTypedef;                  //pid数据结构类型typedef
struct{float kp;                                     //比例权重float ki;                                      //积分权重float kd;                                     //微分权重}PIDParamBaseTypedef;               //pid参数结构类型

控制器的执行由定时器中断分频器发起,实现过程部分代码:

#define
MOTOR_OUTPUT_MAX                                   999#define
MOTOR_SPEED_PID_KP                           2.400#define
MOTOR_SPEED_PID_KI                            1.000#define
MOTOR_SPEED_PID_KD                           0.000#define
PI                                                                                 3.1415926535897932384626433832795const
PIDParamBaseTypedef PARAM_PID = {//电机pid速度控制参数.kp = MOTOR_SPEED_PID_KP,                        //比例权重.ki = MOTOR_SPEED_PID_KI,                         //积分权重.kd = MOTOR_SPEED_PID_KD,                       //微分权重};float
g_TargetSpeed[4]      = {0,0,0,0};//目的速度float
g_MotorSpeed[4]      = {0,0,0,0};//当前速度//速度值更新void
updataSpeed(void){int16_t etr[4];//获得编码器值etr[0] = TIM1->CNT;//M1TIM1->CNT = 0;etr[1] = TIM4->CNT;//M2TIM4->CNT = 0;etr[2] = TIM3->CNT;//M3TIM3->CNT = 0;etr[3] = TIM2->CNT;//M4TIM2->CNT = 0;for(int i = 0;i < 4;i++){float etrtemp = 0;//编码器脉冲计算轮角速度//360度常量 2*80 = 160tetrtemp = ((float)(etr[i] %
30000)) / (2.0 * 80.0);//角速度计算轮线速度etrtemp = etrtemp * (66 * PI);//写入线速度到全局g_MotorSpeed[i] = etrtemp * 10.0 *
0.25;}}//设定目的速度void
SetTargetSpeed(int16_t s1,int16_t s2,int16_t s3,int16_t s4){g_TargetSpeed[0] = s1;g_TargetSpeed[1] = s2;g_TargetSpeed[2] = s3;g_TargetSpeed[3] = s4;}//上传速度值void
sendUpMotorSpeed(void){uint8_t str[500];//sprintf((char
*)str,"%03.2f,%03.2f,%03.2f,%03.2f\r\n",g_MotorSpeed[0],g_MotorSpeed[1],g_MotorSpeed[2],g_MotorSpeed[3]);//分速度的合成float Vx = (((g_MotorSpeed[0] +
g_MotorSpeed[2]) / 2) + ((g_MotorSpeed[1] + g_MotorSpeed[3]) / 2) ) /
2;float Vw = ((((g_MotorSpeed[0] -
g_MotorSpeed[2]) / 2) * 0.891749586 / 187.833) + (((g_MotorSpeed[1] - g_MotorSpeed[3]) / 2) *
0.891749586 / 187.833)) / 2;uint8_t Syx,Syw;Syx = (Vx >= 0) ? 'A':'B';Syw = (Vw >= 0) ? 'A':'B';Vx = (Vx >= 0) ? Vx : -Vx;Vw = (Vw >= 0) ? Vw : -Vw;uint16_t vxi = Vx ;uint16_t vwi = Vw * 1000;sprintf((char
*)str,"<S%c%03d,%c%04d>\r\n",Syx,vxi,Syw,vwi);if(g_MotorSpeed[0] != 0){USART_SendString(USART3,str);}USART_SendString(USART1,str);}/*** @brief
MotorSpeedPidCtrl.*
Out = Kp[e(k)]+ki∑e(k)+Kd[e(k)-2e(k-1)+e(k-2)]*
其中积分项和微分项受大扰动误差阀值范围生效标志位控制* @retval None*/void
MotorSpeedPidCtrl(void){static PIDDateBaseTypedef pid[4] = {[0].de    = 0, [1].de    = 0, [2].de    = 0, [3].de    = 0, [0].fe     = 0,  [1].fe  = 0,
[2].fe  = 0,  [3].fe  =
0, [0].de1 = 0,  [1].de1 = 0,
[2].de1 = 0,  [3].de1 = 0, [0].de2 = 0,  [1].de2 = 0,
[2].de2 = 0,  [3].de2 = 0, [0].out = 0,  [1].out = 0,
[2].out = 0,  [3].out = 0, };//进行PID控制计算for(int i = 0;i < 4;i++){//计算当前误差并移动历史误差pid[i].de2     =  pid[i].de1;pid[i].de1     =  pid[i].de;pid[i].de       =  g_TargetSpeed[i] -
g_MotorSpeed[i];pid[i].fe  +=  pid[i].de;//pid[i]控制器核心方程pid[i].out =  PARAM_PID.kp * pid[i].de   + PARAM_PID.ki
* pid[i].fe     + PARAM_PID.kd
* ( pid[i].de - 2 * pid[i].de1          + pid[i].de2) * (pid[i].de < 100);//输出限制幅度pid[i].out = (pid[i].out >
MOTOR_OUTPUT_MAX) ? MOTOR_OUTPUT_MAX : pid[i].out;pid[i].out = (pid[i].out
<-MOTOR_OUTPUT_MAX) ?-MOTOR_OUTPUT_MAX : pid[i].out;//输出死区限制}//输出到电机控制setMotorPWM(pid[0].out,pid[1].out,pid[2].out,pid[3].out);//uint8_t str[50];//sprintf((char
*)str,"%d,%d,%d,%d\r\n",pid[0].out,pid[1].out,pid[2].out,pid[3].out);//USART_SendString(USART1,str);}//pid控制器执行周期分频器void
PID_Divider(void){static uint32_t div = 0;div++;if(div >= 100){div = 0;//更新当前速度updataSpeed();//上传速度信息sendUpMotorSpeed();//执行电机PID控制器MotorSpeedPidCtrl();}}

自动车速度闭环控制器设计相关推荐

  1. 入门智能车 | 带你认识PID闭环控制 - 增量式PID实现电机速度闭环

    带你认识PID闭环控制 - 增量式PID实现电机速度闭环 闭环控制是指控制论的一个基本概念.指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系.带有反馈信息的系统 ...

  2. 基于PI双闭环解耦控制的三相SVPWM电压型逆变器(2)--控制器设计

    在上一篇文章中,我们得到了三相逆变器的数学模型,接下来就是进行控制器的设计.其实对数学模型的设计目的就是研究控制器,控制器才是决定我们逆变结果的直接决定因素. 同时这一篇文章虽然是控制器的设计,但是对 ...

  3. 自动驾驶数据闭环系列之一:理想丰满,现实骨感

    交流群 | 进"传感器群/滑板底盘群/汽车基础软件群/域控制器群"请扫描文末二维码,添加九章小助手,务必备注交流群名称 + 真实姓名 + 公司 + 职位(不备注无法通过好友验证) ...

  4. AGV控制器设计与融合

    提 要 AGV(Automated Guided Vehicle)是自动化物流运输系统.柔性生产组织系统的关键设备.目前,柔性生产的重要性已经逐渐得到国内很多企业的重视,计划购进有关的自动车和自动物流 ...

  5. a4988 脉宽要求_基于STM32的微型步进电机驱动控制器设计

    基于STM32的微型步进电机驱动控制器设计 摘 要: 设计了一种微型步进电机驱动控制器,通过上位机界面修改步进电机转速.旋转角度.细分系数.该设计以STM32F103T8U6作为主控制器,以A4988 ...

  6. 基于bp神经网络的pid算法,神经网络pid控制器设计

    基于BP神经网络的PID控制器设计 参考一下刘金琨的<先进PID控制>这本书. 例子:被控对象yout(k)=a(k)yout(k-1)/(1+yout(k-1)^2)+u(k_1)其中a ...

  7. 基于 FPGA 的 UART 控制器设计(VHDL)(下)

    今天给大侠带来基于FPGA的 UART 控制器设计(VHDL)(下),由于篇幅较长,分三篇.今天带来第三篇,下篇,使用 FPGA 实现 UART.话不多说,上货. 之前有关于 Veriliog HDL ...

  8. matlab设计风电机外部控制器,【matlab编程代做】步进电机控制器设计

    <[matlab编程代做]步进电机控制器设计>由会员分享,可在线阅读,更多相关<[matlab编程代做]步进电机控制器设计(8页珍藏版)>请在人人文库网上搜索. 1.步进电机控 ...

  9. 多旋翼无人机控制器设计入门

    本篇文章首发于公众号:无人机系统技术.更多无人机技术相关文章请关注此公众号. 控制器设计简介 对于一架具备自动飞行能力的无人机来说,控制器设计是其中最为重要的工作之一.在开始控制器设计之前,我们要搞清 ...

最新文章

  1. 中科创星投资云游九州,布局时空大数据
  2. 交互学习 Vue.js
  3. Redis 的各项功能到底解决了哪些问题?
  4. 第二阶段——个人工作总结DAY10
  5. 多域环境下people picker查找不到用户问题的解决(转载jianyi)
  6. Spring Session官方介绍及spring框架学习方法
  7. Rustup 管理工具
  8. java没通过测试_我们应该把没有通过测试的故事回退到“开发”状态吗
  9. 国土空间规划项目资料获取的途径
  10. (转)C#开发微信门户及应用(2)--微信消息的处理和应答
  11. java word流_(word)java中字节流示例.doc
  12. property java用法_Java Properties getProperty(key)用法及代码示例
  13. [APEC中小企业峰会2009上]对话:经济适用男 vs 超级豪华男
  14. 用广播监听安卓设备电量状态
  15. 泛化性的危机!LeCun发文质疑:测试集和训练集永远没关系...
  16. Ibatis -- 一次执行多条SQL
  17. python tornade 模板扩展
  18. Windows Server 2012的服务管理自动化
  19. colab 上 tensorflow版本切换
  20. word中硬回车与软回车的区别与替换·转换(shift+enter)

热门文章

  1. ubuntu20.04,安装向日葵客户端报错问题
  2. 2018年新发布的高速数据采集卡汇总
  3. 软件工程复试——十三、软件项目管理
  4. python用tkinter及sympy解方程
  5. 下载必应搜索背景图并设置为背景
  6. 5.14上午数据库学习笔记
  7. 如何用python画爱心表白_程序员式优雅表白,教你用python代码画爱心
  8. html em标签的作用,htmlem标签的作用是什么?em和i标签的区别
  9. Python 列表的使用
  10. 原生html单页应用,小白篇 -- 原生 js 实现单页应用的初探