|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 小伤口 于 2022-4-3 21:54 编辑
什么是PID
PID 是一种经典的控制算法
P-比例(proportional)、I-积分(integral)、D-微分(derivative)
PID控制的实质就是对目标值和实际值误差进行比例、积分、微分运算后的结果用来作用在输出上。
为什么要使用PID算法
以小车为例,相同的占空比在经过小车运行一段时间后,会变慢,因为电压相比之前降低了,虽然占空比没有变化
但随着电压降低,电机的电压也会随着降低,速度自然就变慢了,因此,我们需要在电压降低的同时,增大占空比,提高作用在
电机的电压从而维持小车的速度,但是增大多少占空比呢,这时就需要用到 PID 算法了
关于PID的比例,积分,微分详解,网上已经有许多资料,这里不再做解释
位置式PID 代码
先声明一个PID结构体
- typedef struct
- {
- float kp; //P
- float ki; //I
- float kd; //D
- float out_p; //KP输出
- float out_i; //KI输出
- float out_d; //KD输出
- float out; //pid输出
- float integrator; //< 积分值
- float last_error; //< 上次误差
- }pid_param_t;
复制代码
PID 实现代码
- /*************************************************************************
- * 函数名称:float constrain_float(float amt, float low, float high)
- * 功能说明:pid位置式控制器输出
- * 参数说明:
- * @param pid pid结构体
- * @param error pid输入误差
- * 函数返回:PID输出结果
- * 修改时间:2022年3月18日
- * 备 注:
- *************************************************************************/
- float PidLocCtrl(pid_param_t * pid, float error)
- {
- /* 累积误差 */
- pid->integrator += error;
-
- pid->out_p = pid->kp * error;
-
- pid->out_i = pid->ki * pid->integrator;
-
- pid->out_d = pid->kd * (error - pid->last_error);
- pid->last_error = error;
- pid->out = pid->out_p + pid->out_i + pid->out_d;
- return pid->out;
- }
复制代码
|
评分
-
查看全部评分
|