void PID_Operation(void) { uInt32 Temp[3] = {0}; //中间临时变量 uInt32 PostSum = 0; //正数和 uInt32 NegSum = 0; //负数和 if(PID.iSetVal > PID.iCurVal) //设定值大于实际值否? { if(PID.iSetVal - PID.iCurVal > 10) //偏差大于10否? PID.iPriVal = 100; //偏差大于10为上限幅值输出(全速加热) else //否则慢慢来 { Temp[0] = PID.iSetVal - PID.iCurVal; //偏差<=10,计算E(k) PID.uEkFlag[1] = 0; //E(k)为正数,因为设定值大于实际值 /* 数值进行移位,注意顺序,否则会覆盖掉前面的数值 */ PID.liEkVal[2] = PID.liEkVal[1]; PID.liEkVal[1] = PID.liEkVal[0]; PID.liEkVal[0] = Temp[0]; /* =================================================================== */ if(PID.liEkVal[0] > PID.liEkVal[1]) //E(k)>E(k-1)否? { Temp[0] = PID.liEkVal[0] - PID.liEkVal[1]; //E(k)>E(k-1) PID.uEkFlag[0] = 0; //E(k)-E(k-1)为正数 } else { Temp[0] = PID.liEkVal[1] - PID.liEkVal[0]; //E(k)<E(k-1) PID.uEkFlag[0] = 1; //E(k)-E(k-1)为负数 } /* =================================================================== */ Temp[2] = PID.liEkVal[1] * 2; //2E(k-1) if((PID.liEkVal[0] + PID.liEkVal[2]) > Temp[2]) //E(k-2)+E(k)>2E(k-1)否? { Temp[2] = (PID.liEkVal[0] + PID.liEkVal[2]) - Temp[2]; PID.uEkFlag[2]=0; //E(k-2)+E(k)-2E(k-1)为正数 } else //E(k-2)+E(k)<2E(k-1) { Temp[2] = Temp[2] - (PID.liEkVal[0] + PID.liEkVal[2]); PID.uEkFlag[2] = 1;
时间: 2024-04-15 07:24:16 浏览: 152
这段代码是一个简单的PID控制器的实现。在PID_Operation函数中,它计算出偏差值(PID.iSetVal - PID.iCurVal),然后根据偏差的大小设置输出值。如果偏差大于10,输出值被设置为100,否则根据偏差的大小慢慢调整输出值。
接下来,它使用一个临时变量Temp[0]来计算偏差的变化量E(k)。根据E(k)与E(k-1)的大小关系,设置一个标志位PID.uEkFlag[0]来表示偏差的正负性。
然后,它计算E(k-2)+E(k)的值,并与2E(k-1)进行比较。根据比较结果,设置一个标志位PID.uEkFlag[2]来表示E(k-2)+E(k)-2E(k-1)的正负性。
总的来说,这段代码实现了一个简单的PID控制器,用于根据设定值和实际值之间的偏差来调整输出值,以达到控制系统稳定的目的。
阅读全文