温控器PID调节记录及注意事项

本文分享了作者在调试三路温控器过程中遇到的问题及解决思路,特别是针对PID参数调整耗时长的问题,通过引入积分分离等技巧,最终实现了较好的温度控制效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去年导师给公司做的三路温控器让我搞的,匆匆忙忙就交差了直到现在反应出了一些问题我也搞了两天。感觉调PID参数太耗时间了,现在改进之后,超调量1度,误差正负0.5度。之前的问题是存在4度的静态偏差,尤其是在温控设定值三十多度四十度时比较明显。PID程序是直接用师兄的复制粘贴过来的,去年调的时候没加积分项原因是加了积分项之后根本就控制不起来了。由于当时比较赶也没有深究,五十度时控制效果很好就也没试验其它值就交差了。

加积分项就控制不了这个问题我想了一晚上,直到早上我醒了有了思路。那就从最根本的开始分析:

1、

                                         fout1 = PIDCalc(&stPID1,ActualTemper1); //PID 计算
					 if( fout1 > 0 )
					 {
					 	if( RunFlag ==1 )					 	
					 	DoB = 0;              //控制相应的继续加热 
					 }
					 else if( fout1 <= 0 )
					 {
					 	if( RunFlag ==1 )
					 	DoB = 1;					   //相应加热器停止加热
					 }
说明了这个PID计算的值一直是小于零的。可是为什么小于零呢?来看一下PIDCalc();这个函数

float PIDCalc( PID *pp, float NextPoint )
{
	float xdata dError,Error; 

	dError = pp->LastError - pp->PrevError; // 当前微分 
	pp->PrevError = pp->LastError; 
	pp->LastError = Error; 

	return (pp->Proportion * Error//比例
	+ pp->Integral * pp->SumError* 0.01  //积分项
	+ pp->Derivative * dError); //   微分项
	
}
其中返回值是三个数相加的,Error、dError这两个值是确定的可以计算出来的,而SumError是多少呢?初始值根本就不知道,所以问题就在于没有初始化,初始化,初始化。这个一定要记住喽局部变量不初始化就是任意值,定义变量时最好带着初始化了。

初始化之后果然好使了。但是系统震荡明显且振幅大。于是开始调PID的过程了。参考了一位前辈的经验点击打开链接。其中他的那个模型特别好,直接带入计算设定值。效果还是不错的。不过,当设定温度与实际温度相差较大时控制效果很不好。于是加入积分分离,只有当靠近设定温度时才引入积分项。

float PIDCalc( PID *pp, float NextPoint )
{
	float xdata dError,Error; 
	unsigned char index;
	Error = pp->SetPoint - NextPoint; // 偏差 
	if(abs(Error)<5)
	{
		pp->SumError += Error; // 积分
		index = 1;
	}	
	else
	{
		index = 0;
	}					//积分分离,防止大幅度增减设定导致积分项一直累加,引起较大超调

	dError = pp->LastError - pp->PrevError; // 当前微分 
	pp->PrevError = pp->LastError; 
	pp->LastError = Error; 

	return (pp->Proportion * Error//比例
	+ pp->Integral * pp->SumError*index * 0.01  //积分项
	+ pp->Derivative * dError); //   微分项
	
}

就是说,遇到了问题不要慌不要烦从最根本的问题去分析。

### 关于PID温控继电反馈自程序的实现 #### 背景介绍 PID控制器是一种广泛应用的闭环控制系统,其核心在于通过比例(P)、积分(I)和微分(D)三个部分来调输出值以达到期望的目标值。对于温度控制应用而言,PID参数的选择至关重要,因为不恰当的参数可能导致系统不稳或响应迟缓。 在实际工程中,手动调参往往耗时且效率低下,因此引入了**PID技术**。其中一种常见的方法是基于**继电反馈法**的自算法[^2]。这种方法通过对被控对象施加周期性的方波激励信号,并记录系统的动态响应特性,从而推导出适合该系统的PID参数。 --- #### 继电反馈自原理概述 继电反馈自的核心思想是在系统中加入一个具有固振幅的正弦或者矩形脉冲作为输入信号,使受控过程进入极限环状态。当检测到稳的震荡发生后,可以利用这些数据估算出时间常数 \(T_n\) 和增益系数 \(K_\mu\) ,进而按照特的经验公式计算所需的PID参数: | 控制器类型 | K | \(T_n\) | \(T_v\) | Ki | Kd | |------------|-------|---------------|--------------|------------|-----------| | P | \(0.5 \cdot K_\mu\) | —— | —— | —— | —— | | PD | \(0.8 \cdot K_\mu\) | —— | \(0.12 \cdot T_\mu\) | —— | —— | | PI | \(0.45 \cdot K_\mu\) | \(0.85 \cdot T_\mu\) | —— | \(K_P / T_n\) | —— | | PID | \(0.6 \cdot K_\mu\) | \(0.5 \cdot T_\mu\) | \(0.12 \cdot T_\mu\) | \(K_P / T_n\) | \(K_P \cdot T_n\) | 表中的经验公式提供了不同类型的控制器对应的参数配置方式[^4]。 --- #### 实现步骤详解 以下是基于继电反馈法的一个典型实现框架,具体代码逻辑如下所示: ```c #define Auto_PID 1 // 设置为1表示启用自动模式 if (Auto_PID) { AC_EN_Open(); // 开启加热回路 // 显示当前通道温度 SetTextFloat(Page_13, 16, (Start == 124) ? PT100_Temp1 : PT100_Temp2, 1, 1); // 执行指通道的PID操作 Handle_PID_AT((Start == 124) ? 1 : 2); // 判断自是否完成 if (PID_AutoTune.State == STATE_End) { Start = 0; PID_AutoTune.State = 0; switch (Auto_PID) { case 1: PID1.kp = PID_AutoTune.Proportion; // 获取比例项 PID1.ki = PID_AutoTune.Integration; // 获取积分PID1.kd = PID_AutoTune.Differentiation; // 获取微分项 break; } } HAL_IWDG_Refresh(&hiwdg); // 喂狗机制防止看门狗复位 HAL_Delay(500); // 短暂延时 } ``` 上述代码片段展示了如何在一个主循环中集成PID功能[^3]。需要注意的是,在执行自时应暂时禁用手动PID调节模块以免干扰测量结果。 --- #### 注意事项 1. **硬件条件**: 需要具备能够精确采集温度传感器数据的能力以及支持快速切换功率输出的驱动电路。 2. **软件优化**: 应考虑实时性和稳性问题,合理安排任务优先级并采用适当的时间间隔刷新变量。 3. **安全防护**: 加热过程中需增加过温保护措施以防意外损坏设备。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值