位置式:

1. 位置式:

pid.c:

float PID_calculate( float dT_s,            //周期(单位:秒)
float in_ff, //前馈值
float expect, //期望值(设定值)
float feedback, //反馈值()
_PID_arg_st *pid_arg, //PID参数结构体
_PID_val_st *pid_val, //PID数据结构体
float inte_d_lim,//积分误差限幅
float inte_lim, //integration limit,积分限幅
float err_lim //误差死区
)
{
float hz;
hz = safe_div(1.0f,dT_s,0);
pid_val->err = (expect - feedback); if( ( pid_val->err <= err_lim) && ( pid_val->err > 0 ) ) //误差死区
{
pid_val->err = 0;
}
else if( ( pid_val->err >= -err_lim) && ( pid_val->err < 0 ) )
{
pid_val->err = 0;
} pid_val->exp_d = (expect - pid_val->exp_old) *hz; if(pid_arg->fb_d_mode == 0)
{
pid_val->fb_d = (feedback - pid_val->feedback_old) *hz;
}
else
{
pid_val->fb_d = pid_val->fb_d_ex;
}
pid_val->differential = (pid_arg->kd_ex *pid_val->exp_d - pid_arg->kd_fb *pid_val->fb_d); pid_val->err_i += pid_arg->ki *LIMIT((pid_val->err ),-inte_d_lim,inte_d_lim )*dT_s;//)
pid_val->err_i = LIMIT(pid_val->err_i,-inte_lim,inte_lim);
pid_val->out = pid_arg->k_ff *in_ff
+ pid_arg->kp *pid_val->err
+ pid_val->differential
+ pid_val->err_i;
pid_val->feedback_old = feedback;
pid_val->exp_old = expect;
return (pid_val->out);
}

pid.h:

#define LIMIT( x,min,max ) ( ((x) <= (min)) ? (min) : ( ((x) > (max))? (max) : (x) ) )

typedef struct
{
int exp;
int fb;
int error;
int out;
} _ctrl_st; typedef struct
{
uint8_t fb_d_mode;
float kp; //比例系数
float ki; //积分系数
float kd_ex; //微分系数
float kd_fb; //previous_d 微分先行
// float inc_hz; //不完全微分低通系数
// float k_inc_d_norm; //Incomplete 不完全微分 归一(0,1)
float k_ff; //前馈 }_PID_arg_st; typedef struct
{
float err;
float exp_old;
float feedback_old; float fb_d;
float fb_d_ex;
float exp_d;
// float err_d_lpf;
float err_i;
float ff;
float pre_d; float out;
float differential;
}_PID_val_st; typedef struct
{
_ctrl_st *ctrl_st;
_PID_arg_st *arg_st;
_PID_val_st *val_st;
}_PID_DATA; float PID_calculate( float T, //周期
float in_ff, //前馈
float expect, //期望值(设定值)
float feedback, //反馈值
_PID_arg_st *pid_arg, //PID参数结构体
_PID_val_st *pid_val, //PID数据结构体
float inte_d_lim,
float inte_lim, //integration limit,积分限幅
float err_lim //误差死区
); //输出

使用:

static _PID_arg_st arg_st;//实例化
static _PID_val_st val_st;//实例化
static _ctrl_st ctrl_st;//实例化
arg_st->kp = 1.2f;
arg_st->ki = 3.2f;
arg_st->kd_fb = 0.05f;

PID控制_位置式的更多相关文章

  1. 位置式PID与增量式PID算法

    位置式PID与增量式PID算法  PID控制是一个二阶线性控制器     定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.     优点             ...

  2. PID控制

    PID解释: 位置式:      可以看出,比例部分只与当前的偏差有关,而积分部分则是系统过去所有偏差的累积.位置式PI调节器的结构清晰,P和I两部分作用分明,参数调整简单明了.但直观上看,要计算第拍 ...

  3. 数字式PID控制的应用总结

    PID控制是一个二阶线性闭环控制器,通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.PID控制优点:a. 技术成熟,b. 易被人们熟悉和掌握,c. 不需要建立数学模型 ...

  4. 经典PID控制及应用体会总结

    经典PID控制及应用体会总结 PID控制原理 PID是一种线性控制器,它根据给定值rin(t)与实际输出值yout(t)构成控制方案: 重点关注相关算法是如何对偏差进行处理的: PID控制器各校正环节 ...

  5. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...

  6. 【转】位置式、增量式PID算法C语言实现

    位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...

  7. 增量式pid和位置式PID参数整定过程对比

    //增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...

  8. 位置式PID与增量式PID

    //位置式PID float Kp; float Ki; float Kd; float eSum,e0,e1; float pid_control(float now,float target) { ...

  9. 位置式PID讲解

    table { margin: auto } 一.公式拆解 \(PID\)公式展示: \[u(t)=K_p(e(t)+\frac{1}{T_t } ∫_0^te(t)dt+T_D \frac {de( ...

  10. SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

随机推荐

  1. labuladong

    由于 labuladong 的算法网站频繁被攻击,且国内访问速度可能比较慢,所以本站同时开放多个镜像站点: https://labuladong.gitee.io/algo/ https://labu ...

  2. 关于解决Failed on cp file to /system - Cross-device link 报错

    前言 在adb shell中移动 android_server时候遇到了这个报错 解决办法 采用 cp 命令代替 mv 命令

  3. 关于python函数传参

    必须参数 最常见的传参 def say(arg): print(arg) say("Hello world") 输出: Hello world 默认参数 def say(arg, ...

  4. day29-JQuery02

    JQuery02 4.jQuery选择器02 4.3过滤选择器 4.3.1基础过滤选择器 $("li:first") //第一个li $("li:last") ...

  5. 关于Qt的QPixmap中不支持jpg文件格式的问题

    问题 Qt部分版本存在不支持jpg,JPEG等图像格式的问题 qDebug()<<QImageWriter::supportedImageFormats(); 这行代码可以查看所支持的图像 ...

  6. Java基础知识篇【gitee】

    https://snailclimb.gitee.io/javaguide 一.Java基本功 Java一次编译,字节码通过JVM,处处运行jsp会转化为servlet,也要由jdk编译OracleJ ...

  7. MyBatis详解(二)

    前言 本篇幅是继 MyBatis详解(一)的下半部分. MyBatis执行Sql的流程分析 [1]基于前面已经将XML文件进行build解析了并且返回了SqlSessionFactory [1.1]那 ...

  8. Mybatis源码解析之执行SQL语句

    作者:郑志杰 mybatis 操作数据库的过程 // 第一步:读取mybatis-config.xml配置文件 InputStream inputStream = Resources.getResou ...

  9. 二阶段目标检测网络-Mask RCNN 详解

    ROI Pooling 和 ROI Align 的区别 Mask R-CNN 网络结构 骨干网络 FPN anchor 锚框生成规则 实验 参考资料 Mask RCNN 是作者 Kaiming He ...

  10. C/C++随堂笔记

    注释:行注释 块注释: (1)#if 0 #endif (2)/*     */ <>:表示系统文件 <stdlib.h>+syetem 调用windows中的程序 QT中 c ...