pid算法函数实现,c语言版
#include <stdio.h>
float pid(float setpoint, float process_variable, float kp, float ki, float kd, float dt, float* integral, float* last_error) {
// Calculate error
float error = setpoint - process_variable;
// Calculate integral
*integral += error * dt;
// Calculate derivative
float derivative = (error - *last_error) / dt;
// Calculate output
float output = kp * error + ki * (*integral) + kd * derivative;
// Save variables for next iteration
*last_error = error;
return output;
}
int main() {
// Initialize variables
float setpoint = 10.0;
float process_variable = 0.0;
float kp = 1.0;
float ki = 0.1;
float kd = 0.5;
float dt = 0.1;
float integral = 0.0;
float last_error = 0.0;
// Run PID loop
for (int i = 0; i < 100; i++) {
// Get process variable (e.g. from a sensor)
process_variable = /* get process variable */;
// Calculate output
float output = pid(setpoint, process_variable, kp, ki, kd, dt, &integral, &last_error);
// Apply output (e.g. to a motor)
/* apply output */
// Wait for next iteration
/* wait */
}
return 0;
}
这个函数接收7个输入参数和2个指针作为输出参数。输入参数包括:
- setpoint:设定值
- process_variable:过程变量
- kp:比例系数
- ki:积分系数
- kd:微分系数
- dt:采样时间
- integral:积分项变量的指针
- last_error:上一次误差变量的指针
输出参数为函数的返回值,即PID算法计算出的控制量。
函数内部的实现和PID算法的公式比较相似,主要包括以下步骤:
计算误差(偏差):误差是设定值与过程变量之间的差值。
计算积分:将误差累积起来,计算积分项。需要注意的是,积分项需要乘以采样时间,这里使用指针来保存积分项变量的值。
计算微分:计算误差的变化率,也就是差分项。需要注意的是,差分项需要除以采样时间。
计算输出:将比例、积分和微分三个部分相加,得到控制量。
保存变量:将当前误差保存为上一次误差,以便下一次计算微分。
这个函数可以在一个循环中多次调用,每次输入新的过程变量和设定值,输出控制量,从而实现PID控制。
pid算法函数实现,c语言版的更多相关文章
- 基于BP神经网络的简单字符识别算法自小结(C语言版)
本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...
- 4、BFS算法套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- 专注笔试算法20年(C语言版)
1.C语言实现链表数据的反转({1,2,3,4}->{4,3,2,1}). int trav(PNode *head){ PNode p_1,p_2,tmp; //判断参数是否有效 if(*he ...
- 各种排序算法代码(C语言版)
选择排序 #include <stdio.h> /* * 选择排序 * 稳定性:不稳定 * 时间复杂度:O(N^2) **/ void select_sort(int a[], int l ...
- 单片机之PID算法
说到PID算法,想必大部人并不陌生,PID算法在很多方面都有重要应用,比如电机的速度控制,恒温槽的温度控制,四轴飞行器的平衡控制等等,作为闭环控制系统中的一种重要算法,其优点和可实现性都成为人们的首选 ...
- PID算法(c 语言)(转)
PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...
- 【转】位置式、增量式PID算法C语言实现
位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...
- 排序算法总结(C语言版)
排序算法总结(C语言版) 1. 插入排序 1.1 直接插入排序 1.2 Shell排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择 ...
- C语言版数据结构算法
C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
随机推荐
- 接入移动手机号一键登录类的封装,app应用,php服务端类的封装与调用
需求:实现手机号一键登录,由于官方只有java的demo和jar包,没有php的sdk及demo <?php/* * 手机号一键登录加解密 */class Autophone{ const A_ ...
- 本地锁 & 分布式锁
引子: 解决缓存击穿问题 synchronized (this){代码块} public synchronized Map<String,List<Catelog2Vo>> g ...
- 音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁 - 英语
音标 重音 u 用 中文 吁 去记忆 骑马让马停下来的 吁
- history = his + story 男性史 = 历史 学单词
history = his + story 男性史 = 历史 早先还有 herstory 由于女性地位底下,就由 history 代表历史了. 然后 history 由拉丁文过来 story 从法语过 ...
- ubuntu中在命令行如何打开图形界面的文件夹的几种方法
方法一: 使用自带的命令:nautilus . 打开当前文件夹 nautilus . 打开指定路径文件夹 nautilus ddd/ccc/ 方法二:xdg-open xdg-open 命令相当于在 ...
- ld: symbol(s) not found for architecture x86_64问题解决
一 写在前面的话: 音频算法仿真过程中,本来是一个跑的好好地程序,突然间在mac下就报错了,出现的错误是: ld: symbol(s) not found for architecture x86_6 ...
- SQL注入详细讲解概括—宽字节注入
SQL注入详细讲解概括-宽字节注入 1.宽字节注入原理 2.宽字节注入方法 一.宽字节注入原理 What is 宽字节? 字符大小为一个字节时为窄字节 字符大小为两个及以上的字节为宽字节 英文26个字 ...
- Handler屏障消息
Handler 屏障消息 Handler Message 种类 Handler的Message种类分为3种: 普通消息 屏障消息 异步消息 同步消息 我们默认用的都是同步消息,即前面讲Handler里 ...
- x5开源库后续知识点
目录介绍 01.基础使用目录介绍 1.0.1 常用的基础介绍 1.0.2 Android调用Js 1.0.3 Js调用Android 1.0.4 WebView.loadUrl(url)流程 1.0. ...
- 你是怎么理解ES6中 Generator的?使用场景?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段: 回 ...