STM32 CubeMax TCRT5000L光电对管巡线 原理与实现

1. 光电对管的原理

电子制作中使用的光电对管一般为TCRT5000系列,该系列分为TCRT5000TCRT5000L,两者的区别仅在于针脚的长度不同

在每一个管中,包含一个红外光电二极管和一个光敏三极管,红外光电二极管不断向外发射红外线,红外线经外部环境反射后被光敏三极管吸收,光敏三极管导通的程度和吸收的红外线强度成正比。所以只要检测光敏三极管导通的程度就知道反射红外线材料的性质。一般颜色深的材质吸收红外线多,颜色浅的材质反射红外线多,这就是我们检测黑线的基本原理

由原理图可知,光敏三极管导通后输出的值是一个连续的模拟值,所以我们可以通过ADC读取模拟值送入单片机进行处理,这样可以得到灵敏度非常高的结果。这种做法的缺点算法复杂,如果管子数量多了也会对ADC提出高要求。所以简便起见,我们一般把这个模拟值送到一个电压比较器中,这种情况下,输出值只有0和1两种情况,单片机的负担就会小很多,也足以应付大部分场合

使用比较器的典型电路长这样(自己画的,仅供参考),使用多个光电对管排成一排对黑线进行检测是目前的主流做法

图中的三角形就是电压比较器的符号了,型号是LM393

典型的实物像这样,这是某宝上买的模块

如果要买现成的模块,最好看一下上面有没有电位器(直插的贴片的都行),有电位器的一般都可以调节比较器的阈值,可以调整探测黑线的灵敏度(上面这个就没有电位器,说不定得自己换电阻…)

这时的算法编写就比较简单,只要用GPIO读取高、低电平即可

2. CubeMax配置

以上面发的那个实物模块为例,一共有5个光电对管,我们就需要5个输入引脚。这里最好使用外部中断输入而不是GPIO输入,使用中断输入能够避免一直轮询检测,节约一些GPIO资源

所以我们需要配置5个GPIO外部中断输入引脚,在配置引脚时,千万不要配置数字相同的引脚作为中断输入,比如说PA1和PB1,因为数字相同的引脚是共用中断线的,字母靠后的引脚会覆盖字母靠前的引脚(PB会覆盖PA),字母靠前的引脚的中断就不起作用了(详见数据手册)

因为这一款模块是探测到黑线输出低,所以我们需要设置为内部上拉,上升\下降沿触发中断

最后,记得将外部中断的优先级设低一点,否则可能会出现中断冲突导致卡死,比如说在外部输入中断函数中调用HAL_Delay时,就会与Time base中断冲突导致卡死

其他基础配置不再赘述

3. 接线

模块与STM32的接线如下

对管模块 STM32
5V 5V
GND GND
OUT1 PB0
OUT2 PB1
OUT3 PB10
OUT4 PB11
OUT5 PB12

4. 代码编写

eletube.h内容如下

#ifndef _ELETUBE_H_#define _ELETUBE_H_#include "stm32f1xx.h"#include <stdio.h>//光电对管中断输入引脚#define ETUBE_PIN_1  GPIO_PIN_0#define ETUBE_PIN_2  GPIO_PIN_1#define ETUBE_PIN_3  GPIO_PIN_10#define ETUBE_PIN_4  GPIO_PIN_11#define ETUBE_PIN_5  GPIO_PIN_12#define ETUBE_PORT_1 GPIOB#define ETUBE_PORT_2 GPIOB#define ETUBE_PORT_3 GPIOB#define ETUBE_PORT_4 GPIOB#define ETUBE_PORT_5 GPIOBvoid Etube_Check(void);//将探测情况输出#endif

eletube.c内容如下

#include "eletube.h"uint8_t etubeCkeck[5] = {1,1,1,1,1};//存放每个对管探测到黑线的状态,1没探测到,0探测到void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//输入中断处理函数{if(GPIO_Pin == ETUBE_PIN_1)//1号引脚{if(HAL_GPIO_ReadPin(ETUBE_PORT_1, ETUBE_PIN_1))//上升沿{etubeCkeck[0] = 1;}if(!HAL_GPIO_ReadPin(ETUBE_PORT_1, ETUBE_PIN_1))//下降沿{etubeCkeck[0] = 0;}}else if(GPIO_Pin == ETUBE_PIN_2)//2号引脚{if(HAL_GPIO_ReadPin(ETUBE_PORT_2, ETUBE_PIN_2))//上升沿{etubeCkeck[1] = 1;}if(!HAL_GPIO_ReadPin(ETUBE_PORT_2, ETUBE_PIN_2))//下降沿{etubeCkeck[1] = 0;}}else if(GPIO_Pin == ETUBE_PIN_3)//3号引脚{if(HAL_GPIO_ReadPin(ETUBE_PORT_3, ETUBE_PIN_3))//上升沿{etubeCkeck[2] = 1;}if(!HAL_GPIO_ReadPin(ETUBE_PORT_3, ETUBE_PIN_3))//下降沿{etubeCkeck[2] = 0;}}else if(GPIO_Pin == ETUBE_PIN_4)//4号引脚{if(HAL_GPIO_ReadPin(ETUBE_PORT_4, ETUBE_PIN_4))//上升沿{etubeCkeck[3] = 1;}if(!HAL_GPIO_ReadPin(ETUBE_PORT_4, ETUBE_PIN_4))//下降沿{etubeCkeck[3] = 0;}}else if(GPIO_Pin == ETUBE_PIN_5)//4号引脚{if(HAL_GPIO_ReadPin(ETUBE_PORT_5, ETUBE_PIN_5))//上升沿{etubeCkeck[4] = 1;}if(!HAL_GPIO_ReadPin(ETUBE_PORT_5, ETUBE_PIN_5))//下降沿{etubeCkeck[4] = 0;}}}void Etube_Check(void)//将探测情况输出{uint8_t i = 0;for(i = 0;i < 5;i++){if(etubeCkeck[i] == 0) printf("0  ");else if(etubeCkeck[i] == 1) printf("1  ");else {};printf("\r\n");}}

