20.4 电磁循迹小车 电磁循迹算法 智能车环岛

2024-08-20

20.4-使用两个通道进行PID电磁循迹

面我们没有使用PID完成了循迹

循迹部分代码如下、我们是利用计算的差比和值 根据差比和大小和正负数控制电机,那么我们用PID循迹也是利用这个值,非PID循迹中我们目标是让g_fVoltageOuter 值等于零 ,所以我们每当 g_fVoltageOuter 大于0.5或者小于-0.5时候电机就会发生反应,想做或者右边运动,

PID中也是我们的

目标: 让g_fVoltageOuter变量等于零

输入: 当前g_fVoltageOuter 值

输出: 两个轮子的要控制速度 这里输出一个差速值,两个电机一个加 另一个电机减 这个差速值 就可以控制电机趋向 正确方向运动。

先按照笔记讲解说明,然后按照讲解已经改好的代码,然后教一下如何改代码。比较难理解,大家结合之前篇章多理解学习。

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第1张

复制一下20.3 的代码 然后再这基础修改。

定义保存PID计算结果的变量

float g_fVoltagePidOut;//电磁循迹PID计算输出

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第2张

定义一个用于电磁循迹PID参数的结构体

tPid pidVoltage;//电磁循迹PID代码

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第3张

然后初始化一下PID的参数,给PID参数赋值。这里说一下如何计算PID参数

首先我们先看P I D 的计算函数,这个是我们在电机控制时候写的

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第4张

我们做电磁循迹 ,循迹不需要关历史累计误差结果,所以我们只用 P D 参数 I=0可以

然后我们做一个假设,假设两次程序第一次g_fVoltageOuter 值是0 、第二次g_fVoltageOuter 是0.5 并且我们知道我们的目标值是零。

然后分析先定P -3 、D 比P 小很多定 -1 。后面我们在调整。

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第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=-3.00;
pidVoltage.Ki=0;
pidVoltage.Kd=-1.00;

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第6张

声明一下变量

extern tPid pidVoltage;//电磁循迹PID代码

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第7张

编写PID控制部分代码

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第8张

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);//通过计算的速度控制电机

20.4 电磁循迹小车 电磁循迹算法 智能车环岛 (https://ic.work/) 技术资料 第9张

摇摆十分严重 我们把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电压采集值 不同赛道要获得更好循迹效果 需要重新采集这个值

审核编辑 黄宇

文章推荐

相关推荐