1、472732787 PID 编程 1/5 PID 的 C 语言编程 自从计算机进入控制领域以来,用数字计算机代替模拟计算机调节器组成计算机控制系统,不仅可以用软件实现 PID 控制算法,而且可以利用计算机的逻辑功能,使 PID 控制更加灵活。数字 PID 控制在生产过程中是一种最普遍采用的控制方法,在机电、冶金、机械、化工等行业中获得了广泛的应用。将偏差的比例P)、积分(I)和微分(D)通过线性组合构成控制量,对被控对象进行控制,故称 PID 控制器。PID 控制分为模拟控制分为模拟 PID 控制器和数字控制器和数字 PID 控制器控制器 模拟模拟 PID 控制控制:模拟模拟 PID 控制系统
2、框图控制系统框图 模拟模拟 PID 控制控制的微分方程的微分方程 472732787 PID 编程 2/5 因为微机只能处理数字信号不能处理模拟信号,所以要把模拟PID 控制转换成数字 PID,这就需要把模拟 PID 的参数离散化 模拟模拟 PID 控制规律的离散化控制规律的离散化 数字数字 PID 控制控制:数字 PID 算法有两种常用的基本类型:位置型、增量型。增量型增量型 PID 控制控制 增量式增量式 PID 控制原理控制原理 简化后的简化后的增量式增量式 PID 控制原理控制原理 472732787 PID 编程 3/5 472732787 PID 编程 4/5 PID 程序程序清单
3、清单/定义定义 PID 参数参数#define VV_KPVALUE 3 /比例比例#define VV_KIVALUE 40 /积分积分#define VV_KDVALUE 3 /微分微分#define VV_MAX 10000 /返回的最大值返回的最大值,是是 pwm 的周期值的周期值#define VV_MIN 0/#define VV_DEADLINE 0X08 /速度速度 PID,设置死区范围,设置死区范围 /*/PID 算法算法/*typedef struct PID /定义数法核心数据定义数法核心数据 signed int vi_Ref;/速度速度 PID,速度设定值,速度设定值
4、 Velocity signed int vi_FeedBack;/速度速度 PID,速度反馈值,速度反馈值 m*50 signed long vi_PreError;/速度速度 PID,前一次,速度误差,前一次,速度误差,vi_Ref-vi_FeedBack signed long vi_PreDerror;/速度速度 PID,前一次,速度误差之差,前一次,速度误差之差,d_error-PreDerror;unsigned int v_Kp;/速度速度 PID,Ka=Kp unsigned int v_Ki;/速度速度 PID,Kb=Kp*(T/Ti)unsigned int v_Kd;/速
5、度速度 PID,signed long vl_PreU;/电机控制输出值电机控制输出值 PID;static PID sPID;/PID Control Structure static PID*sptr=&sPID;void PIDInit(void)sptr-vi_Ref=Velocity;/速度设定值速度设定值 sptr-vi_FeedBack=X;/速度反馈值速度反馈值 sptr-vi_PreError=0;/前一次,速度误差前一次,速度误差,vi_Ref-vi_FeedBack sptr-vi_PreDerror=0;/前一次,速度误差之差,前一次,速度误差之差,d_error-Pr
6、eDerror;472732787 PID 编程 5/5 sptr-v_Kp=VV_KPVALUE;sptr-v_Ki=VV_KIVALUE;sptr-v_Kd=VV_KDVALUE;sptr-vl_PreU=0;/电机控制输出值电机控制输出值 /pid void speed_pid(int v)signed long error,d_error,dd_error;/error=(signed long)(sptr-vi_Ref-sptr-vi_FeedBack);/偏差计算偏差计算 d_error=error-sptr-vi_PreError;dd_error=d_error-sptr-vi
7、_PreDerror;sptr-vi_PreError=error;/存储当前偏差存储当前偏差 sptr-vi_PreDerror=d_error;/储存当前误差之差储存当前误差之差 sptr-vl_PreU+=(signed long)(sptr-v_Kp*d_error+sptr-v_Ki*error +sptr-v_Kd*dd_error);/速度速度 PID 计算计算 if(sptr-vl_PreU=VV_MAX)/速度速度 PID,防止调节最高溢出,防止调节最高溢出 sptr-vl_PreU=VV_MAX;else if(sptr-vl_PreU vl_PreU=VV_MIN;else return(sptr-vl_PreU );/返回预调节占空比返回预调节占空比
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1