0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第13章-循迹功能 STM32智能小车循迹教程 PID循迹算法分析

dfhjgfg 来源:dfhjgfg 作者:dfhjgfg 2024-08-21 16:27 次阅读

功能介绍放开头, 使用便捷无需愁

这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记、12多个小时视频、20多章节代码手把手教会你如何开发和调试。让你更快掌握嵌入式系统开发。

**V3.3.0-STM32智能小车 **

**视频: **[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]

V3:HAL库开发、功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、视觉控制、电磁循迹、RTOS等功能。

讲解一下我们小车里面的循迹部分,包括红外基础使用,无PID循迹和有PID循迹。

第13章-循迹功能

13.1-非PID循迹功能完成

先红外对管调试

我们这里学习一下,如何实现循迹功能

如何才能让小车沿着黑线运动、要让小车感知到黑线的位置,使用这种传感器就可以反馈黑线是否存在
在这里插入图片描述
根据传感器特性,我们检测红外对管DO引脚的电压就可以知道,下面有没有黑线

DO 高电平->有黑线 小灯灭

DO低电平->没有黑线 小灯亮

这是好多地方对这个产品的说明

在这里插入图片描述
然后我们组合上面的红外对管,安装到小车上,就可以知道小车是否偏离了黑线,
在这里插入图片描述
下面我们通过单片机读取红外对管DO口的电压,就知道黑线在小车下面的位置了
STM32初始化

先看原理图需要初始化那些引脚
在这里插入图片描述

把****OUT_1-PA5、OUT_2-PA7、OUT_3-PB0、OUT_4-PB1初始化为输入模式**
**在这里插入图片描述
重新生成

然后我们在gpio.h 添加读取GPIO的宏,使得程序更简洁
在这里插入图片描述

#define READ_HW_OUT_1   HAL_GPIO_ReadPin(HW_OUT_1_GPIO_Port,HW_OUT_1_Pin) //读取红外对管连接的GPIO电平
#define READ_HW_OUT_2   HAL_GPIO_ReadPin(HW_OUT_2_GPIO_Port,HW_OUT_2_Pin)
#define READ_HW_OUT_3   HAL_GPIO_ReadPin(HW_OUT_3_GPIO_Port,HW_OUT_3_Pin)
#define READ_HW_OUT_4   HAL_GPIO_ReadPin(HW_OUT_4_GPIO_Port,HW_OUT_4_Pin)

根据红外对管状态控制电机速度

注意:整个主函数不要加入延时,这样实时性更高,可以根据红外对管状态做出及时控制
在这里插入图片描述

if(READ_HW_OUT_1 == 0&&READ_HW_OUT_2 == 0&&READ_HW_OUT_3 == 0&&READ_HW_OUT_4 == 0 )
{
printf("应该前进rn");
motorPidSetSpeed(1,1);//前运动
}
if(READ_HW_OUT_1 == 0&&READ_HW_OUT_2 == 1&&READ_HW_OUT_3 == 0&&READ_HW_OUT_4 == 0 )
{
printf("应该右转rn");
motorPidSetSpeed(0.5,2);//右边运动
}
if(READ_HW_OUT_1 == 1&&READ_HW_OUT_2 == 0&&READ_HW_OUT_3 == 0&&READ_HW_OUT_4 == 0 )
{
printf("快速右转rn");
motorPidSetSpeed(0.5,2.5);//快速右转
}
if(READ_HW_OUT_1 == 0&&READ_HW_OUT_2 == 0&&READ_HW_OUT_3 == 1&&READ_HW_OUT_4 == 0 )
{
printf("应该左转rn");
motorPidSetSpeed(2,0.5);//左边运动
}
if(READ_HW_OUT_1 == 0&&READ_HW_OUT_2 == 0&&READ_HW_OUT_3 == 0&&READ_HW_OUT_4 == 1 )
{
printf("快速左转rn");
motorPidSetSpeed(2.5,0.5);//快速左转
}

然后测试

  1. 测试红外对管灵敏度,放在有黑线的地上或者纸上,然后把小车黑线比如放到最右边 及第一个红外对管,观察红外对管小灯变化情况和串口输出情况,如果小灯没有灭,就调节红外对管灵敏度和室内灯光,直到每个红外对管都可以感应到小灯。
  2. 然后在黑线上让小车循迹
    在这里插入图片描述

