STM32L476应用开发之七:流量的PID控制
在气体分析仪使用过程中,为了力求分析结果的准确性,一般要求通过的气体流量尽可能的稳定。为了保证流量控制的稳定,我们采用PID调节来控制气路阀门的开度。
1、硬件设计
我们采用的流量计为气体质量流量计,采用热式原理,输出0-5VDC的信号。该流量计如下:

鉴于该流量计的特性,我们设计如下的采集电路来完成流量数据的采集,具体原理图如下:

对于流量控制阀我们选择了电动比例调节阀,该阀给的电压不一样时,其开度是不一样的,所以可以通过PWM来控制其在0-100%的范围内开关,从而获得我们需要的流量。

关于PWM部分的电路我们采用TIM定时器产生,通过响应的隔离电路产生幅值为24VDC的PWM波。具体的原理图如下:

2、软件设计
关于流量的采集与前述的模拟量的采集一致,不再多说。我们主要实验PID控制以及PWM输出等部分。
(1)PID控制
PID是控制中最为常见的控制器,其由比例、积分、微分等部分组成,器常见的结构框图如下所示:

这次我们要实现PID控制器,采用增量型算法,具有变积分,梯形积分和抗积分饱和功能,具体的软件流程图如下:

根据上述流程图,我们很容易实现PID控制器:
/* PID初始化操作,需在对vPID对象的值进行修改前完成 */
/* CLASSICPID vPID,通用PID对象变量,实现数据交换与保存 */
/* float vMax,float vMin,过程变量的最大最小值(量程范围) */
void PIDParaInitialization(CLASSICPID vPID,float vMax,float vMin)
{
vPID->maximum=vMax; /*输出值上限*/
vPID->minimum=vMin; /*输出值下限*/ vPID->setpoint=vMin; /*设定值*/
vPID->kp=0.6; /*比例系数*/
vPID->ki=0.03; /*积分系数*/
vPID->kd=0.01; /*微分系数*/ vPID->lasterror=0.0; /*前一拍偏差*/
vPID->preerror=0.0; /*前两拍偏差*/
vPID->result=vMin; /*PID控制器结果*/
vPID->output=0.0; /*输出值*/ vPID->errorabsmax=(vMax-vMin)*0.8;
vPID->errorabsmin=(vMax-vMin)*0.2; vPID->deadband=(vMax-vMin)*0.005; /*死区*/
vPID->alpha=0.2; /*不完全微分系数*/
vPID->deltadiff=0.0; vPID->integralValue=0.0;
} /* 通用PID控制器,采用增量型算法,具有变积分,梯形积分和抗积分饱和功能 */
/* 微分项采用不完全微分,一阶滤波,alpha值越大滤波作用越强 */
/* CLASSICPID vPID,PID对象变量,实现数据交换与保存 */
/* float pv,过程测量值,对象响应的测量数据,用于控制反馈 */
void PIDRegulator(CLASSICPID vPID,float pv)
{
float thisError;
float result;
float factor;
float increment;
float pError,dError,iError; thisError=vPID->setpoint-processValue; //得到偏差值
result=vPID->result;
if (ABS(thisError)>vPID->deadband)
{
pError=thisError-vPID->lasterror;
iError=(thisError+vPID->lasterror)/2.0;
dError=thisError-*(vPID->lasterror)+vPID->preerror; //变积分系数获取
factor=VariableIntegralCoefficient(thisError,vPID->errorabsmax,vPID->errorabsmin); //计算微分项增量带不完全微分
vPID->deltadiff=kd*(-vPID->alpha)*dError+vPID->alpha*vPID->deltadiff; increment=vPID->kp*pError+vPID->ki*factor*iError+vPID->deltadiff; //增量计算
}
else
{
if((abs(vPID->setpoint-vPID->minimum)<vPID->deadband)&&(abs(pv-vPID->minimum)<vPID->deadband))
{
result=vPID->minimum;
}
increment=0.0;
} result=result+increment; /*对输出限值,避免超调和积分饱和问题*/
if(result>=vPID->maximum)
{
result=vPID->maximum;
}
if(result<=vPID->minimum)
{
result=vPID->minimum;
} vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
vPID->lasterror=thisError;
vPID->result=result;
vPID->output=((result-vPID->minimum)/(vPID->maximum-vPID->minimum))*100.0;
} /*变积分系数处理函数,实现一个输出0和1之间的分段线性函数 */
/* 当偏差的绝对值小于最小值时,输出为1;当偏差的绝对值大于最大值时,输出为0 */
/* 当偏差的绝对值介于最大值和最小值之间时,输出在0和1之间现行变化 */
/* float error,当前输入的偏差值 */
/* float absmax,偏差绝对值的最大值 */
/* float absmin,偏差绝对值的最小值 */
static float VariableIntegralCoefficient(float error,float absmax,float absmin)
{
float factor=0.0; if(abs(error)<=absmin)
{
factor=1.0;
}
else if(abs(error)>absmax)
{
factor=0.0;
}
else
{
factor=(absmax-abs(error))/(absmax-absmin);
} return factor;
}
(2)PWM输出
PWM输出较为简单,关于TIM配置等网上有很多,在此不再多说。根据PID控制器的输出,我们计算PWM的占空比,通过占空比来调节阀门的开度,从而控制流量大小。
*阀门控制调节*/
void ControlProcess(void)
{
uint16_t TimerPeriod = ;
uint16_t PWMPulse = ;
float dutyfactor=0.0;//定义占空比 vPID.setpoint=aPara.phyPara.flowSetPoint;
PIDRegulation(&vPID, aPara.phyPara.flowMeasuredValue);
dutyfactor=vPID.result/ADC1HighRange; /*计算频率和占空比*/
TimerPeriod = PWMTimePeriod;//计算用于设置ARR寄存器的值使产生信号的频率为17.57 Khz
PWMPulse = (uint16_t) ((TimerPeriod - )*dutyfactor);//计算CCR1寄存器的值在通道1和1N产生50%占空比,用于TIM1 HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//停止PWM
PWM_TIM_Configuration(TimerPeriod,PWMPulse);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//启动PWM
}
3、测试结果
软件编写完成,硬件连接好后,运行并在线监控。PID控制器的调节速度还是比较快的,流量也比较稳定。如果进行细致的参数整定应该可以进一步提高控制效果。
STM32L476应用开发之七:流量的PID控制的更多相关文章
- 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码
说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...
- MVC5 网站开发之七 用户功能 1、角色的后台管理
角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...
- 两轮自平衡小车双闭环PID控制设计
两轮自平衡小车的研究意义 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- MVC5 网站开发之七 用户功能 2 用户添加和浏览
目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...
- MVC5 网站开发之七 用户功能 3用户资料的修改和删除
这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...
- SlimerJS – Web开发人员可编写 JS 控制的浏览器
SlimerJS 是一个提供给 Web 开发人员,可通过脚本编程控制的浏览器.它可以让你使用 Javascript 脚本操纵一个网页:打开一个网页,点击链接,修改的内容等,这对于做功能测试,页面自动机 ...
- 数字式PID控制的应用总结
PID控制是一个二阶线性闭环控制器,通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.PID控制优点:a. 技术成熟,b. 易被人们熟悉和掌握,c. 不需要建立数学模型 ...
- 李洪强iOS开发Swift篇—06_流程控制
李洪强iOS开发Swift篇—06_流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注 ...
随机推荐
- 开发mis系统需要的技术
一.b/s架构 b/s架构:就broser/server,浏览器/服务器的说法.服务器端要运行tomcat,提供链接数据库服务供java代码读写数据,这个可以在eclipse中配置运行.浏览器则解释j ...
- list vector map set (转)
List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]. Vector对于随机 ...
- [C++]PAT乙级1005. 继续(3n+1)猜想 (25/25)
/* 1005. 继续(3n+1)猜想 (25) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推 ...
- cocos2dx 3.3 笔记
ccs3 加入了 rapidjson ->一个JSON解析库https://github.com/miloyip/rapidjson
- RHEL 6.4 通过mysql安装文件安装mysql
参考文章:http://www.linuxidc.com/Linux/2013-12/93507.htm 1.首先下载mysql安装文件 我是下载的最新版的5.6 2. 以RPM方式安装MySQL 在 ...
- byte数组和int之间相互转化的方法
Java中byte数组和int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送者接收的数据都是byte数组,但是int类型是4个byte组成的,如何把一个整形in ...
- java Object类的公共方法
1.HashCode(); 2. wait(); 3. notify(); 4.equals(); 5.getClass(); 6.toString(); 7.clone(); 8.fin ...
- asyncio模块中的Future和Task
task是可以理解为单个coroutine,经过ensure_future方法处理而形成,而众多task所组成的集合经过asyncio.gather处理而形成一个future. 再不精确的粗略的说 ...
- 0326 iframe和video experience
今天的东西确实不少,很容易混淆,input下的属性太多,form下的属性也不少,内容多点,一时不能熟练掌握,晚上多拿出点时间练练 尤其是 form 和inpu那些属性格外别扭 下午的内嵌视频相对简单主 ...
- SuperDiamond在JAVA项目中的三种应用方法实践总结
SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...