inline void PID_run(PID_Handle pidHandle,const float32_t refValue,const float32_t fbackValue,float32_t *pOutValue) { PID_Obj *pid = (PID_Obj *)pidHandle; float32_t Error; // PID internal variables float32_t Up; float32_t Ui; uint32_t index; // Index value returned by arm min/max f32 functions uint32_t blocksize = 2; // Block size for min/max value calculation float32_t minArg[2]; // Arguments for min function float32_t maxArg[2]; // Arguments for max function float32_t maxValue; // Output of min function float32_t minValue; // output of max function // Update proportional output Error = refValue - fbackValue; Ui = pid->Ui; // load the previous integral output Up = (pid->Kp * Error); // Compute the proportional output // Compute the integral output with saturation // Handle saturation minimum bound condition minArg[0] = (Ui + (pid->Ki * Up)); minArg[1] = pid->outMax; arm_min_f32(minArg,blocksize,&minValue,&index); // Handle saturation maximum bound condition maxArg[0] = minValue; maxArg[1] = pid->outMin; arm_max_f32 (maxArg,blocksize,&maxValue,&index); Ui = maxValue; pid->Ui = Ui; // store the intetral output pid->refValue = refValue; pid->fbackValue = fbackValue; // Saturate the output // Handle saturation minimum bound condition minArg[0] = Up + Ui; minArg[1] = pid->outMax; arm_min_f32(minArg,blocksize,&minValue,&index); // Handle saturation maximum bound condition maxArg[0] = minValue; maxArg[1] = pid->outMin; arm_max_f32 (maxArg,blocksize,&maxValue,&index); *pOutValue = maxValue; return; } // end of PID_run() function
这段PID程序云行结束后输出的,是与refValue的偏值差还是,计算后应该设置的值