本帖最后由 caijie001 于 2018-6-12 19:53 编辑
可以串联PID和并联PID,用面向对象封装的,可以一个程序多个PID控制器,里面的仿真是proteus 8.7 sp3
电路图:
主要代码以及使用说明: /********************************
首先,怎么确定计算周期,大概是系统,我从输出控制到上升到输出控制的60%-80%之间的时间(可以视系统不同而调节)
如有系统需要及时响应那么要求数字PID控制器接近模拟PID,这个时候就需要根据采样定理去确定周期。大概是频率的两倍以上。
但是采样计算周期越小,CPU负载大,所以根据自己的系统去取。大部分一般取我上面说的就够了。
eg:举例子:加热器:我输出一个控制比如是X,经过无限长的时间,温度停留在Y,那么大概是取温度上升到0.6Y-0.8Y的这个时间,
由于有些系统非线性程度很高是幂函数的变化,这个时候,要达到最好的控制效果,我会增加计算的时间间隔
确定Kp,Ki,Kd,一般用不到Kd就可以有很好的控制效果,Kd我一般用于有大滞后的系统,例如控制温度,
Kd可以在温度还没有到达设置值的时候就减少控制输出
首先,把Ki,Kd设置成0,不断加大Kp直到产生振荡,作为启振点,
然后:Ki慢慢加,加到开始振荡,取其80%-90%
如果系统控制严重滞后,慢慢的增加Kd的值,使得第一次超调和第二次的峰比4比1是最理想的
PID完整离散公式:OUT = kp * error + (ki * T)/Ti * (求和符号)error + kd *Td/T * (的他)error
T:PID计算采样周期,Ti,积分时间 Td 微分时间 error采样和期望值的差 (求和符号)error 累积的error
(的他)error 两次error的差
理想情况,三到5个调整周期即收敛。比如这个PID系统,在可控范围内,一般15秒到25秒即可收敛到期望值
串级PID关键,内环调3-5周期,外环调一次
*********************************/
new_PID(&adout,&input,&output,&set,1.4,0.1,0,P_ON_E,DIRECT);//正常模式,正相关
PID_Initialize(&adout);//初始化
PID_SetMode(&adout,AUTOMATIC);//自动计算模式
PID_SetSampleTime(&adout,1000);//设置PID计算周期为5000ms
while(1)
{
input = (double)Roll_Number;//采样转速周期
if(PID_Compute(&adout) == true)//大概五次采样计算一次
{
PWM = (uint8_t)output;
}
// if((millis() - task) >= 20000)
// {
// set >= 200 ? (set = 0) : (set += 10);
// task = millis();
// }
}
PID.zip
(103.05 KB)
库.zip
(18.17 MB)
|