欢迎来到天天文库
浏览记录
ID:38920415
大小:114.00 KB
页数:5页
时间:2019-06-21
《如何在STM32上实现增量PID控制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、【教程】如何在STM32上实现增量式PID转 虽然PID不是什么牛逼的东西,但是真心希望以后刚刚接触这块的人能尽快进入状态。特地分享一些自己如何实现的过程。首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异。资料上比较多的是: 还有一种的算法是: 这里主要介绍第二种,具体会分析比例、积分、微分三个环节的作用。硬件部分:控制系统的控制对象是4个空心杯直流电机,电机带光电编码器,可以反馈转速大小的波形。电机驱动模块是普通的L298N模块。芯片型号,STM32F103ZET6软件部分:PWM输出:TIM3,可以直接输出4路
2、不通占空比的PWM波PWM捕获:STM32除了TIM6TIM7其余的都有捕获功能,使用TIM1TIM2TIM4TIM5四个定时器捕获四个反馈信号PID的采样和处理:使用了基本定时器TIM6,溢出时间就是我的采样周期,理论上T越小效果会越好,这里我取20ms,依据控制对象吧,如果控制水温什么的采样周期会是几秒几分钟什么的。上面的PWM输出和捕获关于定时器的设置都有例程,我这里是这样的:TIM3输出四路PWM,在引脚C的GPIO_Pin_6
3、GPIO_Pin_7
4、GPIO_Pin_8
5、GPIO_Pin_9输出四路捕获分别是TIM4 TIM1 TIM2 TIM5 ,对应引脚是: P
6、B7PE11PB3PA1高级定时器tim1的初始化略不同,它的中断”名称“和通用定时器不同。具体的内容,请大家看一下我分享的代码就明白了。 主要讲解PID部分准备部分:先定义PID结构体:1.typedefstruct 2.{3.intsetpoint;//设定目标4.intsum_error;//误差累计5.floatproportion;//比例常数6.floatintegral;//积分常数7.floatderivative;//微分常数8.intlast_error;//e[-1]9.intprev_error;//e[-2]10.}PIDtypedef;复制代码在文件中定义几
7、个关键变量:1.float Kp= 0.32 ;//比例常数2.float Ti= 0.09;//积分时间常数3.floatTd= 0.0028; //微分时间常数4.#defineT 0.02//采样周期5.#defineKi Kp*(T/Ti) //KpKiKd三个主要参数6.#defineKd Kp*(Td/T)复制代码PID.H里面主要的几个函数:1.voidPIDperiodinit(u16arr,u16psc); //PID采样定时器设定1.voidincPI
8、Dinit(void); //初始化,参数清零清零2.intincPIDcalc(PIDtypedef*PIDx,u16nextpoint); //PID计算3.voidPID_setpoint(PIDtypedef*PIDx,u16setvalue); //设定PID预期值4.voidPID_set(floatpp,floatii,floatdd);//设定PID kpkikd三个参数5.voidset_speed(floatW1,floatW2,floatW3,floatW4);//设定四个电机的目标转速复制代码PID处理过程:岔开一下:这里我控
9、制的是电机的转速w,实际上电机的反馈波形的频率f、电机转速w、控制信号PWM的占空比a三者是大致线性的正比的关系,这里强调这个的目的是因为楼主在前期一直搞不懂我控制的转速怎么和TIM4输出的PWM的占空比联系起来,后来想清楚里面的联系之后通过公式把各个系数算出来了。正题:控制流程是这样的,首先我设定我需要的车速(对应四个轮子的转速),然后PID就是开始响应了,它先采样电机转速,得到偏差值E,带入PID计算公式,得到调整量也就是最终更改了PWM的占空比,不断调节,直到转速在稳态的一个小范围上下浮动。上面讲到的“得到调整量”就是增量PID的公式:1.intincPIDcalc(PIDtyp
10、edef*PIDx,u16nextpoint)2.{3.intiError,iincpid;4.iError=PIDx->setpoint-nextpoint; //当前误差5./*iincpid= //增量计算6.PIDx->proportion*iError //e[k]项7.-PIDx->integral*PIDx->last_error //e[
此文档下载收益归作者所有