目錄
一、系統概述
二、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的光電反射式紅外傳感器檢測方案,通過標準庫開發保證了代碼的可靠性和可移植性,可根據需要擴展為智能車循跡、物體計數等應用。