• 如何使用pid


    一、背景:

            PID控制器是一种常见的反馈控制器,用于控制系统中的物理量:温度,速度,位置等。PID的名称来自于其三个组成部分:比例项(P), 积分项(I), 微分项(D)。PID控制的目标是使输入的参数(例如温度)趋近于目标点(例如目标温度),并保持在设定点附近。
            比例项(P):用于根据当前误差计算输出。若误差较大,则输出也较大,从而加快系统的响应速度。

            积分项(I): 用于消除稳态误差。若稳态误差持续存在,则积分项会逐渐增加,从而增加输出,直到误差消失。

            稳态误差举例:设目标温度为30°C,实际25°C,此时差值e为5。比例项(P)为固定值。若此时输出u可令温度在0.5h内上升5°C,但环境影响可令温度在0.5h内降低5°C,则输出u的作用被抵消,则偏差一直存在。该偏差即为稳态误差。

            微分项(D):用于减少系统的超调和震荡。若误差变化速度较快,则微分项会增加输出,从而较少超调和震荡。
    二、简单实现:
     

    1. // PID控制器参数
    2. #define KP 1.0f
    3. #define KI 0.1f
    4. #define KD 0.01f
    5. // 温度传感器参数
    6. #define TARGET_TEMP 25.0f
    7. #define ROOM_TEMP 20.0f
    8. #define MAX_TEMP 100.0f
    9. #define MIN_TEMP 0.0f
    10. //PID控制器变量
    11. float error = 0.0f;
    12. float integral = 0.0f;
    13. float derivative = 0.0f;
    14. float last_err = 0.0f;
    15. float output = 0.0f;
    16. //温度传感器变量
    17. float current_temp = ROOM_TEMP;
    18. //PID控制器函数
    19. float pid_ctrl(float set_point, float input, float dt) {
    20. error = set_point - input;
    21. integral += error * dt;
    22. derivative = (error - last_error) / dt;
    23. output = KP * error + KI * intergal + KD * derivative;
    24. last_error = error;
    25. return output;
    26. }
    27. int main(void) {
    28. //模拟时间步长
    29. float dt = 0.1f;
    30. //模拟时间
    31. float t = 0.0f;
    32. //模拟循环
    33. while(1) {
    34. //计算PID输出
    35. output = pid_ctrl(TARGET_TEMP, current_temp, dt);
    36. //限制输出范围
    37. if (output > MAX_TEMP) {
    38. output = MAX_TEMP;
    39. } else if (output < MIN_TEMP) {
    40. output = MIN_TEMP;
    41. }
    42. //模拟温度变化
    43. current_temp += (output - current_temp) * dt;
    44. //输出结果
    45. printf("Time: %f, set_point: %f, input: %f, output: %f\n", t, TARGET_TEMP, current_temp, output);
    46. //时长变化
    47. t += dt;
    48. }
    49. return 0;
    50. }

    在该例程中,创建了一个简单的PID控制器,定义了一些常量来表示PID控制器的参数和温度传感器的反馈的参数。主函数中使用while循环模拟时间变化,并在每个时间步长中计算PID输出和温度变化。最后输出结果并令时间变化。

  • 相关阅读:
    Go项目使用自定义的公共单元
    浏览器缓存机制
    vue3实现懒加载
    mac安装git
    基于Rook+Ceph的云原生存储架构剖析
    ARM仿真器J-Link灯不亮的解决办法
    2023年亚太杯数学建模思路 - 案例:ID3-决策树分类算法
    在微信小程序中怎么做投票活动
    章鱼网络Louis:发现Web3商业价值
    Linux安装与配置SSH服务
  • 原文地址:https://blog.csdn.net/QTRPio/article/details/134451036