int ChangeTraceTurn(int TraceDate) { int pwm=0; int bias; bias=TraceDate; pwm=PositionPID(bias,TraceTurnPdate); if(pwm>5000) pwm=5000;//限幅 else if(pwm<-5000) pwm=-5000; return pwm; } int ChangeSpeedMotorL(int NowEncodeSpdL,float TarSpdL) { int pwm=0; int bias; int TarEncodeSpdL; TarEncodeSpdL=(int)((TarSpdL*ACircleEncoder)/(WheelOneCircleDis*100)+0.5f);//根据目标速度求出目标编码器速度 bias=NowEncodeSpdL-TarEncodeSpdL; pwm=PositionPIDToSpd(bias,SpdPdate); if(pwm>5000) pwm=5000;//限幅 else if(pwm<-5000) pwm=-5000; return pwm; } int ChangeSpeedMotorR(int NowEncodeSpdR,float TarSpdR) { int pwm=0; int bias; int TarEncodeSpdR; TarEncodeSpdR=(int)((TarSpdR*ACircleEncoder)/(WheelOneCircleDis*100)+0.5f);//根据目标速度求出目标编码器速度 bias=NowEncodeSpdR-TarEncodeSpdR; pwm=PositionPIDToSpd(bias,SpdPdate); if(pwm>5000) pwm=5000;//限幅 else if(pwm<-5000) pwm=-5000; return pwm; } void TraceMove(int TraceDate,float TarSpeed) { int turnpwm=0; int spdpwml=0,spdpwmr=0; int pwml=0,pwmr=0; turnpwm=ChangeTraceTurn(TraceDate); spdpwml=ChangeSpeedMotorL(Encode_Left,TarSpeed); spdpwmr=ChangeSpeedMotorR(Encode_Right,TarSpeed); pwmr=turnpwm+spdpwmr; if(pwmr>5000) pwmr=5000; else if(pwmr<-5000) pwmr=-5000; pwml=-turnpwm+spdpwml; if(pwml>5000) pwml=5000; else if(pwml<-5000) pwml=-5000; Set_Pwm_Motor1(pwmr); Set_Pwm_Motor2(pwml); }
时间: 2023-12-08 21:04:02 浏览: 15
这段代码是一个机器人的运动控制代码,实现了路径跟踪和速度控制。具体来说,函数`ChangeTraceTurn()`调用了一个位置PID控制器,用于计算机器人转向电机的PWM值,从而实现路径跟踪;函数`ChangeSpeedMotorL()`和`ChangeSpeedMotorR()`分别调用了一个速度PID控制器,用于计算机器人左右轮电机的PWM值,从而实现速度控制。函数`TraceMove()`则将路径跟踪和速度控制结合起来,计算出左右轮电机的PWM值,并通过调用`Set_Pwm_Motor1()`和`Set_Pwm_Motor2()`函数来控制电机的转速。
相关问题
float Kp=10,Ki=10,Kd=0; float Bias,Pwm=0,Last_bias=0,integral=0; float Kp1=10,Ki1=10,Kd1=0; float Bias1,Pwm1=0,Last_bias1=0,integral1=0; int pid_v1(float target_v,float now_v) { Bias=(target_v-now_v); //¼ÆËãÆ«²î integral+=Bias; Pwm+= Kp* Bias + Ki * integral + Kd * (Bias - Last_bias);//???PID Last_bias=Bias; //±£´æÉÏÒ»´ÎÆ«²î if(Pwm<-9999) Pwm = -9999; if(Pwm>9999) Pwm = 9999; if(Pwm<0) Pwm=-Pwm; else Pwm=Pwm; return (int)Pwm; }这是pid速度环代码,帮我纠正错误
根据您提供的代码,有几个错误需要纠正:
1. 在计算Pwm值时,应该先将积分项和微分项乘以对应的系数,再进行求和。所以需要将`Pwm+= Kp* Bias + Ki * integral + Kd * (Bias - Last_bias);`修改为`Pwm = Kp * Bias + Ki * integral + Kd * (Bias - Last_bias);`
2. 在计算Pwm值之后,需要对Pwm进行限制,确保其在一定范围内。可以使用条件语句来实现这一点。
3. 最后,需要将Pwm的绝对值作为返回值,即`return (int)fabs(Pwm);`
纠正后的代码如下:
```c
float Kp=10, Ki=10, Kd=0;
float Bias, Pwm=0, Last_bias=0, integral=0;
float pid_v1(float target_v, float now_v)
{
Bias = target_v - now_v; // 计算误差
integral += Bias;
Pwm = Kp * Bias + Ki * integral + Kd * (Bias - Last_bias); // PID控制器计算
Last_bias = Bias; // 保存上一次的误差
// 对Pwm进行限制
if (Pwm < -9999)
Pwm = -9999;
if (Pwm > 9999)
Pwm = 9999;
if (Pwm < 0)
Pwm = -Pwm;
else
Pwm = Pwm;
return (int)fabs(Pwm); // 返回Pwm的绝对值
}
```
请注意,这只是对您提供的代码进行了纠正,具体的PID参数和控制逻辑需要根据实际需求进行调整。
int PositionPID(float deviation,PID pid) { float Position_KP=pid.kp,Position_KI=pid.ki,Position_KD=pid.kd; int Pwm; static float Bias,Integral_bias,Last_Bias; Bias=deviation; //计算偏差 Integral_bias+=Bias; //求出偏差的积分 Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias); //位置式PID控制器 Last_Bias=Bias; //保存上一次偏差 return Pwm; }这个代码什么意思
这段代码是一个位置式PID控制器的实现。PID控制器是一种常用的控制算法,用于控制系统的稳定性和精确性。该函数的作用是根据给定的偏差值,计算出对应的PWM输出。下面是对代码的解释:
1. 首先,函数定义了一个名为PositionPID的函数,接受两个参数:偏差值(deviation)和PID参数结构体(pid)。
2. 接下来,函数内部声明了一些变量,包括位置PID控制器的比例系数(Position_KP)、积分系数(Position_KI)、微分系数(Position_KD),以及PWM输出(Pwm)、偏差(Bias)、偏差积分(Integral_bias)和上一次偏差(Last_Bias)。
3. Bias变量被赋值为输入的偏差值,表示当前的偏差。
4. Integral_bias变量累加了Bias变量,用于计算偏差的积分项。
5. Pwm变量通过使用位置式PID控制器的公式计算得到。公式中包括比例项(Position_KP * Bias)、积分项(Position_KI * Integral_bias)和微分项(Position_KD * (Bias - Last_Bias))。
6. Last_Bias变量被更新为当前的偏差值,以便在下一次计算中使用。
7. 最后,函数返回计算得到的PWM输出。
总体来说,这段代码实现了一个位置式PID控制器,通过计算偏差的比例、积分和微分项,得到对应的PWM输出,用于控制某个系统的位置。