Quantcast
Channel: Hercules™︎ 安全微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 775

PID

$
0
0
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的偏值差还是,计算后应该设置的值


Viewing all articles
Browse latest Browse all 775

Trending Articles