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

【重要】TCRT5000系列光电对管的使用 基于STM32+Cubemax相关推荐

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

    STM32 CubeMax TCRT5000L光电对管巡线 原理与实现 1. 光电对管的原理 电子制作中使用的光电对管一般为TCRT5000系列,该系列分为TCRT5000和TCRT5000L,两者的 ...

  2. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

  3. graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris

    数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iri ...

  4. matlab 数值解 期权顶级啊,潮盈期权院高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍...

    主题: 高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍 会场流程: 13:30--14:00:参会嘉宾到场签名 14:00--14:45:期权知识 14:45--15:·25 ...

  5. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  6. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  7. stm32c8t6+dht11+MQ系列环境检测模块+oled显示屏(基于物联网的家庭环境检测系统设计)

    元件清单: stm32f103c8t6.mq2 检测烟雾浓度(模拟量输出).mq7 检测一氧化碳浓度.mq135 检测空气质量.OLED屏幕(四引脚仅支持iic协议通信).dht11检测温湿度(数字量 ...

  8. “药药切克闹”系列-基于STM32触摸屏的超级无敌智能电子密码锁(仿手机键盘26键设计,密码支持英文大写+英文小写+数字)

    项目名称:"药药切克闹"系列-基于STM32触摸屏的超级无敌智能电子密码锁(密码支持英文大写+英文小写+数字) CSDN:YANG-03                      ...

  9. 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+

    ## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+ ...

最新文章

  1. 进行博客博文管理的设计
  2. 元学习Meta-Learning
  3. 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
  4. 汇编级UART串口初始化与打印
  5. REDO LOG大小引起的Oracle数据库性能下降
  6. 怎么样向云服务器上传文件_如何向云服务器传输文件
  7. python中typeerror是什么意思_TypeError:在Python中
  8. C语言open()函数:打开文件函数(转)
  9. 未来互联网最稀缺的能力是什么?
  10. arduino继电器控制风扇_如何基于Arduino制作DHT22控制的风扇
  11. 【计算机数学】二次规划(QP)问题
  12. selenium处理12306登录
  13. JavaScript 正则表达判断经度纬度是否符合规范。
  14. Python基础必掌握的Traceback回溯机制操作详解
  15. 智能卷发器的原理和功能
  16. 易语言对接腾讯ai智能闲聊
  17. 了解JavaScript中的Promise
  18. 任正非十大经典比喻:善形象阐释管理理念
  19. CSS3干货12:CSS3 使用非系统字体
  20. 【智能制造】智能工厂怎么建?

热门文章

  1. 轻量级的架构决策记录机制
  2. arduino语言c,Arduino编程基础(二)——C\C++语言基础(上)
  3. 555555555555555555555555555555555555555555555。。。。。。。。。。。。。。。。。。
  4. server runtime没有选项的解决方法
  5. 《Netty实战-写一个RPC应用》
  6. Lua安装及常用命令使用
  7. 水经注有哪些单款地图下载器授权?
  8. 淘宝API app店铺搜索
  9. 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline
  10. PBlaze5 920系列特性——可变Sector Size管理(上)