float PID_Left1(int16_t speed1,int16_t tar1) { static float err = 0, err_last = 0, err_last_last = 0, add = 0; speed1 = absolute_value_speed(speed1); tar1 = absolute_value_speed(tar1); err = tar1-speed1; add = P * (err - err_last) + I * err + D * (err + err_last_last - 2 * err_last); out_left1 += add; out_left1 = pwm_control(out_left1); err_last_last = err_last; err_last = err; return out_left1; }
时间: 2024-04-18 13:31:31 浏览: 13
这段代码实现了一个 PID 控制器的左侧计算。函数名为 PID_Left1,接收两个参数 speed1 和 tar1,分别表示当前速度和目标速度。其中,P、I、D 是三个控制参数,err、err_last、err_last_last 和 add 是静态变量。
代码首先对 speed1 和 tar1 取绝对值,然后计算误差 err = tar1 - speed1。接着,根据 PID 控制器的公式计算增量 add = P * (err - err_last) + I * err + D * (err + err_last_last - 2 * err_last)。
增量 add 被累加到 out_left1 变量上,并通过 pwm_control 函数进行限幅处理。最后,更新 err_last_last、err_last 的值为当前的 err 和 err_last,并返回 out_left1。
需要注意的是,这段代码中的变量 out_left1 和 P、I、D 的定义没有提供,可能是在其他地方定义的全局变量。另外,pwm_control 函数的具体实现也没有在这段代码中给出。
相关问题
MCU1_ERR11_CUR_UNBALANCE
根据提供的引用内容,MCU1_ERR11_CUR_UNBALANCE可能是一个错误码。在Linux内核中,常见的错误码是以负数形式表示的,例如-EBUSY、-EINVAL等[^1]。这些错误码对应着不同的错误情况,用于在内核中标识和处理错误。根据引用,Linux内核中最大的错误号不会超过4095,因此MCU1_ERR11_CUR_UNBALANCE可能是一个自定义的错误码。
请注意,具体的错误码含义需要参考相关文档或代码来确定。根据提供的引用内容,无法确定MCU1_ERR11_CUR_UNBALANCE的具体含义。如果您需要进一步了解该错误码的含义,请参考相关文档或代码。
float PID_realize(float temp_val) { /*传入实际值*/ pid.actual_val = temp_val; /*计算目标值与实际值的误差*/ pid.err=pid.target_val-pid.actual_val; /*PID算法实现*/ float increment_val = pid.Kp*(pid.err - pid.err_next) + pid.Ki*pid.err + pid.Kd*(pid.err - 2 * pid.err_next + pid.err_last); /*传递误差*/ pid.err_last = pid.err_next; pid.err_next = pid.err; /*返回增量值*/ return increment_val; }
这段代码是一个 PID 控制器的实现函数。它接受一个实际值 `temp_val` 作为参数,并返回一个增量值。
在函数中,发生了以下操作:
1. `pid.actual_val = temp_val;` 将传入的实际值存储到 `pid` 对象的 `actual_val` 成员变量中。
2. `pid.err = pid.target_val - pid.actual_val;` 计算目标值与实际值之间的误差,将结果存储到 `pid` 对象的 `err` 成员变量中。
3. 根据 PID 控制算法,计算出一个增量值 `increment_val`。这个增量值是根据当前误差、上一次误差和上上次误差以及对应的 PID 系数(`Kp`, `Ki`, `Kd`)进行计算得到的。
4. `pid.err_last = pid.err_next;` 将当前误差 `pid.err` 存储到 `pid` 对象的 `err_last` 成员变量中,以备下一次计算使用。
5. `pid.err_next = pid.err;` 将当前误差 `pid.err` 存储到 `pid` 对象的 `err_next` 成员变量中,以备下一次计算使用。
6. 最后,函数返回计算得到的增量值 `increment_val`。
这段代码实现了一个简单的 PID 控制器,用于根据给定的目标值和实际值计算出一个增量值,用于调节控制系统的输出。具体的 PID 控制算法实现可能会根据实际需求有所不同。