点此进入CSDN

点此添加QQ好友 加载失败时会显示




pid算法函数实现,c语言版

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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控制。

 

posted @   高颜值的殺生丸  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
历史上的今天:
2020-04-26 实体识别中,或序列标注任务中的维特比Viterbi解码

作者信息

昵称:

刘新宇

园龄:4年6个月


粉丝:1209


QQ:522414928

点击右上角即可分享
微信分享提示