Setpoint = -0.5; myPID.SetTunings(kp, ki, kd);myPID.SetoutputLimits(-255 + dl, 255 - d1); myPID.SetSampleTime(1); myPID.SetMode(AUTOMATIC): sPID.SetTunings(sp, si, sd);sPID.SetoutputLimits(-10,1aa); sPID.SetSampleTime(5a); sPID.SetMode(AUTOMATIC); attachInterrupt(1,speed,RISING):
时间: 2024-03-30 19:35:00 浏览: 132
这是一段 Arduino 代码,用于设置 PID(比例-积分-微分)控制器的参数,并且启动控制器的自动调节模式。
首先,程序设置了控制器的设定值(Setpoint),即控制器需要将被控制的变量调节到的目标值。然后程序使用 SetTunings() 函数设置了控制器的比例系数(kp)、积分系数(ki)和微分系数(kd)。接着程序使用 SetoutputLimits() 函数设置了控制器的输出限制,以避免输出值过大或过小。最后程序使用 SetSampleTime() 和 SetMode() 函数设置了控制器的采样时间和工作模式为自动调节模式(AUTOMATIC)。
接着,程序又设置了另一个 PID 控制器 sPID,同样使用了 SetTunings()、SetoutputLimits()、SetSampleTime() 和 SetMode() 函数来设置控制器的参数和工作模式。
最后,程序使用 attachInterrupt() 函数设置了一个中断来检测某个事件的发生,并且执行指定的函数(speed)来响应中断。在本例中,中断的触发条件为外部信号从低电平变为高电平(RISING)。
相关问题
Inputs = speedcount;sPID.Compute();Setpoint = -0.5 + Outputs;Input = angle;myPID.Compute();angle < -6a)if (angle > 60 Output = ;if (fla嗬褒橙){ motort(Output);flag = 0;else ( motor(Output); (Serial.available() > @) inByte = Serial.read():Serial.println("chenggongtongxun");
这是一段 Arduino 代码,用于控制某个系统的输出,例如控制一个电机的转速,以实现某个期望的行为。
这段代码中,首先将变量 speedcount 的值作为控制器 sPID 的输入(Inputs),并且调用 sPID.Compute() 函数计算输出(Outputs),然后将 -0.5 加上 Outputs 的值作为控制器 myPID 的期望值(Setpoint)。
接着程序将变量 angle 的值作为控制器 myPID 的输入(Input),并且调用 myPID.Compute() 函数计算输出(Output)。
然后程序检查变量 angle 的值是否小于 -60 或大于 60,如果是则将控制器的输出值设为 0,否则程序会检查是否检测到某个标志位(flag),如果检测到标志位则执行某个函数(motort(Output))来控制电机的转速,然后将标志位 flag 设为 0。否则程序会直接执行函数(motor(Output))来控制电机的转速。
最后,程序使用 Serial.available() 函数检查串口是否有可用数据,如果有则使用 Serial.read() 函数读取数据,并且向串口发送一条“chenggongtongxun”的消息。
具体注释以下代码void PID_init(PID * pp) { memset(pp, 0, sizeof(PID));//memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。 } float PID_realize(PID *pp, float NextPoint,float SetPoint) { float index; pp->Set = SetPoint; pp->Actual = NextPoint; pp->err = pp->Set - NextPoint; if(fabs(pp->err)>1000) //8.00 变积分过程 { index=0.0; }else if(fabs(pp->err)<200){ //2.00 index=1.0; pp->integral+=pp->err; }else{ index=(1000-fabs(pp->err))/800; pp->integral+=pp->err; } pp->out = pp->Kp*pp->err + index*pp->Ki*pp->integral + pp->Kd*(pp->err-pp->err_last); pp->err_LastLastlast = pp->err_Lastlast; pp->err_Lastlast = pp->err_last; pp->err_last = pp->err; return pp->out; } float LowTemPID_realize(PID *pp, float NextPoint,float SetPoint) { float index; pp->Set = SetPoint; pp->Actual = NextPoint; pp->err = pp->Set - NextPoint; if(fabs(pp->err)>200) //1.00 变积分过程 { index=0.0; pp->integral = 0; }else if(fabs(pp->err)<50){ index=1.0; pp->integral+=pp->err; }else{ index=(200-fabs(pp->err))/150; pp->integral+=pp->err; } pp->out = pp->Kp*pp->err + index*pp->Ki*pp->integral + pp->Kd*(pp->err-pp->err_last); pp->err_LastLastlast = pp->err_Lastlast; pp->err_Lastlast = pp->err_last; pp->err_last = pp->err; return pp->out; }
这段代码实现了一个PID控制器。PID控制器是一种常用的控制器,其全称为比例-积分-微分控制器。它根据被控对象的反馈信号与给定值之间的误差,通过比例、积分和微分三个部分的组合来调节被控对象的输出,最终达到控制目标的效果。
在这段代码中,PID_init函数是用于初始化PID结构体的函数,使用了memset函数将其全部置为0。PID_realize和LowTemPID_realize函数则分别实现了PID控制器的两个不同模式的控制,分别是普通模式和低温模式。两个函数的参数包括PID结构体指针、当前值和设定值。其中,变量index用于根据误差的大小来动态调整积分项的系数,即变积分过程。最后,函数返回PID控制器的输出值pp->out。
阅读全文