2019-07-21 00:25发布
StayHungry123 发表于 2018-9-4 09:55 //PID3初始化参数 pid3.errorSumDownLim = -200; //偏差和下限 pid3.errorSumUpLim = 200; //偏差 ...
StayHungry123 发表于 2018-9-4 09:57 贴出来了
最多设置5个标签!
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;
}
AD采样值很准确,电机带动电位器转一圈串口打印出的AD值是均匀的0~4096
pid3.kp=0.2; 还是太大, 把它调小至输出不会上下摆动为止
你的PWM设置的时钟及ARR值是多少?
一周热门 更多>