CSI-DSP  Version 1.0.0
CSI DSP Software Library
函数
PID电机控制

函数

float32_t csky_pid_f32 (csky_pid_instance_f32 *S, float32_t in)
 浮点PID控制的处理函数. 更多...
 
void csky_pid_init_f32 (csky_pid_instance_f32 *S, int32_t resetStateFlag)
 浮点PID控制的初始化函数 更多...
 
void csky_pid_init_q15 (csky_pid_instance_q15 *S, int32_t resetStateFlag)
 Q15 PID控制初始化函数 更多...
 
void csky_pid_init_q31 (csky_pid_instance_q31 *S, int32_t resetStateFlag)
 Q31 PID控制的初始化函数. 更多...
 
q15_t csky_pid_q15 (csky_pid_instance_q15 *S, q15_t in)
 Q15 PID控制的处理函数. 更多...
 
q31_t csky_pid_q31 (csky_pid_instance_q31 *S, q31_t in)
 Q31 PID控制的处理函数. 更多...
 
void csky_pid_reset_f32 (csky_pid_instance_f32 *S)
 浮点PID控制重置函数 更多...
 
void csky_pid_reset_q15 (csky_pid_instance_q15 *S)
 Q15 PID控制重置函数. 更多...
 
void csky_pid_reset_q31 (csky_pid_instance_q31 *S)
 Q31 PID控制重置函数. 更多...
 

简要说明

比例积分微分 (PID) 控制器是一种通用的反馈环控制机制, 广泛应用在工业控制系统中。 PID控制器是最常见的反馈控制器类型.

为Q15,Q31,浮点类型实现了不同的PID控制器的函数。 函数每次只操作一个样本数据,并返回一个处理结果 S 指向一个PID控制数据结构的实例. in 是输入的样本数据,函数返回输出结果。

算法:
   y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
   A0 = Kp + Ki + Kd
   A1 = (-Kp ) - (2 * Kd )
   A2 = Kd  
其中 Kp 是比例常数, Ki 是积分常数, Kd 是微分常数
PID.gif
比例积分微分控制器
PID控制器计算测量输出和参考输入之间的差值作为“误差”值。 控制器会通过调节控制输入,来最小化“误差”值。 比例值决定对当前误差反应的程度, 积分值根据最近累积的“误差”和做反应, 微分值对“误差”变化的速率做反应。
结构体实例
PID控制器的增益A0, A1, A2 和状态变量都保存在数据结构实例中。 每个PID控制都必须定义一个单独结构体实例。 为支持的Q15,Q31和浮点这三种不同数据类型,分别提供了结构体实例的定义。
重置函数
也为不同的数据类型提供了不同的重置函数,用来清除状态.
初始化函数
为不同的数据类型提供了相关的初始化函数。 初始化函数处理以下操作:
  • 根据Kp,Ki,Kd增益,初始化A0, A1, A2 增益.
  • 清零状态buffer中的值.
结构体实例不能放进只读数据段,推荐用初始化函数处理。
定点行为
使用定点数版本的PID控制器函数时必须注意、 特别是,在每个函数中使用的累加器的溢出和饱和行为,必须考虑到。 参考特定函数的特定使用文档。

函数说明

float32_t csky_pid_f32 ( csky_pid_instance_f32 S,
float32_t  in 
)
参数
[in,out]S浮点PID控制结构的实例
[in]in输入处理的样本
返回
输出的样本处理结果.
void csky_pid_init_f32 ( csky_pid_instance_f32 S,
int32_t  resetStateFlag 
)

浮点PID控制初始化函数.

参数
[in,out]*S指向一个PID结构体实例
[in]resetStateFlag重置状态的标志位. 0 = 不改变状态; 1 = 重置状态.
返回
none.
Description:
resetStateFlag 指定是否重置状态为0.
函数使用比例增益( Kp), 积分增益( Ki) 和微分增益( Kd)计算结构体字段: A0, A1 A2 , 并且将状态变量全部置为0.
void csky_pid_init_q15 ( csky_pid_instance_q15 S,
int32_t  resetStateFlag 
)

Q15 PID控制的初始化函数

参数
[in,out]*S指向一个Q15 PID结构体实例
[in]resetStateFlag重置状态的标志位. 0 = 不改变状态;1 = 重置状态.
返回
none.
Description:
resetStateFlag 指定是否重置状态为0.
函数使用比例增益( Kp), 积分增益( Ki) 和微分增益( Kd)计算结构体字段: A0, A1 A2 , 并且将状态变量全部置为0.
void csky_pid_init_q31 ( csky_pid_instance_q31 S,
int32_t  resetStateFlag 
)

Q31 PID控制初始化函数

参数
[in,out]*S指向一个Q15 PID结构体实例
[in]resetStateFlag重置状态的标志位. 0 = 不改变状态;1 = 重置状态
返回
none.
Description:
resetStateFlag 指定是否重置状态为0.
函数使用比例增益( Kp), 积分增益( Ki) 和微分增益( Kd)计算结构体字段: A0, A1 A2 , 并且将状态变量全部置为0.
q15_t csky_pid_q15 ( csky_pid_instance_q15 S,
q15_t  in 
)
参数
[in,out]SQ15 PID控制结构的实例
[in]in输入处理的样本
返回
输出的样本处理结果.

缩放和溢出时的行为:

函数实现中使用了一个内部的64位累加器。 增益和状态变量都是1.15格式表示,相乘的结果是2.30格式。 2.30格式的中间结果在64位累加器上累加为34.30格式。 这种方式没有内部溢出的风险,并且能保存所有的中间结果的精度。 在累加完后,累加器将低15位截断为34.15格式。 最后,累加器做饱和处理,得到1.15格式的结果。
q31_t csky_pid_q31 ( csky_pid_instance_q31 S,
q31_t  in 
)
参数
[in,out]SQ31 PID控制结构的实例
[in]in输入处理的样本
返回
输出的样本处理结果.

缩放和溢出时的行为:

函数实现中使用了一个内部的64位累加器。 累加器使用2.62 格式,维护了中间乘法结果的完整精度,但是只提供了一个守护位。 因此,累加器的结果如果溢出会折回(覆盖掉符号位)。 由于总共有四个数相加,为了防止完全异常(连续溢出两个位),输入信号必须向下缩放两个位。 在所有的乘法结果相加后,2.62格式的累加器截断为1.32的格式,然后再饱和成1.31的格式。
void csky_pid_reset_f32 ( csky_pid_instance_f32 S)
参数
[in]*SPID控制数据结构实例
返回
none.
Description:
函数重置状态buffer为0
void csky_pid_reset_q15 ( csky_pid_instance_q15 S)
参数
[in]*SPID控制数据结构实例.
返回
none.
Description:
函数重置状态buffer为0.
void csky_pid_reset_q31 ( csky_pid_instance_q31 S)
参数
[in]*SPID控制数据结构实例.
返回
none.
Description:
函数重置状态buffer为0.