初级会员

- 积分
- 106
- 金钱
- 106
- 注册时间
- 2018-3-15
- 在线时间
- 54 小时
|

楼主 |
发表于 2018-9-4 09:55:23
|
显示全部楼层
//PID3初始化参数
pid3.errorSumDownLim = -200; //偏差和下限
pid3.errorSumUpLim = 200; //偏差和上限
pid3.PIDoutDownLim = -80; //PID输出下限(即PWM占空比)
pid3.PIDoutUpLim = 80; //PID输出上限
pid3.errorUpLim = 200; //偏差上限
pid3.errorDownLim = -200; //偏差下限
pid3.delErrorUpLim = 300; //偏差之差上限
pid3.delErrorDownLim = -300; //偏差之差下限
pid3.TargetVal=2000;
pid3.kp=0.2; //先开始调P参数,所以将Ki Kd都置0了
pid3.ki=0;
pid3.kd=0;
void PID3_Calc(void)
{
pid3.error = pid3.TargetVal - pid3.NowVal; //偏差 = 设定 - 当前
if(pid3.error > pid3.errorUpLim) //误差限幅
pid3.error = pid3.errorUpLim;
else if(pid3.error < pid3.errorDownLim)
pid3.error = pid3.errorDownLim;
pid3.errorSum += pid3.error; //偏差求和
if(pid3.errorSum > pid3.errorSumUpLim) //偏差和限幅
pid3.errorSum = pid3.errorSumUpLim;
else if(pid3.errorSum < pid3.errorSumDownLim)
pid3.errorSum = pid3.errorSumDownLim;
pid3.delError = pid3.error - pid3.error1; //偏差微分
pid3.error1 = pid3.error;
if(pid3.delError > pid3.delErrorUpLim) //偏差微分限幅
pid3.delError = pid3.delErrorUpLim;
else if(pid3.delError < pid3.delErrorDownLim)
pid3.delError = pid3.delErrorDownLim;
pid3.Pout = pid3.kp * pid3.error; //比例输出
pid3.Iout = pid3.ki * pid3.errorSum; //积分输出
pid3.Dout = pid3.kd * pid3.delError; //微分输出
pid3.PIDout = pid3.Pout + pid3.Iout+ pid3.Dout; // PID输出
if(pid3.PIDout > pid3.PIDoutUpLim) //PID输出限幅
pid3.PIDout = pid3.PIDoutUpLim;
else if(pid3.PIDout < pid3.PIDoutDownLim)
pid3.PIDout = pid3.PIDoutDownLim;
}
在MAIN()函数中
if(pid3_flag==1) //PID控制标志位 ,每0.1S进定时器中断将pid3_flag置1
{
ADCVAL=Get_Adc_Average(ADC_Channel_1,5);
pid3.NowVal=ADCVAL;
PID3_Calc();
PwmValue3=pid3.PIDout;
pid3_flag=0;
} |
|