【STM32】外部时钟|红外反射光电开关

1.外部时钟

单片机如何对外部触发进行计数?先看一下内部时钟,内部时钟是接在APB1和APB2时钟线上的,APB1,APB2来自stm32单片机内部的脉冲信号,也叫内部时钟。我们用来定时。同样我们可以把外部的信号接入单片机,来对其进行计数功能呢?

这个GPIO口的数据就是外部的信号,当时为了保证稳定性,而是采用下面这种做法

我们知道每一个定时器都有四个输入通道TI1 ~TI4,而TI3 ~TI4不接入触发控制器,也就先不说,对于TI1和TI2对外部输入信号会做滤波处理,以及边沿检测,TI1FP1和TI2FP2既可以选择是上升沿,也可以下降沿触发,也可以双边沿触发,而TI1_ED只能双边沿触发,以及还有一个外部触发器单独的,ETR需要经过极性选择,边沿检测,预分频和输入滤波,边沿检测只能检测到上升沿,但是极性选择可以翻转电平,所以说既能检测高电平,也能检测到低电平,由于ETR输入到触发器的信号只能是内部时钟频率的1/4,所以我们可以调节预分频器改变,输入滤波的话是会有一定的抖动,而抖动的话,时间不会太长,所以我们可以根据一定频率的采样信号来进行采样,N次采样后,这N次采样到的电平是一样的,就说明不是抖动,因为抖动时间不会太长,所以还没有达到N次就出现电平不一样,来进行滤波.

触发器会在TI1FP1和TI2FP2和TI1_ED和ETR中选择一个信号进行控制,也被称为外部时钟模式1,而在ETR输入滤波后面也会直接接入到触发控制器,不借用从模式控制器

2.红外反射光电开关原理

VCC和GND来给模块供电,类似蓝色的灯泡用来发射红外光,而黑色的小灯泡用来接收红外光,黑色小灯泡检测出来的红外光强度以模拟量的形式输出到AO口,当接收的红外光强度很强(灯泡前有物体)时,对应的模拟量电压就越小,当接收红外光强度很弱时(灯泡前有黑色物体时或没有物体时),对应模拟量的电压就越大。

当接收红外光强度很强时,指示灯就会亮。

很强很弱的区分是有一个阈值,这个阈值可以由该模块上的一个电位器来调节,大于该阈值说明接收红外光强度低,但是AO模拟量电压大。

我们会用到他的DO引脚,当AO的电压大于阈值时,DO输出高电平,当AO电压小于阈值时,DO输出低电平。

总结:当灯泡前有物体,DO输出低电平,灯泡前有黑色物体时或没有物体时,DO输出高电平。

3.使用

我们可以将DO引脚当做ETR外部输入的信号,然后通过外部时钟模式1来对其脉冲来计数,将计数的结果打印在屏幕上。

注意主频时钟频率不要选择太大,因为滤波的时候,他的采样频率适合主频时钟频率有关系的,主频频率越大的话,采样频率就越大,相同的采集次数,假如说会采集5次,频率越大就是更小的时间间隔采集一次,这样有的抖动也就会逃脱滤波器的滤波。

定时器2的ETR是在PA0上,所以将DO引脚接在单片机的PA0引脚即可

这里的滤波要设置15,要不然等一下会在黑白交替的时候会有好多抖动,如果不滤波的话,这些抖动也会算在计数中。

c 复制代码
#include <stdio.h>
#include "string.h"
#include "oled.h"
int main(void)
{

  
 


  
  OLED_Init();
  HAL_TIM_Base_Start(&htim2);//开启定时器2来对ETR外部输入信号计数
  int count=0;
  char message[50]="";


  while (1)
  {
	  count=__HAL_TIM_GET_COUNTER(&htim2);//将计数值放在count中

	  OLED_NewFrame();
	  sprintf(message,"count:%d",count);
	  OLED_PrintString(15, 15,message, &font16x16, OLED_COLOR_NORMAL);

	   OLED_ShowFrame();
	   HAL_Delay(100);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

根据视频可以看出共计数19次,实现对下表黑条进行计数

同时我们可以使用外部时钟模式1中的TI1_ED进行双边沿检测,对于黑色条纹会有一个高电平,双边沿就会计数*2;

相关推荐
电子科技圈12 分钟前
IAR开发平台升级Arm和RISC-V开发工具链,加速现代嵌入式系统开发
arm开发·嵌入式硬件·设计模式·性能优化·软件工程·代码规范·risc-v
位东风2 小时前
【凌智视觉模块】rv1106 部署 ppocrv4 检测模型 rknn 推理
c++·人工智能·嵌入式硬件
is08152 小时前
调试`build.sh` 和用 `CMake` 编译出来的 `.elf` / `.bin` / `.hex` 文件大小或行为不同?
stm32
智驾3 小时前
电机控制基础,小白入门篇
嵌入式硬件·电机·电机控制
Peter_Deng.4 小时前
单片机 - STM32 非阻塞式编程详解:以 LED 和按键为例(附超详细寄存器级代码)
stm32·单片机·嵌入式硬件
平凡灵感码头4 小时前
基于 STM32 的四路 PWM 控制智能小车运动的模块化控制程序
stm32·单片机·嵌入式硬件
情意绵绵6744 小时前
VAS1085Q奇力科技LED驱动芯片车规级线性芯片
单片机·嵌入式硬件·硬件架构·硬件工程·pcb工艺
小禾苗_6 小时前
32单片机——基本定时器
单片机·嵌入式硬件
Camellia03116 小时前
嵌入式学习--江协stm32day7
stm32·嵌入式硬件·学习
小灰灰搞电子6 小时前
STM32+rt-thread判断是否联网
服务器·网络·stm32