资讯动态

PID控制结构

发布时间:2026/9/2 6:16:57 来源:尧图企业网站定制
PIDProportional-Integral-Derivative比例-积分-微分是工业控制中最经典、应用最广泛的闭环控制算法。它的核心思想是根据“目标值”和“当前测量值”之间的误差通过一套数学公式计算出控制量让系统快速、稳定地逼近目标值。PID 的名字来源于它的三个控制环节P比例、I积分、D微分. P比例Proportional“看现在差多少”逻辑误差越大输出控制量越大。公式输出 误差 × Kp作用它是PID的主心骨负责“推”系统往目标值靠。缺点如果Kp太大系统会“刹不住车”在目标值附近反复震荡如果Kp太小反应又太慢。2. I积分Integral“记住过去积累的差”逻辑把过去每次的误差都累加起来用累积值去消除“最后的倔强”。公式输出 历史误差累加值 × Ki作用专门解决稳态误差。比如系统差最后2度就到目标了P已经推不动了输出太小这时候I就会像“老黄牛”一样把误差慢慢累积强行把最后那2度推平。缺点如果Ki太大会导致“积分饱和”系统反应过度产生严重超调。3. D微分Derivative“预测未来会差多少”逻辑观察误差变化的速度这次误差比上次大还是小提前进行“反向刹车”。公式输出 (当前误差 - 上次误差) × Kd作用抑制震荡。当系统快速冲向目标时D能提前感受到“冲过头”的风险给一个反向的力踩刹车。缺点对传感器噪声极度敏感会放大毛刺导致系统抖动一个变量单独控制前后一个变量单独控制左右平均pwm控制前后差分pwm控制左右差分pwm给正值往右转给负值往左转内环角度环通过对比速度环提供的目标俯仰角和姿态检测给的俯仰角计算得到一个输出控制量作用于平均pwm目标俯仰角为0小车直立大于0前进小于0后退直接操作俯仰角前进的话小车会做加速运动保持平衡比较困难外环速度环会动态改变倾斜角使得实际速度稳定在目标速度一开始小车角度过大加速运动时电机编码器计算出平均速度后告诉速度环使速度环输出俯仰角变小直到小车做匀速运动达到目标速度即使左右轮都输入相同的pwm也有可能走不了直线因为两个轮子的差异。所以需要转向环的闭环控制用户给转向环速度是0就是直走。即使两个轮子转速有差异转向环也会动态计算通过输出差分pwm来弥补这个差异/*角度环PID参数*/ PID_t AnglePID { .Kp 3, .Ki 0.1, .Kd 3, .OutMax 100, .OutMin -100, .OutOffset 3, };outmax与outmin的值和电机pwm一样一开始发现小车不能直立config寄存器最低三位可以配置MPU6050自带的一个低通滤波器可以让输出数据更平滑但缺点是会导致延迟如果MPU6050自带的低通滤波设置得太强导致数据延迟过高平衡车会“反应迟钝”最终导致剧烈摇晃甚至直接失控摔倒。内环角度环反应滞后车身已经倾斜了传感器还没把真实角度传过来等角度环反应过来时惯性已经让车冲过头了小车会像磕了药一样前后疯狂震荡。内外环打架用滞后且过时的加速度计数据去修正陀螺仪的漂移会导致姿态角在真实值附近飘忽不定小车呈现“软绵绵”的摇晃感永远找不到平衡点。速度环过冲速度反馈慢半拍小车实际速度已经达标了速度环还在输出前倾角导致小车超速后又猛刹车表现出一顿一顿的狂奔传感器采样要迅速准确执行器输出要迅速且强劲角度环pid控制if (RunCount0 ANGLE_T) //每隔ANGLE_T定义的时间执行一次 { RunCount0 0; /*角度环PID计算*/ AnglePID.Actual Angle; PID_Update(AnglePID); AvePWM -AnglePID.Out; //角度环输出作用于平均PWM /*平均PWM和差分PWM合成左轮PWM和右轮PWM*/ PWML AvePWM DifPWM; PWMR AvePWM - DifPWM; /*PWM限幅*/ if (PWML 100) {PWML 100;} else if (PWML - 100) {PWML -100;} if (PWMR 100) {PWMR 100;} else if (PWMR - 100) {PWMR -100;} /*PWM输出至电机*/ Motor_SetPWM(1, PWML); Motor_SetPWM(2, PWMR); }kp过大会超调抖动姿态传感器由于安装误差等原因目标中心角度有偏差校准/*中心角度校准*/ AngleAcc_Cali AngleAcc AngleAcc_Offset;为了防止小车第二次启动的时候发疯把pid清0void PID_Init(PID_t *p) { p-Target 0; p-Actual 0; p-Actual1 0; p-Out 0; p-Error0 0; p-Error1 0; p-POut 0; p-IOut 0; p-DOut 0; }速度环代码编写定义全局变量/*速度环PID参数*/ PID_t SpeedPID { .Kp 2, .Ki 0.05, .Kd 0, .OutMax 10, .OutMin -10, };角度环直接输出给电机pwm限幅大速度环输出给内环角度环的“目标倾角值不可过大内环是10ms外环调控周期必须大于内环给50ms读取编码器50msif (SensorCount1 SPEED_T) //每隔SPEED_T定义的时间执行一次 { SensorCount1 0; /*通过编码器获取电机旋转速度*/ SpeedLeft Encoder_Get(1) / 408.0 / (SPEED_T / 1000.0); SpeedRight Encoder_Get(2) / 408.0 / (SPEED_T / 1000.0); /*获取均速和差速*/ AveSpeed (SpeedLeft SpeedRight) / 2.0; DifSpeed SpeedLeft - SpeedRight; }速度环/*速度环PID计算*/ SpeedPID.Actual AveSpeed; PID_Update(SpeedPID); AnglePID.Target SpeedPID.Out; //速度环输出作用于角度环输入速度环kp给到4会出现明显震荡转向环/*转向环PID参数*/ PID_t TurnPID { .Kp 2, .Ki 1, .Kd 0, .OutMax 30, .OutMin -30, };主要ki的影响比较大/*转向环PID计算*/ TurnPID.Actual DifSpeed; PID_Update(TurnPID); DifPWM TurnPID.Out; //转向环输出作用于差分PWM

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价