目录
一、系统概述
二、TCRT5000红外反射传感器简介
2.1 基本概述
2.2 结构与工作原理
2.2.1 物理结构
2.2.2 工作流程
2.2.3 电路原理图
2.3 电气特性
2.4 模块接口说明
2.5 典型应用电路
2.6 实际应用注意事项
三、硬件设计
3.1 硬件组成
3.2 硬件连接
四、软件设计
4.1 开发环境配置
4.2 关键代码实现
4.2.1 初始化代码
4.2.2 主程序逻辑
4.3 关键优化代码
五、注意事项
六、总结
一、系统概述
本系统采用STM32F103C8T6单片机(最小系统板)和光电反射式红外传感器模块(如TCRT5000),实现物体检测、距离测量和循迹等功能。系统通过标准外设库开发,具有响应快速、抗干扰能力强的特点,适用于智能小车、自动化设备等应用场景。
二、TCRT5000红外反射传感器简介
2.1 基本概述
TCRT5000是一种光电反射式红外传感器,由红外发射管和光敏三极管组成,通过检测物体反射的红外光来实现非接触式物体检测。该传感器模块广泛应用于循迹、避障、物体计数等场景。
模块实物图:
2.2 结构与工作原理
2.2.1 物理结构
- 红外发射二极管:发射波长为940nm的红外光
- 硅光敏三极管:接收反射回来的红外光
- 比较器电路(模块上):将模拟信号转换为数字输出
- 灵敏度调节电位器:调节检测阈值
2.2.2 工作流程
1. 红外发射管持续发射红外光
2. 当有物体接近时,红外光被反射
3. 光敏三极管接收到反射光后导通
4. 模块输出信号变化(AO电压降低,DO可能跳变)
2.2.3 电路原理图
电路组成部分及工作原理:
(1)电源指示部分:由一个发光二极管(LED)和一个限流电阻(1KΩ)组成。当电路接上电源 VCC 时,电流通过限流电阻和 LED,使其发光,用于指示电路已通电。电容 104(0.1μF)起到电源滤波的作用,稳定电源电压,减少电源噪声对电路的影响。
(2)TCRT5000 传感器部分:TCRT5000 传感器内部包含一个红外发射二极管和一个红外接收三极管。红外发射二极管持续发射红外光,当遇到前方物体时,红外光会被反射回来,被红外接收三极管接收。接收到的红外光强度不同,会导致接收三极管的导通程度不同,从而在其输出端产生不同的电压信号。
(3)电位器 VR1 部分:电位器 VR1(10KΩ)用于设置比较器的参考电压。通过调节电位器,可以改变 LM393 运算放大器同相输入端的电压值,从而调整传感器检测的灵敏度。
(4)运算放大器 LM393 部分:
LM393 是一个电压比较器。它将 TCRT5000 传感器输出的模拟电压信号(连接到反相输入端)与电位器设置的参考电压(连接到同相输入端)进行比较。
当传感器输出的电压高于参考电压时,LM393 的输出端(DO)输出高电平;当传感器输出的电压低于参考电压时,DO 端输出低电平。这样,DO 端就输出了一个数字信号,可用于微控制器等设备的数字输入。
(5)模拟输出部分:传感器输出的原始模拟电压信号也通过 AO 端直接输出。这个模拟信号可以连接到具有模数转换(ADC)功能的设备,如微控制器的 ADC 引脚,以便更精确地获取传感器检测到的反射光强度信息。
(6)开关指示部分:另一个发光二极管和限流电阻(1KΩ)组成开关指示电路。当 DO 端输出高电平时,该 LED 可能会发光(具体取决于电路设计逻辑,这里假设高电平点亮),用于直观指示传感器检测到了符合条件(即反射光强度高于设定阈值)的情况。
2.3 电气特性
关键参数:
参数 | 值/范围 |
---|---|
工作电压 | 3.3V-5V DC |
工作电流 | 约20mA |
检测距离 | 0.2-1.5cm |
响应时间 | <10μs |
工作温度 | -25℃~+85℃ |
输出形式 | AO(模拟)/DO(数字) |
输出特性:
AO(模拟输出):
- 无反射:接近VCC(如3.3V/5V)
- 有反射:电压降低(反射越强电压越低)
DO(数字输出):
- 无反射:高电平
- 有反射:低电平(可调阈值)
2.4 模块接口说明
标准四线接口:
引脚 | 功能 | 连接说明 |
---|---|---|
VCC | 电源正极(3.3V-5V) | 接MCU的3.3V/5V |
GND | 电源负极 | 接MCU的GND |
AO | 模拟输出(0-VCC) | 接MCU的ADC输入引脚 |
DO | 数字输出(TTL电平) | 接MCU的IO输入引脚 |
灵敏度调节:
- 旋转模块上的蓝色电位器
- 顺时针:提高灵敏度(更易触发)
- 逆时针:降低灵敏度
2.5 典型应用电路
数字模式接线:
TCRT5000 VCC → VCC
TCRT5000 GND → GND
DO → MCU GPIO (输入)
模拟模式接线:
TCRT5000 VCC → VCC
TCRT5000 GND → GND
AO → MCU ADC (如PA0)
2.6 实际应用注意事项
安装方式:
- 传感器距检测表面最佳距离:4-10mm
- 保持传感器与检测面垂直
- 避免环境光直射
检测材料影响:
- 白色表面:反射强,检测距离远
- 黑色表面:反射弱,检测距离近
- 镜面:可能产生误检测
抗干扰措施:
- 添加遮光罩减少环境光影响
- 在红外发射管串联限流电阻(如100Ω)
- 软件上增加去抖处理
校准建议:
- 在实际使用环境中校准阈值
- 不同颜色表面需单独校准
TCRT5000以其高性价比和双输出模式,成为入门级红外检测项目的首选传感器。合理利用其特性,可以构建稳定可靠的非接触式检测系统。
三、硬件设计
3.1 硬件组成
- STM32F103C8T6最小系统板
- TCRT5000红外反射传感器模块
- 0.96寸OLED显示屏(I2C接口)
- LED指示灯
- 蜂鸣器模块
- 杜邦线若干
STM32F103C8T6最小系统板示意图:
蜂鸣器模块示意图:
本次使用的是有源蜂鸣器模块,高电平触发的。只要单片机的IO口输出高电平,就可以驱动蜂鸣器发出声音了。
LED模块:
STM32F103C8T6最小系统板PCB13默认接到自带的LED灯,无需外接 。
3.2 硬件连接
STM32引脚 | 连接模块 | 说明 |
---|---|---|
PA0 | 传感器AO | ADC1通道0 |
PA1 | 传感器DO | 数字输入 |
PB6 | OLED_SCL | I2C1时钟线 |
PB7 | OLED_SDA | I2C1数据线 |
PC13 | LED | 检测状态指示 |
PB8 | 蜂鸣器 | 报警提示 |
3.3V | 传感器VCC | 电源 |
GND | 传感器GND | 共地 |
四、软件设计
4.1 开发环境配置
- 开发工具:Keil MDK-ARM
- 库版本:STM32F10x标准外设库
- 调试工具:ST-Link V2
4.2 关键代码实现
4.2.1 初始化代码
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_i2c.h"
#include "oled.h"
#include "delay.h"#define DETECT_THRESHOLD 1500 // 检测阈值(根据实际调整)void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);// 配置PA0为模拟输入(AO)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置PA1为浮空输入(DO)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置PC13为推挽输出(LED)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);// 配置PB8为推挽输出(蜂鸣器)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOB, &GPIO_InitStructure);
}void ADC_Configuration(void)
{ADC_InitTypeDef ADC_InitStructure;// 使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);// ADC配置ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);// 配置ADC通道0(PA0)ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);// 使能ADC1ADC_Cmd(ADC1, ENABLE);// ADC校准ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));// 启动ADC转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}void I2C_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;// 使能I2C和GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);// 配置I2C引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);// I2C配置I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x00;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000; // 100kHzI2C_Init(I2C1, &I2C_InitStructure);// 使能I2CI2C_Cmd(I2C1, ENABLE);
}
GPIO配置 (GPIO_Configuration
)功能:初始化传感器接口引脚。
PA0
:接收模拟信号(AO),用于精确测量反射强度。PA1
:接收数字信号(DO),用于快速判断物体是否存在。
ADC配置 (ADC_Configuration
)功能:配置ADC1连续采样PA0的模拟信号。
GPIO_Mode_AIN
:模拟输入模式,用于ADC采集。GPIO_Mode_IN_FLOATING
:浮空输入模式,直接读取数字电平。ADC_SampleTime_239Cycles5
:长采样时间,提高信号稳定性。ADC_ContinuousConvMode
:自动连续转换,无需手动触发。
I2C配置 (I2C_Configuration
)功能:初始化I2C接口,用于驱动OLED显示屏。
-
时钟速度设为100kHz,兼顾稳定性和速度。
-
引脚模式为开漏输出(
GPIO_Mode_AF_OD
),需外接上拉电阻
4.2.2 主程序逻辑
uint16_t Get_ADC_Value(void)
{while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成return ADC_GetConversionValue(ADC1);
}void Alarm_Control(FunctionalState state)
{if(state == ENABLE){GPIO_SetBits(GPIOC, GPIO_Pin_13); // LED亮GPIO_SetBits(GPIOB, GPIO_Pin_8); // 蜂鸣器响}else{GPIO_ResetBits(GPIOC, GPIO_Pin_13); // LED灭GPIO_ResetBits(GPIOB, GPIO_Pin_8); // 蜂鸣器停}
}void Display_Detection_Info(uint16_t adc_val, uint8_t digital_val)
{char buffer[16];// 显示ADC值sprintf(buffer, "ADC: %4d", adc_val);OLED_ShowString(0, 2, (uint8_t *)buffer);// 显示数字状态sprintf(buffer, "DO : %s", digital_val ? "HIGH" : "LOW ");OLED_ShowString(0, 4, (uint8_t *)buffer);// 显示检测状态if(adc_val > DETECT_THRESHOLD || digital_val == 0){OLED_ShowString(0, 6, (uint8_t *)"Status: Detected");}else{OLED_ShowString(0, 6, (uint8_t *)"Status: Normal ");}
}int main(void)
{uint16_t adc_value = 0;uint8_t digital_state = 0;// 初始化系统时钟SystemInit();// 外设初始化GPIO_Configuration();ADC_Configuration();I2C_Configuration();OLED_Init();OLED_Clear();OLED_ShowString(0, 0, (uint8_t *)"IR Sensor Test");while(1){// 读取模拟量adc_value = Get_ADC_Value();// 读取数字量digital_state = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);// 显示检测信息Display_Detection_Info(adc_value, digital_state);// 检测逻辑if((adc_value > DETECT_THRESHOLD) || (digital_state == 0)){Alarm_Control(ENABLE); // 触发报警}else{Alarm_Control(DISABLE); // 关闭报警}// 延时200msDelay_ms(200);}
}
ADC值读取 (Get_ADC_Value
)功能:
- 获取当前红外反射的模拟量(AO)。
- 返回值:0(强反射)到4095(无反射),对应电压0V-3.3V。
报警控制 (Alarm_Control
)逻辑:
当检测到物体时,触发声光报警(LED和蜂鸣器)。
数据显示 (Display_Detection_Info
)功能:
在OLED上实时显示传感器数据(ADC值、数字状态和检测结果)。
主程序逻辑工作流程:
-
持续读取传感器的模拟和数字输出。
-
若ADC值超过阈值 或 数字信号为低电平,判定为检测到物体。
-
通过OLED显示数据,并控制报警设备。
-
延时200ms避免频繁刷新。
4.3 关键优化代码
软件滤波 (Moving_Average_Filter
):
uint16_t Moving_Average_Filter(void) {static uint16_t filter_buf[FILTER_SIZE] = {0};sum += filter_buf[filter_index++] = Get_ADC_Value();if(filter_index >= FILTER_SIZE) filter_index = 0;return sum / FILTER_SIZE; // 返回5次采样的平均值
}
-
作用:消除信号抖动,提高稳定性。
-
实现:滑动窗口平均算法,存储最近5次采样值。
五、注意事项
安装位置:
- 传感器应垂直于检测表面安装
- 避免环境光直射传感器
检测距离:
- TCRT5000有效检测距离约0.2-1.5cm
- 可通过调节电位器改变灵敏度
抗干扰:
- 添加深色套管减少环境光干扰
- 软件上增加滤波算法
供电稳定:
- 红外发射管需要稳定电流
- 建议添加稳压电路
六、总结
本系统实现了基于STM32F103C8T6的光电反射式红外传感器检测方案,通过标准库开发保证了代码的可靠性和可移植性,可根据需要扩展为智能车循迹、物体计数等应用。