ysnis 2024-01-29 13:27 采纳率: 14.3%
浏览 6
已结题

PID_pm->Integ_e += limit_abs1f(PID_pm->e, PID_pm->e_max) * PID_pm->dt; 请问这个PID_pm->dt是什么赋值的?

https://blog.csdn.net/xiazhouzhou?type=blog

这篇博客里,

PID_pm->Integ_e += limit_abs1f(PID_pm->e, PID_pm->e_max) * PID_pm->dt; 请问这个PID_pm->dt是什么赋值的?麻烦给个使用的代码例子,谢谢

  • 写回答

3条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-01-29 13:44
    关注

    PID_pm->dt应该是指PID控制,特别是离散PID控制中的采样时间。在实现PID控制算法的时候,通常需要在一定的时间间隔内采样系统的状态。这个时间间隔就是dt,也就是微分时间。
    对于离散的PID控制器来说,采样时间dt是一个重要的参数,因为PID控制器的微分和积分部分与微分时间dt有关。这个dt通常需要在每次循环或者每次调用PID更新函数的时候更新。
    这里是一个可能的示例,演示了如何计算并更新dt:

    #include <time.h>
    
    struct PID {
        float e;
        float e_max;
        float dt; 
        // ... 省略其余部分
    };
    
    void updatePID(struct PID * PID_pm) {
        // 获取当前时间
        time_t now = time(NULL);
    
        // 计算dt
        time_t dt = now - PID_pm->last_update_time;
    
        // 更新PID控制器的上次更新时间
        PID_pm->last_update_time = now;
    
        // 现在可以使用dt来更新PID控制器的状态
        PID_pm->Integ_e += limit_abs1f(PID_pm->e, PID_pm->e_max) * dt;
        // ... 省略其余部分
    }
    
    

    请注意上面的代码只是示例,并没有考虑错误检查或者其他可能的实现细节,并且在实际的代码中,你可能需要更精确的时间,可能需要使用比如gettimeofday等更精确的时间函数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 1月29日