不同就不同在PID算法上,与近三次的误差有关。

    1. /**
    2. * @brief PID算法实现
    3. * @param val 目标值
    4. * @note 无
    5. * @retval 通过PID计算后的输出
    6. */
    7. float PID_realize(float temp_val)
    8. {
    9. /*计算目标值与实际值的误差*/
    10. pid.err = pid.target_val - temp_val;
    11. /*PID算法实现*/
    12. pid.actual_val += pid.Kp * (pid.err - pid.err_next)
    13. + pid.Ki * pid.err
    14. + pid.Kd * (pid.err - 2 * pid.err_next + pid.err_last);
    15. /*传递误差*/
    16. pid.err_last = pid.err_next;
    17. pid.err_next = pid.err;
    18. /*返回当前实际值*/
    19. return pid.actual_val;
    20. }

    image.png