基于STM32的光电传感器模块实验
实验内容
- 了解光电开关工作原理。
- 编写程序检测光电开关状态,当有物体穿过U型槽时底座红色LED灯亮起。
实验目的
- 认识光电传感器;
- 了解光电传感器工作原理;
- 掌握光电传感器配合其他模块使用技巧。
实验环境
实验所需硬件
序号 | 名称 | 数量 | 备注 |
---|---|---|---|
1 | 电脑 | 1台 | 系统Windows7及以上 |
2 | STM32底座模块 | 1个 | · |
3 | 光电传感器模块 | 1个 | · |
4 | ST-Link下载器 | 1个 | · |
5 | ST-Link下载器连接线 | 1根 | · |
6 | 光电传感器实验代码 | 1份 | · |
实验所需软件
ST-Link下载器 & ST-Link下载器连接线
STM32底座:HIVE PRO STM32是一种基于STM32F103C8T6芯片的蜂巢底座。
实验要求
- 理解光电传感器工作原理;
- 能够编写程序检测光电传感器输出信号。
实验原理
光电传感器工作原理
利用光学元件,在传播媒介中间使光束发生变化;利用光束来反射物体;使光束发射经过长距离后瞬间返回。光电开关是由发射器、接收器和检测电路三部分组成。发射器对准目标发射光束,发射的光束一般来源于发光二极管(LED)和激光二极管。光束不间断地发射,或者改变脉冲宽度。受脉冲调制的光束辐射强度在发射中经过多次选择,朝着目标不间接地运行。接收器有光电二极管或光电三极管组成。在接收器的前面,装有光学元件如透镜和光圈等。在其后面的是检测电路,它能滤出有效信号和应用该信号。
光电耦合器是以光为媒介传输电信号的一种电一光一电转换器件。它由发光源和受光器两部分组成。把发光源和受光器组装在同一密闭的壳体内,彼此间用透明绝缘体隔离。发光源的引脚为输入端,受光器的引脚为输出端,常见的发光源为发光二极管,受光器为光敏二极管、光敏三极管等等。光电耦合器的种类较多,常见有光电二极管型、光电三极管型、光敏电阻型、光控晶闸管型、光电达林顿型、集成电路型等。工作原理在光电耦合器输入端加电信号使发光源发光,光的强度取决于激励电流的大小,此光照射到封装在一起的受光器上后,因光电效应而产生了光电流,由受光器输出端引出,这样就实现了电一光一电的转换。
由振荡回路产生的调制脉冲经反射电路后,由发光管GL辐射出光脉冲。当被测物体进入受光器作用范围时,被反射回来的光脉冲进入光敏三极管DU。光电开关并在接收电路中将光脉冲解调为电脉冲信号,再经放大器放大和同步选通整形,然后用数字积分或RC积分方式排除干扰,最后经延时(或不延时)触发驱动器输出光电开关控制信号。 光电开关一般都具有良好的回差特性,因而即使被检测物在小范围内晃动也不会影响驱动器的输出状态,从而可使其保持在稳定工作区。同时,自诊断系统还可以显示受光状态和稳定工作区,以随时监视光电开关的工作。
硬件原理图
光电传感器原理图
实验步骤
① 将光电开关模块安装在STM32底座上,ST_LINK连接电脑与STM32底座,如下图所示:
② 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:
③ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):
$ cd workspace
④ 运行clone
命令:
$ git clone https://github.com/aiotcom/eps.git
下载目录至指定文件夹下。
如果提示“command not found”表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code
-> DownLoad ZIP
下载所有工程代码。如下图所示:
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。
⑤ 打开MDK5
工程软件,点击工具栏: ` Project ->
Open Project,选择工程文件:
基于STM32的模块实验\4.光电传感器模块\光电传感器模块程序\USER\Optocoupler.uvprojx` 并打开。
⑥ 工程启动后,点击 Rebuild
重新编译。如下图:
⑦ 编译成功,如下图:
⑧ 点击 Download
按钮下载程序,如下图所示:
⑨ 下载完成后,将USB线进行重连操作(即:将STLink的USB线从底座上取下,再重新接上)。
⑩ 观察底座LED灯,没有物体遮挡U行槽的时候底座灯不亮。如下图:
⑪ 当使用物体遮挡U型槽时,底座亮红色LED灯。如下图:
代码讲解
① 程序目录结构,如下图。CORE文件夹为STM32内核代码,HALLIB文件文件夹为底层HAL库文件。我们主要关心,main.c及HARDWARE中的代码。
② main.c中对光电开关、底座灯进行初始化,检测光电开关反馈的信号,点亮底座灯或者熄灭底座灯。
int main(void)
{
HAL_Init();//初始化HAL库
Optocoupler_Init();//初始化光电传感器,使能传感器
DZD_Init();//初始化底座灯控制IO
while(1)
{
if(Optocoupler_State_Read())//读取光电状态
{//有数据
/*底座灯亮红色*/
DZD_ColSet(DZD_RED);
}
else
{//无数据
/*底座灯全熄灭*/
DZD_ColSet(DZD_BLACKOUT);
}
}
}
通过调用Optocoupler_State_Read(),光电开关反馈的信号,该函数返回1,光电开关检测到有遮挡物,反则之。调用DZD_ColSet (),设置底座灯的颜色。
while(1)
{
if(Optocoupler_State_Read())//读取光电状态
{//有数据
/*底座灯亮红色*/
DZD_ColSet(DZD_RED);
}
else
{//无数据
/*底座灯全熄灭*/
DZD_ColSet(DZD_BLACKOUT);
}
}
常见问题
-
弹出警告窗口,不能下载程序。
- 请确认STLink驱动、STM32F103C8的DFP包是否安装。
- STLink仿真器是否正常接入。
-
下载代码后程序没观察到实验现象
- 请重新上电,或者按下底座上的复位按键。
- 模块没有安装稳妥。
实验思考
- 光电开关检测到遮挡物,切换底座灯颜色,循环显示红色、绿色、蓝色。