Browse Source

添加pid算法C语言版1.0

wangyingjie 3 weeks ago
commit
516b3e44c2
3 changed files with 111 additions and 0 deletions
  1. 33 0
      pid_c/main.cpp
  2. 78 0
      pid_c/pid_c.h
  3. BIN
      pid_c/screenshot-20250508-094305.png

+ 33 - 0
pid_c/main.cpp

@@ -0,0 +1,33 @@
+
+# include "my_lib.h"
+# include "pid_c.h"
+
+
+int main()
+{
+    // 创建PID控制器实例
+    studio_pid pid;
+
+    // 初始化PID参数
+    double ini = 2, goal = 50, p = 0.5, i = 0.001, d = 0.6;
+    studio_pid_init(&pid, ini, goal, p, i, d);
+
+    // 模拟控制循环
+    double current_value = ini;
+    for (int i = 0; i < 20; ++i)
+    {
+        // 计算PID输出
+        double output = studio_pid_compute(&pid, current_value);
+        // 更新系统状态(这里简单地将输出加到当前值上)
+        current_value += output;
+        std::cout << "Step " << i + 1 << ": 目标=" << goal << ", 当前值=" << current_value << ", 输出=" << output << std::endl;
+    }
+
+	return 0; 
+}
+
+
+
+
+
+

+ 78 - 0
pid_c/pid_c.h

@@ -0,0 +1,78 @@
+#ifndef PID_C_H
+#define PID_C_H
+
+#include <stdint.h>
+
+// PID控制器结构体
+typedef struct
+{
+    double initval;     // 初始值
+    double goal;        // 目标值
+    double error;       // 当前误差
+    uint32_t pid_step;  // 步数计数器
+    double Kp;          // 比例常数
+    double Ki;          // 积分常数
+    double Kd;          // 微分常数
+    double prev_error;  // 前一个误差
+    double inte_error;  // 积分误差
+    double dif_error;   // 微分误差
+} studio_pid;
+
+// 初始化PID控制器
+void studio_pid_init(studio_pid *pid, double init_v, double goal_v, double p, double i, double d)
+{
+    pid->initval = init_v;
+    pid->goal = goal_v;
+    pid->Kp = p;
+    pid->Ki = i;
+    pid->Kd = d;
+    pid->error = goal_v - init_v;
+    pid->pid_step = 1;
+    pid->prev_error = 0;
+    pid->inte_error = 0;
+    pid->dif_error = 0;
+}
+
+// 计算PID输出
+double studio_pid_compute(studio_pid *pid, double current_value)
+{
+    // 计算当前误差
+    double cte = pid->goal - current_value;
+
+    // 更新误差项
+    if (pid->pid_step == 1)
+    {
+        pid->prev_error = cte;
+    }
+
+    pid->inte_error += cte;
+    pid->dif_error = cte - pid->prev_error;
+    pid->prev_error = cte;
+
+    ++pid->pid_step;
+
+    // 计算并返回PID输出
+    return pid->Kp * cte + pid->Ki * pid->inte_error + pid->Kd * pid->dif_error;
+}
+
+// 获取目标值
+double studio_pid_get_goal(const studio_pid *pid)
+{
+    return pid->goal;
+}
+
+// 设置目标值
+void studio_pid_set_goal(studio_pid *pid, double goal_v)
+{
+    pid->goal = goal_v;
+}
+
+// 设置PID参数
+void studio_pid_set_params(studio_pid *pid, double p, double i, double d)
+{
+    pid->Kp = p;
+    pid->Ki = i;
+    pid->Kd = d;
+}
+
+#endif

BIN
pid_c/screenshot-20250508-094305.png