|
//由于要在16K的单片机里面存储8种热电偶,加两种热电阻的分度表。所以只能采用函数拟合方式。由于3次拟合精度不够,分段的话也会导致数据庞大,就拟合成5阶了。pt100,cu50热电阻线性是比较好的,完全可以不用拟合成5阶,但是为了统一处理,都拟合成5阶了
float code TC_Atab[11]={-7.5997e-7,9.6322e-8,4.8472e-4,7.3225e-4,2.4515e-3,1.3651e-7,9.9154e-5,2.8055e-6,-1.2878e-11,-1.0896e-9,205.65};
// K J R S B E T N Pt100 cu50, B<600
float code TC_Btab[11]={1.0905e-4,8.7504e-6,-2.8158e-2,-3.6447e-2,-0.11385,-3.3295e-5,-4.9932e-3,-4.1148e-4,1.5932e-8,3.2617e-7,-1037.8};
// K J R S B E T N, Pt100 cu50 0 B<600
float code TC_Ctab[11]={-3.9325e-3,2.0766e-3,0.65866,0.73075,2.2226,3.3864e-3,9.3174e-2,2.4892e-2,-6.1794e-6,-6.751e-5,1970.3};
// K J R S B E T N, Pt100 cu50 B<600
float code TC_Dtab[11]={0.017394,0.062995,-8.4431,-8.1816,-23.776,-0.17164,-0.98715,-0.76438,2.1231e-3,7.6826e-3,-1796};
// K J R S B E T N, Pt100 cu50 B<600
float code TC_Etab[11]={24.75,17.726,136.69,140.41,228.37,16.637,25.774,37.309,2.2614,4.2719,1047};
// K J R S B E T N Pt100 cu50 B<600
float code TC_Ftab[11]={-0.55944,3.457,11.693,9.6808,256.77,0.6252,1.3639,1.2499,-242.75,-226.06,60.546};
// K J R S B E T N, Pt100 cu50 B<600
//由于B型热电偶函数特殊,非线性很大,拟合分为了两段,小于600摄氏度一段,大于600摄氏度一段
//--------------------------------------------------------------------------------------------------------------------------
float code TCt_vA[8]={1.75e-5,2.5e-5,1.1786e-5,1.0893e-5,5.0714e-6,4.5179e-5,4.1607e-5,1.8214e-5};//温度补偿方程
// K J R S B E T N
float code TCt_vB[8]={0.039574,0.05045,5.3364e-3,5.4411e-3,-1.8929e-4,0.058678,0.038611,0.025889};
// K J R S B E T N
float code TCt_vC[8]={-2.1429e-4,-2.0125e-16,-2.1429e-4,-1.7859e-4,-0.00066,-3.5714e-5,0.00025,7.1429e-5};
// K J R S B E T N
float TCRTD(float res,unsigned char type)
/*热电偶与热电偶温度转换函数,输入:res(热电偶电压:单位mv或者热点阻电阻值:单位欧姆),type(输入0-9分别对应KJRSBETNPt100Cu50,10对应B型热电偶小于600摄氏度的方程),输出:当前温度;*/
{
return (TC_Atab[type]*res*res*res*res*res+TC_Btab[type]*res*res*res*res+TC_Ctab[type]*res*res*res+TC_Dtab[type]*res*res+TC_Etab[type]*res+TC_Ftab[type]);
}
float TCt_v(float t,unsigned char type)
//热电偶的冷端补偿方程,输入为t(热电偶冷端温度),type(输入0-7分别对应热电偶KJRSBETN)
{
return (TCt_vA[type]*t*t+TCt_vB[type]*t+TCt_vC[type]);
}
以上两个方程就是温度转换方程和冷端补偿的方程;
/***************************************************************************************************************************************/
/***************************************************************************************************************************************/
下面针对pid参数的调试做了一下实验:
温度采集采用pt100,通过vf转换得到电阻代入方程求得温度。
采用可控硅移相触发。交流过零检测送外部中断0,提供相位同步,一秒钟触发一次。把正弦波一个周期20ms分为两个50等分的时间,移相触发(不是采用的50等分的等功率移相触发,等功率移相触发要复杂很多,还要查表,所以没做)。AD采样时间162ms,pid计算周期3s。pid输出为0-999,对应可控硅移相0-50等份来控制。
可控硅控制的是一个75W的电烙铁来加热一个铁块。
采用积分分离pid位式算法,pid控制代码:
void pid()
{
error0=sv_temp-temperature; //当前误差
if(error0<30&&error0>-30)//积分,以及积分分离
{
errorsum+=error0; //积分
Ki=3*(pid_P/(float)pid_I);
}
else
{
Ki=0;
errorsum=0;
}
pidout=pid_P*error0+Ki*errorsum+pid_P*(pid_D/3)*(error0-error1);
error1=error0;
if(pidout>999)
pidout=999;
else
if(pidout<0)
pidout=0;
}
调试pid参数,首先屏蔽Ki和Kd只剩下Kp,调试系统,使系统输出一个等幅振荡。
Kp=15时;
Kp为15时的温度曲线 (原文件名:P15.png) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|