然后循迹功能完成

然后放到地上
在这里插入图片描述

13.2-加入循迹PID

前面的代码我们对循迹是判断的几个状态,然后PID控制电机不同速度,但是我们可以使用红外对管状态作为PID控制的输入然后再控制电机。

PID的输入是红外对管状态,我们设计 PID输入是红外对管的状态、然后输出一个速度值,然后左右电机去加或者减这个值,就可以完成根据红外对管输入对电机的差速控制

主函数添加的
在这里插入图片描述

extern tPid pidHW_Tracking;//红外循迹的PID
uint8_t g_ucaHW_Read[4] = {0};//保存红外对管电平的数组
int8_t g_cThisState = 0;//这次状态
int8_t g_cLastState = 0; //上次状态
float g_fHW_PID_Out;//红外对管PID计算输出速度
float g_fHW_PID_Out1;//电机1的最后循迹PID控制速度
float g_fHW_PID_Out2;//电机2的最后循迹PID控制速度

然后实现PID循迹控制、注意为了更加快,要减少没有必要的程序和优化判断、将没有必要的输出都注释掉
在这里插入图片描述

g_ucaHW_Read[0] = READ_HW_OUT_1;//读取红外对管状态、这样相比于写在if里面更高效
g_ucaHW_Read[1] = READ_HW_OUT_2;
g_ucaHW_Read[2] = READ_HW_OUT_3;
g_ucaHW_Read[3] = READ_HW_OUT_4;
​
if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0 )
{
//printf("应该前进rn");//注释掉更加高效,减少无必要程序执行
g_cThisState = 0;//前进
}
else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 1&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0 )//使用else if更加合理高效
{
//printf("应该右转rn");
g_cThisState = -1;//应该右转
}
else if(g_ucaHW_Read[0] == 1&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0 )
{
//printf("快速右转rn");
g_cThisState = -2;//快速右转
}
else if(g_ucaHW_Read[0] == 1&&g_ucaHW_Read[1] == 1&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0)
{
//printf("快速右转rn");
g_cThisState = -3;//快速右转
}
else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 1&&g_ucaHW_Read[3] == 0 )
{
//printf("应该左转rn");
g_cThisState = 1;//应该左转
}
else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 1 )
{
//printf("快速左转rn");
g_cThisState = 2;//快速左转
}
else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 1&&g_ucaHW_Read[3] == 1)
{
//    printf("快速左转rn");
g_cThisState = 3;//快速左转
}
g_fHW_PID_Out = PID_realize(&pidHW_Tracking,g_cThisState);//PID计算输出目标速度 这个速度,会和基础速度加减
​
g_fHW_PID_Out1 = 3 + g_fHW_PID_Out;//电机1速度=基础速度+循迹PID输出速度
g_fHW_PID_Out2 = 3 - g_fHW_PID_Out;//电机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;
if(g_fHW_PID_Out2 < 0) g_fHW_PID_Out2 =0;
if(g_cThisState != g_cLastState)//如何这次状态不等于上次状态、就进行改变目标速度和控制电机、在定时器中依旧定时控制电机
{
motorPidSetSpeed(g_fHW_PID_Out1,g_fHW_PID_Out2);//通过计算的速度控制电机
}

g_cLastState = g_cThisState;//保存上次红外对管状态

在pid.中
在这里插入图片描述

tPid pidHW_Tracking;//红外循迹的PID

在这里插入图片描述

​
pidHW_Tracking.actual_val=0.0;
pidHW_Tracking.target_val=0.00;//红外循迹PID 的目标值为0
pidHW_Tracking.err=0.0;
pidHW_Tracking.err_last=0.0;
pidHW_Tracking.err_sum=0.0;
pidHW_Tracking.Kp=-1.50;
pidHW_Tracking.Ki=0;
pidHW_Tracking.Kd=0.80;

然后就可以跑一下试试了。

可以改进的地方

  1. 红外对管影响差速转向,也影响基础直行的速度 ,会有更好控制效果,所以可以加入每种红外对管状态下对基础速度的影响。
  2. 红外对管的数量越多,效果会越好。