之后在main函数里调用探测情况输出函数即可

while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Etube_Check();HAL_Delay(500);}

(记得自己将printf重定义)

5. 结果

输出正常,很ok

STM32 CubeMax TCRT5000L光电对管巡线 原理与实现相关推荐

  1. pid巡线算法程序_技术分享——从单个到多个颜色传感器巡线原理解析

    巡线竞速是常见的机器人比赛项目,它对速度和精准度要求都比较高.该项目大多要求现场进行结构搭建,并且赛前只提供培训参考地图,比赛使用的地图和巡线任务一般是现场才进行公布,对于参赛选手的能力要求较高. 巡 ...

  2. ev3双光感巡线原理_乐高机器人巡线原理

    一. 冃 U 言 在机器人竞赛中,"巡线"特指让机器人沿着场地中一条固定线路(通常是黑线)行 进的任 务.作为一项搭建和编程的基本功,巡线既可以是独立的常规赛比赛项目,也能成 为其 ...

  3. ev3双光感巡线原理_EV3 三光感巡线简易实现原理

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_38288618/article/details/80387313 读取三个光感的黑白范围(前文 ...

  4. 灰度巡线传感器_探索者D1系列教程十 巡线传感器

    巡线小车 使用巡线传感器制作巡线小车,掌握巡线传感器的使用方法. 巡线小车使用巡线传感器检测地面上的黑线,一旦走偏,小车可自主调节速度回到黑线上,以实现小车沿黑线走的功能.可使用一个.两个或多个巡线传 ...

  5. 差速巡线机器人设计-及格(60+)的报告-2023

    实践项目名称:差速巡线机器人设计 实验目的 基于差速机器人底盘和传感器,使用微处理器编程实现机器人快速巡线行驶. 差速巡线机器人设计实验的目的是为了探索差速驱动技术在机器人巡线中的应用.通过设计和制作 ...

  6. 蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

    #勤写标兵挑战赛# 参考资料: 蓝桥ROS机器人之v-rep_pro_edu_v3_6_2 差速巡线机器人设计-良好(80+)的报告-2023 这个案例全部在ROS云课中完成. 第一步:安装v-rep ...

  7. 差速巡线机器人设计-良好(80+)的报告-2023

    如何提分?将一篇报告提升20分以上呢? 差速巡线机器人设计-及格(60+)的报告-2023_zhangrelay的博客-CSDN博客 姓名: 学号: 实践项目1名称:差速巡线机器人设计 60分:缺乏思 ...

  8. 乐高四光感巡线思路解说

    乐高四光感巡线思路解说 国际赛现场 视频 http://v.youku.com/v_show/id_XMzc3OTkzNjE4OA==.html 车头朝前光感从左到右编号分别是 1234 巡线原理 车 ...

  9. 请用数字灰度传感器和步进电机及A4988控制器和stm32设计一个巡线跑道的范例代码...

    很高兴能帮到您,为了设计一个巡线跑道的范例代码,首先要考虑的是灰度传感器和步进电机的控制电路问题,可以使用A4988控制器和STM32芯片来实现.首先要实现的是灰度传感器和步进电机的连接,然后编写程序 ...

最新文章

  1. 为了把mysql的索引底层原理讲清楚,我把计算机翻了个底朝天
  2. 从主数据的角度看一个零售ERP系统
  3. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
  4. Nginx容器日志收集方案fluentd+elasticsearch+kilbana
  5. python 难度-Python分析 oj 网的题目难度和通过率的关系
  6. 详细讲解设计LOGO思维方式和方法【转】
  7. 关于js css html加载顺序整理
  8. linux怎么看日期,linux 怎么用命令查看日期
  9. 【Nutch2.2.1基础教程之2.2】集成Nutch/Hbase/Solr构建搜索引擎之二:内容分析
  10. SpringBoot集成Actuator端点配置
  11. 打印list_按之字形顺序打印二叉树
  12. 1台车至少赚1万块!华为卖车,两天订单破3000辆
  13. python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...
  14. Kaggle 商品销量预测季军方案出炉,应对时间序列问题有何妙招
  15. php mysql 子查询_php – 如何在mySQL的子查询中指定父查询字段?
  16. 基于c语言图书管理系统设计与开发,基于C语言图书管理系统设计与实现.doc
  17. linux中source命令详解,在Linux中,Source命令是什么如何使用它?
  18. php处理头像,(头像处理)PHP把图片转换成圆形png
  19. 学习笔记:Self-Paced Learning
  20. 关于 SwiperJS 的初次使用

热门文章

  1. 程序化交易系统主观辅助交易策略编写和演示 及文华tb单个品种指数合成方法
  2. 快速搭建一个简单的SSM框架
  3. 苏州的计算机考研的,2014年苏州大学计算机考研经验
  4. 谷歌浏览器如何离线安装插件、导出插件的方法
  5. linux下给CPU增加指定百分比的压力
  6. go ip过滤_「净网2020」!利用GOIP设备协助作案上百起的多名“帮凶”被抓!
  7. 进销存系统和ERP系统怎么选?有什么区别?
  8. What can neural networks reason about?论文解析
  9. python url中文转码_python实现中文转换url编码的方法
  10. 茶楼365元会员卡锁客模式