
具体如下:
1、如果加入D抖动的特别厉害,试试只用PI控制。
2、还有PID参数都是一步一步调出来的,我建议你做个上位机,就是个简单的VB串口程序,用来设置PID参数
3、然后在单片机这边弄个串口接收程序,这里就是个简单的串口程序,人人都会,把接收到的PID存储在缓冲区里。
4、然后单片机程序直接调用。单片机带EEPROM的话,当接收到改变的PID参数时,存储这些参数。去STC官网下你的单片机资料,上面有EEPROM测试程序,直接套用。
#include <stdlib.h>#include "global_varible.h"
/****************************************************************************
* 模块名: PID
* 描述: PID调节子程序
* 采用PID-PD算法。在偏差绝对值大于△e时,用PD算法,以改善动态品质。
* 当偏差绝对值小于△e时,用PID算法,提高稳定精度。
* PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
* 入口: 无
* 出口: 无
* 改变: PID_T_Run=加热时间控制
*****************************************************************************/
void PID_Math(void)
{
signed long ee1 //偏差一阶
//signed long ee2 //偏差二阶
signed long d_out //积分输出
if(!Flag_PID_T_OK)
return
Flag_PID_T_OK=0
Temp_Set=3700 //温度控制设定值37.00度
PID_e0 = Temp_Set-Temp_Now //本次偏差
ee1 = PID_e0-PID_e1 //计算一阶偏差
//ee2 = PID_e0-2*PID_e1+PID_e2 //计算二阶偏差
if(ee1 >500) //一阶偏差的限制范围
ee1 = 500
if(ee1 <-500)
ee1 = -500
PID_e_SUM += PID_e0 //偏差之和
if(PID_e_SUM >200) //积分最多累计的温差
PID_e_SUM = 200
if(PID_e_SUM <-200)
PID_e_SUM = -200
PID_Out = PID_kp*PID_e0+PID_kd*ee1 //计算PID比例和微分输出
if(abs(PID_e0) <200) //如果温度相差小于1.5度则计入PID积分输出
{
if(abs(PID_e0) >100) //如果温度相差大于1度时积分累计限制
{
if(PID_e_SUM >100)
PID_e_SUM = 100
if(PID_e_SUM <-100)
PID_e_SUM = -100
}
d_out = PID_ki*PID_e_SUM //积分输出
if(PID_e0 <-5) //当前温度高于设定温度0.5度时积分累计限制
{
if(PID_e_SUM >150)
PID_e_SUM = 150
if(PID_e_SUM >0) //当前温度高于设定温度0.5度时削弱积分正输出
d_out >>= 1
}
PID_Out += d_out //PID比例,积分和微分输出
}
else
PID_e_SUM=0
PID_Out/=100 //恢复被PID_Out系数放大的倍数
if(PID_Out >200)
PID_Out=200
if(PID_Out<0)
PID_Out=0
if(PID_e0 >300) //当前温度比设定温度低3度则全速加热
PID_Out=200
if(PID_e0 <-20) //当前温度高于设定温度0.2度则关闭加热
PID_Out=0
Hot_T_Run=PID_Out //加热时间控制输出
PID_e2 = PID_e1 //保存上次偏差
PID_e1 = PID_e0 //保存当前偏差
}
////////////////////////////////////////////////////////////void PID_Math() end.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)