#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. kubernetes 1.20版本 二进制部署

    kubernetes 1.20版本 二进制部署 目录 kubernetes 1.20版本 二进制部署 1. 前言 2. 环境准备 2.1 机器规划 2.2 软件版本 3. 搭建集群 3.1 机器基本配 ...

  2. Android resource DarkActionBar not found问题解决

    原文: Android resource DarkActionBar not found问题解决 | Stars-One的杂货小窝 几天没改过的代码,突然就无法打开项目了 报错信息如下 在全网都找不到 ...

  3. terminate called after throwing an instance of 'std::regex_error'(C++11)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. Java问题汇总,持续更新到GitHub

    目录介绍 00.Java问题汇总 01.具体问题 好消息 博客笔记大汇总[16年3月到至今],包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bu ...

  5. 常用命令--复制-备份--cp--mv--scp--rsync

    常用命令--复制-备份--cp--mv--scp--rsync cp cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在 ...

  6. 记录--你敢信?比 setTimeout 还快 80 倍的定时器

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 起因 很多人都知道,setTimeout是有最小延迟时间的,根据MDN 文档 setTimeout:实际延时比设定值更久的原因:最小延迟时 ...

  7. MacOS安装 JDK 及动态切换版本

    MacOS安装 JDK 及动态切换版本 JDK下载  我自己使用的是Mac m2系列.无所谓用的哪一种开源的OPEN JD,按需下载,我下载了8,11,17三个版本. 安装完成后,终端输入 java ...

  8. Elasticsearch索引不存在时,查询接口报错怎么办?

    1.索引不存在,报错:type=index_not_found_exception, reason=no such index解决办法: DSL: GET /text_index_003/_searc ...

  9. KingabseES例程之巧用QueryMapping解决查询硬解析问题

    什么是QueryMapping KingbaseES Query Mapping 是一种查询映射功能.有过SQL优化经历的人都知道,对于有些SQL性能问题,可能需要涉及到SQL层面的修改,这不仅麻烦, ...

  10. https://codeforces.com/gym/496962

    A略. B最大最小即为答案. C略. DE记录 t 的每个字母 在 s 中出现的最左和最右,特判端点. FG先贪心后反悔 or 背包. *H:不会.AC自动机.