位置式:

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. 「工具推荐」golang 代码可视化工具 go-callvis

    「工具推荐」go-callvis go-callvis是相对 以图片的形式展示了go程序的调用关系,这个工具在看复杂项目时尤其有用. 亲测,借助它看祖传golang代码,头痛好多了. 安装 go ge ...

  2. tp6 requset获取参数的方式

    第一种:获取全部参数的值 request()->param() 1 第二种:获取排除某些字段的值,即获取其他值 request()->except(['serverToken','logi ...

  3. EASE-Grid经纬度与行列号转换公式 以 25KM的HDF数据为例

    /// <summary> /// 把经纬度转换成行列号 /// </summary> /// <param name="pLng"></ ...

  4. day08 final关键字&面向对象——多态&抽象类、方法&向上、向下转型

    day08 final关键字 最终的不可更改的 特点: 1)修饰类,类不能被继承 2)修饰方法,方法不能被重写 3)修饰成员变量(变为常量),值不能修改,名字大写,声明同时给常量赋值 main方法中 ...

  5. 基于 RocketMQ 的 Dubbo-go 通信新范式

    本文作者:郝洪范 ,Dubbo-go Committer,京东资深研发工程师. 一.MQ Request Reply特性介绍 什么是 RPC 通信? 如上图所示,类似于本地调用,A 服务响应调用 B ...

  6. 【每日一题】【栈】2022年2月2日-NC40 两个链表生成相加链表

    描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 答案:栈 import java.util.*; /* ...

  7. MySQL 性能压测工具-sysbench,从入门到自定义测试项

    sysbench是一个开源的.基于LuaJIT(LuaJIT 是 Lua 的即时编译器,可将代码直接翻译成机器码,性能比原生 lua 要高) 的.可自定义脚本的多线程基准测试工具,也是目前用得最多的 ...

  8. 虚拟网络VLAN

    一.VLAN划分基础 1.VLAN概念 VLAN叫做虚拟局域网,逻辑上将网络划分 2.VLAN的分类 静态vlan:基于端口划分静态VLAN 动态vlan:基于MAC地址划分动态VLAN 3.VLAN ...

  9. STM32与PS2的无线通信和相关函数介绍

    PS2采用SPI通信协议 源码和参考文件获取:https://github.com/Sound-Sleep/PS2_Based_On_STM32 接收器接口 DI:手柄->主机,时钟的下降沿传送 ...

  10. 精华推荐 |【深入浅出Sentinel原理及实战】「原理探索专题」完整剖析Alibaba微服务架构体系之轻量级高可用流量控制组件Sentinel(1)

    Sentinel是什么?不要概念混淆啊! 注意:本Sentinel与Redis服务Sentinel是两回事,压根不是一个概念,请大家不要混肴. Alibaba的Sentinel Sentinel是由阿 ...