找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2512|回复: 1
打印 上一主题 下一主题
收起左侧

第十课_STM32的PID程序案例讲解

[复制链接]
跳转到指定楼层
楼主
ID:680841 发表于 2020-1-4 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习目的:
    1.掌握PID编程
    2.学会两种PID控制的程序
    3. 了解温度控制曲线、阻尼系数等专业术语

学习重点和难点
    1.温度控制中的热惯性问题
    2. 传感器延迟等问题的系统分析

学习练习过程:
一.理论基础
1.什么是PID
Proportional-Integral-Derivative control的缩写
比例积分微分控制,简称PID控制,是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好(Robust即强健稳定)和可靠性高,被广泛应用于工业过程控制,至今仍有90%左右的控制回路具有PID结构。
简单的说,根据给定值和实际输出值构成控制偏差,将偏差按比例、积分和微分通过线性组合构成控制量,对被控对象进行控制。常规PID控制器作为一种线性控制器。
Proportional比例即实际输出和设定值之间的差值乘上一个比例来控制输出调整量。
Integral积分,当实际输出正好等于设定值时仍需给出一个调整量,即残差,由积分来给出。
Derivative抑制达到设定值后过多的在设定点上下振荡。

2.增量式PID
增量式PID控制,数字PID控制算法的一种基本形式,是通过对控制量的增量(本次控制量和上次控制量的差值)进行PID控制的一种控制算法。
  实例:有一直流减速电机装有编码器,现在用PID进行速度控制,已知每10ms读取一次编码值,每次读到的编码值减去上一次的编码值(除以时间)可以反映出速度的快慢。也就是每次的增量就是反映实际的输出值。

3.位置式PID
  直线电机或者导轨电机,需移动到某一个位置,这个位置可以用相对的脉冲数来表示,当然这个数相对于绝对零位开关是个固定数。

二.具体编程步骤
1.增量式PID
①设定三个值kp、ki、kd即比例量、积分量、微分量
②增量=本次采集值-上次采集值
③增量与设定值算出当时差值dif
④积分量=累加dif*ki
⑤输出量=kp*dif+∑dif*ki+kd*((dif- lastdif)-( lastdif - prevdif))
        = kp*dif+∑dif*ki+kd*(dif+d prevdif -2* lastdif)
⑥上次lastdif再前次prevdif, 本次dif送上次lastdif。

说明:(dif-lastdif)-(lastdi-prevdif)反映被控值变化的快慢,抑制过快的变化。
float kp=50,ki=0.01,kd=2,sumi=0;
float dif,lastdif,prevdif,ks=132;           //ks是设定值与采集增量之间的系数
float scan,scan0,setnum=80,adjnum;
while(1)
{
  scan=TIM1->CNT;                                          //采集
  dif=(scan-scan0)*ks-setnum;                              //算出与设定值的差值
  scan0=scan;                                              //保存本次采集值
  sumi+=ki*dif;                                            //算出积分和
  adjnum=kp*dif+sumi+kd*(dif+ prevdif -2*lastdif);         //算出调整量
  TIM3->CCR3=adjnum;                                       //送出PWM调整
  prevdif = lastdif;                                       //上一次送前一次
  lastdif =dif;                                            //本次送上一次
  delay(10);                                     //时间为10ms采集和发出控制值,
}                                                          //建议用定时器做

另外可以做出限幅控制
  if (adjnum>2000) adjnum=2000;
if (adjnum<0)    adjnum=0;
比例及积分和的限幅和清零也可同上处理

2.位置式PID
基本与增量式相似。
差值dif就是实际值与设定值的差
Lastdif同样也是保存上一次的差值
积分和也同样算法,不同在于微分项,直接用本次差与上次差来计算。参考以下代码
float kp=50,ki=0.01,kd=2,sumi=0;
float dif,lastdif;                  //ks是设定值与采集增量之间的系数
float scan,setnum=80,adjnum;
while(1)
  {
scan=readencode(1);                      //读取1号导轨滑台现在位置值
dif=scan-setnum;
sumi +=dif*ki;
    if (sumi >100) sumi =100;
if (sumi <-100) sumi =-100;
adjnum=dif*kp+sumi+(dif-lastdif)*kd;
TIM3->CCR3=adjnum;                        //通过TIM3的PWM来输出控制  
if (dif==0) sumi=0;
lastdif = dif;
delay(10);                                //同样只有教学才能用消耗性延时
}

3.温度控制中的问题
①热惯性,热电偶作为一种测温传感元件,被广泛地应用在工业现场及实验室。由于热接点具有一定的热容量,热接点从介质中吸热量后,加热自身、使温度提高到稳定值需要一定的时间。即热接点的温度变化,在时间上总是滞后于被测介质的温度变化。热电偶的这种现象称为热惯性。
②阻尼曲线
由于存在传感器滞后,和输出变化及系统响应上也存在一定的时间差,因为电生热,热要传导都需要时间,往往会在设定目标点上下振动,逐渐趋于稳定。
这是理想中的温度曲线,加入PID目标就快速到达设定值,并尽量减少目标点上下的振荡。

③测温传感器的选用,常用的有半导体测温、热电偶两大种类,另外还有非接触式红外测温,一般来说半导测温灵敏度高,缺点温度范围较小即量程小,热电偶线性度也不太好,但温度测量范围大。

4.参数设定
  ①确定比例系数
     以系统不振荡为准、最快达到设定值为依据。
  ②再确定积分和微分系数,从小到大的方法。
  ③控制方式,由于烤箱是单相交流供电,所以输出以准PWM方式,因为SSR(固态继电器)开关时间<10ms,所以用10ms周期的PWM方式。
  ④光电隔离
      因为涉及到单相市电,所以SSR虽然已经是光电耦合式,不过还是建议再用一级光耦来隔离,练习一下光耦的应用。

   12是光电输入,各光耦的输入电流有所区别,一般设计在5-10ma之间,34为输出的光敏三极管,输出驱动电流可以设计在10-30ma之间。

5.系统控制设计

输入有两路:
①热电偶温度传感器
②设定值(简单的话可以做个电位器AD转成温度设定),做一个按键设定程序

控制程序
   每隔10ms扫描一次,进行PID数据采集,经过计算后输出控制信号,做一个100分辨度的PWM,以1秒为单位,输出1,就是开10ms,停990ms,输出95,即开950ms,停50 ms。
   在选用SSR时一定要开关时间小于10ms的产品。







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:85865 发表于 2020-2-26 14:05 | 只看该作者
先收着,有空时测试下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表