【重要】TCRT5000系列光电对管的使用 基于STM32+Cubemax
1. 光电对管的原理
电子制作中使用的光电对管一般为TCRT5000系列,该系列分为TCRT5000和TCRT5000L,两者的区别仅在于针脚的长度不同
在每一个管中,包含一个红外光电二极管和一个光敏三极管,红外光电二极管不断向外发射红外线,红外线经外部环境反射后被光敏三极管吸收,光敏三极管导通的程度和吸收的红外线强度成正比。所以只要检测光敏三极管导通的程度就知道反射红外线材料的性质。一般颜色深的材质吸收红外线多,颜色浅的材质反射红外线多,这就是我们检测黑线的基本原理
由原理图可知,光敏三极管导通后输出的值是一个连续的模拟值,所以我们可以通过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相关推荐
- STM32 CubeMax TCRT5000L光电对管巡线 原理与实现
STM32 CubeMax TCRT5000L光电对管巡线 原理与实现 1. 光电对管的原理 电子制作中使用的光电对管一般为TCRT5000系列,该系列分为TCRT5000和TCRT5000L,两者的 ...
- 基于STM32系列芯片的 IAP实现的探索
基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...
- graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris
数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iri ...
- matlab 数值解 期权顶级啊,潮盈期权院高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍...
主题: 高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍 会场流程: 13:30--14:00:参会嘉宾到场签名 14:00--14:45:期权知识 14:45--15:·25 ...
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...
- Java学习系列(十六)Java面向对象之基于TCP协议的网络通信
TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...
- stm32c8t6+dht11+MQ系列环境检测模块+oled显示屏(基于物联网的家庭环境检测系统设计)
元件清单: stm32f103c8t6.mq2 检测烟雾浓度(模拟量输出).mq7 检测一氧化碳浓度.mq135 检测空气质量.OLED屏幕(四引脚仅支持iic协议通信).dht11检测温湿度(数字量 ...
- “药药切克闹”系列-基于STM32触摸屏的超级无敌智能电子密码锁(仿手机键盘26键设计,密码支持英文大写+英文小写+数字)
项目名称:"药药切克闹"系列-基于STM32触摸屏的超级无敌智能电子密码锁(密码支持英文大写+英文小写+数字) CSDN:YANG-03 ...
- 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+
## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+ ...
最新文章
- 进行博客博文管理的设计
- 元学习Meta-Learning
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
- 汇编级UART串口初始化与打印
- REDO LOG大小引起的Oracle数据库性能下降
- 怎么样向云服务器上传文件_如何向云服务器传输文件
- python中typeerror是什么意思_TypeError:在Python中
- C语言open()函数:打开文件函数(转)
- 未来互联网最稀缺的能力是什么?
- arduino继电器控制风扇_如何基于Arduino制作DHT22控制的风扇
- 【计算机数学】二次规划(QP)问题
- selenium处理12306登录
- JavaScript 正则表达判断经度纬度是否符合规范。
- Python基础必掌握的Traceback回溯机制操作详解
- 智能卷发器的原理和功能
- 易语言对接腾讯ai智能闲聊
- 了解JavaScript中的Promise
- 任正非十大经典比喻:善形象阐释管理理念
- CSS3干货12:CSS3 使用非系统字体
- 【智能制造】智能工厂怎么建?
热门文章
- 轻量级的架构决策记录机制
- arduino语言c,Arduino编程基础(二)——C\C++语言基础(上)
- 555555555555555555555555555555555555555555555。。。。。。。。。。。。。。。。。。
- server runtime没有选项的解决方法
- 《Netty实战-写一个RPC应用》
- Lua安装及常用命令使用
- 水经注有哪些单款地图下载器授权?
- 淘宝API app店铺搜索
- 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline
- PBlaze5 920系列特性——可变Sector Size管理(上)