可以将位置式PID函数作为速度环的反馈,即在速度环中调用位置式PID函数来获取控制量。
例如:
float targetSpeed = 100; // 目标速度 tPid_vel vel_pid; vel_pid.kp = 0.1; vel_pid.ki = 0.01; vel_pid.kd = 0.05;
while(1) {
float output_pos = PID_realizeP(targetPos, &pos_pid); // 获取位置环输出
float output_vel = PID_realizeL(output_pos); // 使用位置环输出作为速度环输入,获取速度环输出
// 将速度环输出赋值给电机控制量
motor_control[0] = output_vel;
// 等待一段时间后更新实际状态(角度和速度)
update_motor_state();
// 更新速度环PID参数
vel_pid.actual_val = motor_raw[0].speed/60; // 实际测得的转速
float output_vel_new = PID_realizeL(targetSpeed, &vel_pid);
}
注意,在使用位置式PID函数时,需要先调用一次获取初始误差。另外,每次更新实际状态后都需要重新计算位置式PID函数的误差。