20.4-使用两个通道进行PID电磁循迹
面我们没有使用PID完成了循迹
循迹部分代码如下、我们是利用计算的差比和值 根据差比和大小和正负数控制电机,那么我们用PID循迹也是利用这个值,非PID循迹中我们目标是让g_fVoltageOuter 值等于零 ,所以我们每当 g_fVoltageOuter 大于0.5或者小于-0.5时候电机就会发生反应,想做或者右边运动,
PID中也是我们的
目标: 让g_fVoltageOuter变量等于零
输入: 当前g_fVoltageOuter 值
输出: 两个轮子的要控制速度 这里输出一个差速值,两个电机一个加 另一个电机减 这个差速值 就可以控制电机趋向 正确方向运动。
先按照笔记讲解说明,然后按照讲解已经改好的代码,然后教一下如何改代码。比较难理解,大家结合之前篇章多理解学习。
复制一下20.3 的代码 然后再这基础修改。
定义保存PID计算结果的变量
float g_fVoltagePidOut;//电磁循迹PID计算输出
定义一个用于电磁循迹PID参数的结构体
tPid pidVoltage;//电磁循迹PID代码
然后初始化一下PID的参数,给PID参数赋值。这里说一下如何计算PID参数
首先我们先看P I D 的计算函数,这个是我们在电机控制时候写的
我们做电磁循迹 ,循迹不需要关历史累计误差结果,所以我们只用 P D 参数 I=0可以
然后我们做一个假设,假设两次程序第一次g_fVoltageOuter 值是0 、第二次g_fVoltageOuter 是0.5 并且我们知道我们的目标值是零。
然后分析先定P -3 、D 比P 小很多定 -1 。后面我们在调整。
所以我们的PID初始化先这么写
pidVoltage.actual_val=0.0;
pidVoltage.target_val=0.00;//电磁循迹PID 的目标值为0
pidVoltage.err=0.0;
pidVoltage.err_last=0.0;
pidVoltage.err_sum=0.0;
pidVoltage.Kp=-3.00;
pidVoltage.Ki=0;
pidVoltage.Kd=-1.00;
声明一下变量
extern tPid pidVoltage;//电磁循迹PID代码
编写PID控制部分代码
PID输出控制部分代码
g_fVoltagePidOut = PID_realize(&pidVoltage,g_fVoltageOuter);//PID计算输出偏差目标速度 这个速度,会和基础速度加减
g_fHW_PID_Out1 = 1 + g_fVoltagePidOut;//电机1速度=基础速度+电磁PID输出速度
g_fHW_PID_Out2 = 1 - g_fVoltagePidOut;//电机1速度=基础速度-电磁PID输出速度
if(g_fHW_PID_Out1 >5) g_fHW_PID_Out1 =5;//进行限幅 限幅速度在0-5之间
if(g_fHW_PID_Out1 < 0) g_fHW_PID_Out1 =0;
if(g_fHW_PID_Out2 >5) g_fHW_PID_Out2 =5;//进行限幅 限幅速度在0-5之间
if(g_fHW_PID_Out2 < 0) g_fHW_PID_Out2 =0;
motorPidSetSpeed(g_fHW_PID_Out1,g_fHW_PID_Out2);//通过计算的速度控制电机
摇摆十分严重 我们把PD 缩小一些,然后提高基础速度到1.5
PID参数调整如下
pidVoltage.actual_val=0.0;
pidVoltage.target_val=0.00;//电磁循迹PID 的目标值为0
pidVoltage.err=0.0;
pidVoltage.err_last=0.0;
pidVoltage.err_sum=0.0;
pidVoltage.Kp=-1.0; //电磁循迹P参数
pidVoltage.Ki=0;
pidVoltage.Kd=-0.2;//电磁D参数
如果更改了电感,电感的最大电压值可能会变化,需要修改
这个变量
float g_fVoltageMax[4]={2.89
2.89
2.89
2.89};//用于归一化的最大ADC电压采集值 不同赛道要获得更好循迹效果 需要重新采集这个值
审核编辑 黄宇