基于STM32的光电开关控制LED应用实践
本文介绍了基于STM32F103C8T6和欧迪龙EK50-DS30D1光电开关的物体检测系统实现方法。通过设计24V-3.3V电平转换电路保护微控制器,配置GPIO输入/输出模式,实现了光电开关检测物体时控制LED亮灭的功能。文章详细说明了硬件连接、软件编程及调试方法,并提供了扩展应用建议。该方案可应用于工业自动化、智能家居等领域,为后续控制更复杂设备(如步进电机)打下基础。
基于STM32的光电开关控制LED应用实践
前言
在工业自动化、智能家居和物联网应用中,光电开关作为一种非接触式检测器件,发挥着重要作用。本文将详细介绍如何使用STM32微控制器配合欧迪龙EK50-DS30D1光电开关实现物体检测并控制LED指示灯。达成效果:当有物体遮挡光电开关时LED点亮,没有遮挡时LED熄灭。
注:1.后期我会补充上传具体的硬件接线图以及运行效果的图或视频
注:2.下一篇博文将在此基础上进行升级,实现光电开关控制步进电机的启动与停止,大家也可以借此思路实现光电开关控制任何你想控制的硬件,或者完成一些相应的课设或毕设
一、硬件介绍
1.1 STM32微控制器
本项目采用STM32F103C8T6最小系统板。
1.2 光电开关参数
- 型号:欧迪龙EK50-DS30D1
- 类型:直接反射型直流常开
- 检测距离:30cm
- 工作电压:10-30V DC
- 输出方式:NPN常开
- 输出信号:有物体时输出24V,无物体时输出0V(这里我使用的是24V开关电源来给光电开关供电)
二、电路设计
2.1 电平转换电路
由于STM32的GPIO引脚最大只能承受3.3V,而光电开关输出高达24V,必须设计分压电路进行保护:

2.2 接线示意图
光电开关 STM32
Vcc → 外部24V电源
GND → 电源地
OUT → PA2(经分压电路)
LED连接:
PA0 → LED阳极(串联限流电阻)
GND → LED阴极
三、软件实现
3.1 代码解析
#include "stm32f10x.h"
#define LED_PIN GPIO_Pin_0 // PA0
#define SENSOR_PIN GPIO_Pin_2 // PA2 光电开关输入
void Delay_ms(uint32_t ms) {
// 精确毫秒延时函数
SysTick->LOAD = 72000 - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
for(; ms>0; ms--) {
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
}
SysTick->CTRL = 0;
}
int main(void)
{
// 初始化系统时钟
SystemInit();
// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 初始化LED引脚(PA0)为推挽输出
GPIO_InitTypeDef gpioInit;
gpioInit.GPIO_Pin = LED_PIN;
gpioInit.GPIO_Mode = GPIO_Mode_Out_PP;
gpioInit.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInit);
// 初始化光电开关引脚(PA2)为浮空输入
gpioInit.GPIO_Pin = SENSOR_PIN;
gpioInit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &gpioInit);
// 初始状态:LED熄灭
GPIO_WriteBit(GPIOA, LED_PIN, Bit_SET);
while(1)
{
// 读取光电开关状态
if(GPIO_ReadInputDataBit(GPIOA, SENSOR_PIN) == Bit_SET)
{
// 检测到物体时点亮LED
GPIO_WriteBit(GPIOA, LED_PIN, Bit_RESET);
}
else
{
// 未检测到物体时熄灭LED
GPIO_WriteBit(GPIOA, LED_PIN, Bit_SET);
}
// 添加短暂延时,避免过于频繁的检测
Delay_ms(10);
}
}
3.2 关键代码说明
- 系统初始化:
SystemInit()函数配置系统时钟为72MHz - GPIO配置:
- PA0配置为推挽输出,驱动LED
- PA2配置为浮空输入,读取光电开关信号
- 状态检测:主循环中持续检测光电开关状态并控制LED
四、调试与优化
4.1 常见问题排查
-
LED不亮
- 检查LED极性是否正确
- 确认限流电阻值合适(通常220Ω-1kΩ)
- 测量PA0引脚输出电平
-
光电开关无响应
- 确认分压电路工作正常
- 检查光电开关供电电压(24V)
- 测试光电开关输出信号
-
误检测问题
- 调整光电开关检测距离
- 添加软件去抖处理
五、应用扩展
本基础应用可以进一步扩展为:
- 多路检测系统:使用多个光电开关实现复杂检测逻辑
- 通信接口:添加UART或I2C接口与上位机通信
- PWM调光:根据检测结果调节LED亮度
- 中断方式:使用外部中断实现实时响应
六、总结
本文详细介绍了基于STM32和欧迪龙EK50-DS30D1光电开关的物体检测系统实现方法。关键点包括:
- 正确设计电平转换电路保护STM32引脚
- 合理配置GPIO工作模式
- 实现稳定可靠的状态检测逻辑
- 提供调试方法和优化建议
这种设计方案不仅适用于LED控制,还可以扩展到电机控制、门禁系统、自动化生产线等各种应用场景。
版权声明:本文为原创文章,转载请注明出处。
实验环境:Keil MDK-ARM v5 + STM32F103C8T6
注意事项:操作前请务必确认电路连接正确,避免损坏设备
希望本文对您的STM32学习之路有所帮助,欢迎交流讨论!
更多推荐



所有评论(0)