- #include "pid.h"
- PID pid; //存放PID算法所需要的数据
- // pid.Sv=120; //用户设定温度
- // pid.Kp=30; //比例系数
- // pid.T=500; //PID计算周期
- // pid.Ti=5000000; //积分时间
- // pid.Td=1000; //微分时间
- // pid.pwmcycle=200; //pwm周期1000
- // pid.OUT0=1;
- void PID_Calc() //pid计算
- {
- float DelEk;
- float ti,ki;
- float td;
- float kd;
- float out;
- if(pid.C10ms<(pid.T)) //计算周期未到
- {
- return ;
- }
- pid.Ek=pid.Sv-pid.Pv; //当前的偏差值 = 设定值 - 返回值
- pid.Pout=pid.Kp*pid.Ek; //比例输出 = 比例系数*偏差
- pid.SEk+=pid.Ek; //历史偏差总和
- DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差
- ti=pid.T/pid.Ti; //系数1
- ki=ti*pid.Kp; // 系数2
- pid.Iout=ki*pid.SEk*pid.Kp; //积分输出 = 系数2 * 偏差和 * 比例系数
- td=pid.Td/pid.T; //系数3
- kd=pid.Kp*td; //系数4
- pid.Dout=kd*DelEk; //微分输出 = 系数4 * 最近两次偏差和
- out= pid.Pout+ pid.Iout+ pid.Dout; //PID输出 = 比例输出 + 积分输出 + 微分输出
- ///////////////////////////输出保护///////////////////////////////
- if(out>pid.pwmcycle)
- {
- pid.OUT=pid.pwmcycle;
- }
- else if(out<0)
- {
- pid.OUT=pid.OUT0;
- }
- else
- {
- pid.OUT=out;
- }
- //pid.OUT+=; //本次的计算结果
- pid.Ek_1=pid.Ek; //更新偏差
- pid.C10ms=0;
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|