5.2 对射式红外传感器旋转编码器计次
对射式红外传感器
1.1 接线图
![](/assets/blank.gif)
VCC GND分别接电源的正负极
DO数字输出端,随意选择一个GPIO口
1.2 硬件原理
当挡光片或者编码盘在对射式红外传感器中间经过时,DO就会输出电平变化信号,电平跳变信号触发STM32 PB14号口中断,在中断函数中执行变量++程序,并在主循环里调用OLED中显示变量。
1.3 设计思路
本次设计采用模块化编程,分为CountSensor.c、CountSensor.h、main.c三部分。
先进行初始化
EXTI(中断)配置
1. 第⼀步,配置RCC,把所涉及到的外设时钟都打开 (GPIOB,AFIO(NVIC,EXTI无需打开)) 2. 第⼆步,配置GPIO,选择端口为输⼊模式 3. 第三步,配置AFIO,选择使⽤的⼀路GPIO,连接到EXTI 4. 第四步,配置EXTI,选择边沿触发⽅式,选择触发响应⽅式 5. 第五步,配置NVIC,给中断选择⼀个合适的优先级
最后通过NVIC,外部中断信号进入CPU,CPU收到中断信号,跳转到中断函数里执行中断程序。
EXTI和NVIC时钟默认是打开的,NVIC是内核的外设,内核的外设都不需要开启时钟,RCC 管的都是内核外的外设
1.4 知识储备 AFIO
复位AFIO外设
void GPIO_AFIODeInit(void);
锁定GPIO配置函数
锁定引脚的配置,防⽌意外更改
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
配置AFIO的事件输出功能函数
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource,uint8_tGPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
引脚重映射函数
void GPIO_PinRemapConfig(uint32_t GPIO_Remap,FunctionalStateNewState);
配置AFIO的数据选择器
通过配置AFIO数据选择器,选择中断引脚。
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_tGPIO_PinSource);
恢复上电默认的状态函数
void EXTI_DeInit(void);
1.5 知识储备EXTI
清除EXTI配置,恢复上电默认的状态函数
void EXTI_DeInit(void);
根据结构体配置EXTI外设函数
void EXTI_Init(EXTI_InitTypedef* EXTI_InitStruct);
给传⼊的结构体参数赋⼀个默认值函数
void EXTI_StructInit(EXTI_InitTypedef* EXTI_InitStruct);
软件触发外部中断函数
调用函数,参数给⼀个指定的中断线,就能软件触发⼀次这个外部中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
下面四个是库函数的模板函数
在主程序里查看和清除标志位用下面两个函数
获取指定的标志位是否被置1
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
对置1的标志位进⾏清除函数
void EXTI_ClearFlag(uint32_t EXTI_Line);
在中断函数里查看和清除标志位用下面两个
在中断函数中获取标志位函数
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
清除中断挂起标志位函数
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
1.6 知识储备NVIC
中断分组函数
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
根据结构体⾥⾯的参数初始化NVIC函数
void NVIC_Init(NVIC_InitTypedef* NVIC_InitStruct);
设置中断向量表函数
NVIC_SetVectorTable函数的功能是设置向量表的位置和偏移。其中输⼊参数中,对于32位 的OFFSET向量表基地址的偏移量对于FLASH,参数值必须⾼于0x08000100,对于RAM必 须⾼于0X100
void NVIC_SetVectorTable(uint8_t NVIC_VectTab,uint32_t Offset);
系统低功耗配置函数
void NVIC_SystemLPConfig(uint8_t LowPowerMode,FunctionalStateNewState)
注意:中断函数要简短快速,不要在中断中执⾏Delay
1.7 程序设计
CountSensor.c
#include "stm32f10x.h" // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO的时钟//配置GPIOGPIO_InitTypeDef GPIO_InitStructure;//定义初始化结构体GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//开启引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置响应速度GPIO_Init(GPIOB, &GPIO_InitStructure);//配置参数//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//配置AFIO外部中断引脚选择//配置EXTIEXTI_InitTypeDef EXTI_InitStructure;//定义外部中断结构体EXTI_InitStructure.EXTI_Line = EXTI_Line14;//指定配置中断线EXTI_InitStructure.EXTI_LineCmd = ENABLE;//开启中断线路EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);//写入参数//指定中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC结构体NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//设置中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//通道使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级NVIC_Init(&NVIC_InitStructure);//写入参数
}
//返回中断统计次数
uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}
//中断函数
void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET)//中断标志位判断是否为1{/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){CountSensor_Count ++;//统计中断返回次数}EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}
}
CountSensor.h
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_Hvoid CountSensor_Init(void);
uint16_t CountSensor_Get(void);#endif
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, "Count:");/1行1列显示Count:while (1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);//一行七列显示返回次数,长度为5}
}
2. 旋转编码器计次
2.1 接线图
![](/assets/blank.gif)
VCC GND接正负极,A,B相输出引脚,接到STM32的PB0和PB1引脚。
2.2 设计思路
本设计采用模块化编程,分为Encoder.c、Encoder.h、mian.c三部分。
2.3 程序设计
Encoder.c
#include "stm32f10x.h" // Device headerint16_t Encoder_Count;void CountSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO的时钟//配置GPIOGPIO_InitTypeDef GPIO_InitStructure;//定义初始化结构体GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;//开启引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置响应速度GPIO_Init(GPIOB, &GPIO_InitStructure);//配置参数//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//配置AFIO外部中断引脚选择GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); //配置EXTIEXTI_InitTypeDef EXTI_InitStructure;//定义外部中断结构体EXTI_InitStructure.EXTI_Line = EXTI_Line14;//指定配置中断线EXTI_InitStructure.EXTI_LineCmd = ENABLE;//开启中断线路EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);//写入参数//指定中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;//定义NVIC结构体NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//设置中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//通道使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级NVIC_Init(&NVIC_InitStructure);//写入参数NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//设置中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//通道使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级NVIC_Init(&NVIC_InitStructure);//写入参数
} int16_t Encoder_Get(void)
{int16_t Temp;//定义临时变量,方便Count清零Temp = Encoder_Count;Encoder_Count = 0;return Temp;
}void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET)//中断标志位判断是否为1{/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)//读取输入高低电平{if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Encoder_Count --;}}EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}
}void EXTI1_IRQHandler(void)//线路1中断函数
{if (EXTI_GetITStatus(EXTI_Line14) == SET)//中断标志位判断是否为1{/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)//读取输⼊⾼低电平{if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0){Encoder_Count ++;}}EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}
}
Encoder.h
#ifndef __ENCODER_H
#define __ENCODER_Hvoid Encoder_Init(void);
int16_t Encoder_Get(void);#endif
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"int16_t Num;int main(void)
{OLED_Init();Encoder_Init();OLED_ShowString(1, 1, "Num:");while (1){Num += Encoder_Get();OLED_ShowSignedNum(1, 5, Num, 5);}
}
完
5.2 对射式红外传感器旋转编码器计次相关推荐
- STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)
本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...
- 7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次旋转编码器计次
目录 1.标志位函数 2. 初始化的中断的步骤 3.对射式红外传感器计次 (1)接线图 (2)CountSensor.c (3)main.c 4.旋转编码器计次 (1)接线图(旋转编码器接在PB1.P ...
- 通过对射式红外传感器计次实验讲解EXTI中断
目录 前言 一.接线图 二.EXTI中断 1.什么是中断 2.什么是EXTI 3.什么是NVIC 4.NVIC基本结构: 三,配置中断 1.配置中断的流程 2.根据例程详细介绍1.CountSenso ...
- 对射式红外传感器模块、测速传感器模块、计数器模块、电机测试模块、槽型光耦模块
文章目录 一.产品简介 二.原理分析 三.程序设计 四.程序源码 一.产品简介 该产品采用FTR9606高灵敏度槽型光耦器件,槽宽5mm.它由一个红外发光二极管和NPN光电三极管组成,M3固定安装孔, ...
- 对射式红外传感器计次
通过中断实现,假设将GPIOA_Pin_14作为接受传感器信号的输入口.先初始化GPIOA口,然后配置AFIO复用IO口.然后配置中断,中断线必须选14中断线,对应IO口.然后配置NVIC,NVIC是 ...
- STM32单片机(五)第二节:EXTI外部中断练习1(对射式红外传感器计次)
❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分:建议先学习51单片机,其是STM32等高级单片机的基础:这样再学习STM32时才能融会贯通. ☀️ 专栏适 ...
- stm32F407 连接 对射式红外对管 样例
本次样例,是利用 Led 灯来作为红外对管的显示,串口打印作为协助 stm32F407开发板上有两个led灯,DS0和DS1 所以需要编写的代码涉及:led.h.led.c.hong.c.hong.h ...
- STM32入门笔记03_EXTI外部中断详解+案例:红外对射计数、旋转编码器计数
EXTI外部中断 中断的相关概念 中断源: 可以引起中断的事件称为中断源 中断: 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成 ...
- STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
1.实物连接图: 左下角的D0接任意一个空闲的IO口均可,此处接的是PB14.当对射式红外传感器被遮挡住时,D0发送中断信号给PB14并完成相关操作. 2.外部信号流程(代码部分编写的原理): 外部信 ...
最新文章
- 什么是 Delta 文件
- 计算机二级python用什么书-计算机二级python考什么?
- Golang gRPC 示例
- 通过live555实现H264 RTSP直播
- html炫酷在线,小伙伴们都会惊呆的10个超炫的HTML5+CSS3效果作品
- 【已解决】Navicat 远程连接 Linux服务器上的MySQL数据库
- A Quantization-Friendly Separable Convolution for MobileNets
- element表格实现树形全选_很实用!word中全选的快捷键介绍及使用方法
- linux 蓝牙攻击,研究人员担心BleedingTooth蓝牙漏洞给Linux系统带来风险
- 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
- 【迁移学习】算法之TrAdaBoost
- Android下最简单的Camera应用APP
- BatchConfigTool批量配置工具
- 计算机图形学学习笔记(上)
- Android手机ram大小,安卓手机RAM容量演进史,如何从192MB走到16GB,HTC:我有话要说...
- 澳洲留学:说说在澳洲打工的那些苦与痛
- python编程8g的内存够么_内存8G够用吗?深入解读~
- 2020成电计算机考研
- mysql主从复制-介绍
- [JIRA] 从3.6.2旧版升级到新版6.0.8的详细过程
热门文章
- jsp调用css文件
- winen中文_详细教你win10英文版转中文版
- 2022自动驾驶迎来商业化元年,景联文科技如何打造数据引擎?
- Django计算机毕业设计保险公司售后服务管理系统(程序+LW)Python
- Visual Studio 2022 更改背景图片
- 拥堵费该收吗?怎么收?
- Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】
- SECURITY: URL redirect target contains control characters, rejecting. [IP: 101.6.8.193 80]
- Rejecting re-init...NoClassDefFoundError...
- 输入一个月份,输出这个月有多少天?