第15章我们会讲解手机遥控的功能

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44554

    浏览量

    634693
  • STM32
    +关注

    关注

    2270

    文章

    10896

    浏览量

    355757
  • 智能小车
    +关注

    关注

    87

    文章

    549

    浏览量

    81724
  • 算法分析
    +关注

    关注

    0

    文章

    9

    浏览量

    7620
  • 循迹
    +关注

    关注

    0

    文章

    14

    浏览量

    13064
收藏 人收藏

    评论

    相关推荐

    20.3-使用两个通道进行电磁循迹 智能车竞赛 电磁杆原理图 电磁循迹小车 STM32电磁小车 电磁循迹算法

    20.3-使用两个通道进行电磁循迹 智能车竞赛 电磁杆原理图 电磁循迹小车 智能车电磁组 STM32
    的头像 发表于 08-20 10:56 770次阅读
    20.3-使用两个通道进行电磁<b class='flag-5'>循迹</b> <b class='flag-5'>智能</b>车竞赛 电磁杆原理图 电磁<b class='flag-5'>循迹</b><b class='flag-5'>小车</b> <b class='flag-5'>STM32</b>电磁<b class='flag-5'>小车</b> 电磁<b class='flag-5'>循迹</b><b class='flag-5'>算法</b>

    五路循迹小车PID算法探讨

    最近研究五路循迹小车,想加上PID算法,是用位置式,还是增量式呢?求大神指导
    发表于 08-15 15:29

    PID循迹模块原理

    前言 让小车进行循迹最重要的是获取车相对于循迹线的位置,关于循迹模块的原理我已经在之前的一篇博客上讲过,如果大家没看过的话可以点此链接:PID
    发表于 09-07 06:29

    红外循迹传感器PID循迹算法的相关资料分享

    红外循迹传感器PID循迹算法前一段时间参加了一个小车循迹竞速的比赛,获得了一个还行的成绩,所以在
    发表于 01-14 08:03

    基于STC89C52单片机_红外智能循迹小车

    智能循迹小车 智能循迹小车 智能
    发表于 11-12 10:23 611次下载

    基于51单片机循迹智能小车

    基于51单片机循迹智能小车基于51单片机循迹智能小车基于51单片机
    发表于 11-13 15:55 0次下载

    智能循迹小车程序

    智能循迹小车,基于stm32智能循迹小车HC-SR
    发表于 12-04 10:30 39次下载

    智能循迹小车程序

    智能小车循迹 没有pwm的调速机制
    发表于 12-17 11:38 25次下载

    PWM调速+循迹__智能小车程序

    PWM调速+循迹__智能小车程序
    发表于 02-07 17:14 135次下载

    基于STM32智能循迹往返小车电路设计

    基于STM32智能循迹往返小车电路设计
    发表于 04-10 09:30 62次下载

    智能循迹避障小车设计与实现

    智能循迹避障小车设计与实现
    发表于 06-06 08:48 307次下载

    智能循迹避障小车程序

    智能循迹避障小车程序,红外循迹
    发表于 12-11 16:37 55次下载

    红外循迹传感器PID循迹算法

    红外循迹传感器PID循迹算法前一段时间参加了一个小车循迹竞速的比赛,获得了一个还行的成绩,所以在
    发表于 01-14 11:04 36次下载
    红外<b class='flag-5'>循迹</b>传感器<b class='flag-5'>PID</b><b class='flag-5'>循迹</b><b class='flag-5'>算法</b>

    基于CW32的遥控循迹小车

    本实验是使用CW32单片机制作一个入门的遥控循迹小车。遥控采用蓝牙配合手机APP进行遥控。循迹使用一个5路的循迹模块。使用OLED模块进行显示当前
    的头像 发表于 11-17 17:46 1020次阅读
    基于CW32的遥控<b class='flag-5'>循迹</b><b class='flag-5'>小车</b>

    19.2-星曈科技 openmv H7 plus openmv视觉循迹功能-完成视觉识别指定区域 OpenMV视觉模块循迹 STM32F103C8T6视觉巡线

    19.2-【星曈科技】openmv H7 plus openmv视觉循迹功能-完成视觉识别指定区域 OpenMV视觉模块循迹_巡线
    的头像 发表于 08-20 11:28 520次阅读