#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算法的公式比较相似,主要包括以下步骤:

  1. 计算误差(偏差):误差是设定值与过程变量之间的差值。

  2. 计算积分:将误差累积起来,计算积分项。需要注意的是,积分项需要乘以采样时间,这里使用指针来保存积分项变量的值。

  3. 计算微分:计算误差的变化率,也就是差分项。需要注意的是,差分项需要除以采样时间。

  4. 计算输出:将比例、积分和微分三个部分相加,得到控制量。

  5. 保存变量:将当前误差保存为上一次误差,以便下一次计算微分。

这个函数可以在一个循环中多次调用,每次输入新的过程变量和设定值,输出控制量,从而实现PID控制。

pid算法函数实现,c语言版的更多相关文章

  1. 基于BP神经网络的简单字符识别算法自小结(C语言版)

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...

  2. 4、BFS算法套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  3. 专注笔试算法20年(C语言版)

    1.C语言实现链表数据的反转({1,2,3,4}->{4,3,2,1}). int trav(PNode *head){ PNode p_1,p_2,tmp; //判断参数是否有效 if(*he ...

  4. 各种排序算法代码(C语言版)

    选择排序 #include <stdio.h> /* * 选择排序 * 稳定性:不稳定 * 时间复杂度:O(N^2) **/ void select_sort(int a[], int l ...

  5. 单片机之PID算法

    说到PID算法,想必大部人并不陌生,PID算法在很多方面都有重要应用,比如电机的速度控制,恒温槽的温度控制,四轴飞行器的平衡控制等等,作为闭环控制系统中的一种重要算法,其优点和可实现性都成为人们的首选 ...

  6. PID算法(c 语言)(转)

    PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...

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

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

  8. 排序算法总结(C语言版)

    排序算法总结(C语言版) 1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择 ...

  9. C语言版数据结构算法

    C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...

  10. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

随机推荐

  1. WAF和IPS的区别

    简介 Web应用防火墙WAF(Web Application Firewall)和入侵防御系统IPS(Intrusion Prevention System)是网络安全领域中常见的两种安全解决方案,它 ...

  2. 浏览器的文件访问 API 入门(英文)- 资料

    浏览器的文件访问 API 入门(英文)- 资料 浏览器现在提供了文件访问 API(File System Access API),允许网页 JS 脚本读写本地文件,本文是一个详细的介绍.另外,也可以参 ...

  3. MYSQL 主从不一致的原因分析

    数据库作为存储数据的组件,数据的一致性一定是要保证的前提,今天给出两个场景来分析数据不一致的原因. binlog同步模式导致主从不一致 在MYSQL 中主库向从库同步数据是利用binlog记录修改操作 ...

  4. C++数值类型与string、CString之间的转换

    目录 数值范围 数值类型与string互相转换 数值类型转换为string 使用函数模板+ostringstream 使用标准库函数std::to_string() string转换为数值类型 使用函 ...

  5. Miracast技术详解(二):RTSP协议

    目录 RTSP概述 抓包准备 WFD能力协商(Capability Negotiation) RTSP M1 Messages RTSP M2 Messages RTSP M3 Messages RT ...

  6. 记录--for in 和 for of的区别详解以及为for in的输出顺序

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错.那么先看下面的一个例子: 例1 const obj = { ...

  7. MindSponge分子动力学模拟——自建力场(2024.03)

    技术背景 在MindSponge教程合集中我们已经介绍了很多使用MindSponge进行分子动力学模拟的方法,这里主要介绍在MindSponge中自定义一个力场.在传统的MD软件中,如果你希望去开发一 ...

  8. abp9 .net8 升级错误记录

    错误一. Cannot find compilation library location for package 'System.Security.Cryptography.Pkcs' 修复方法:  ...

  9. 微信小程序获取手机号流程

    小程序中获取手机号前提 小程序需企业认证,才可以获取用户的手机号,个人开发者是不能获取的 哔哔下 官方文档给出需先登录才可获取手机号 传送门 思路为:login登录获取code-->code传给 ...

  10. 嵌入式C语言设计学习之C语言回顾

    C的基本语法-回忆 1.C的结构 C语言的结构还是以函数为主体,通过其他资源的添加来实现高级语言逻辑.所有的操作都是基于主函数展开的.以主函数为顺序列表,其他函数作为功能模块,组成一个完整的系统.所以 ...