STM32标准库与HAL库对照学习教程外设篇--红外避障传感器
Posted 修成真
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32标准库与HAL库对照学习教程外设篇--红外避障传感器相关的知识,希望对你有一定的参考价值。
【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器
一、前言
本篇介绍如何使用STM32控制红外传感器,方法有软件控制与IO口中断控制,本篇使用IO口中断的形式检测红外传感器的信号并控制LED灯闪烁。
关于LED的使用与外部中断的使用与配置在:
【STM32】标准库与HAL库对照学习教程三–使用库函数配置GPIO点亮LED灯
【STM32】标准库与HAL库对照学习教程五–外部中断详讲与配置
以有详细说明,因此在本篇文章中,只讲程序,不会讲具体工程的配置。
二、准备工作
- STM32开发板(我用的是普中的STM32F103ZE的Z200系列)
- STM32cubemx软件、keil5(MDK)
- 红外避障传感器
三、红外避障传感器
1、传感器原理说明
红外避障传感器的型号有很多种,但原理上大多都相同,具体由一对红外光线发射管与红外光线接收管、传感器电路组成,引脚上有VCC、GND、OUT三个引脚。
工作原理是红外光线发射管发射红外光线,红外光线接收管接收红外光线,当没有接收到返回的红外光线时,OUT引脚输出高电平,当接收到返回的红外光线时,OUT引脚输出低电平。
上图为我们经常使用的传感器图
2、传感器特性
- 工作电压:3.3V-5V
- 工作电流:≥20mA
- 工作温度:-10℃到+50℃
- 检测距离:2-10cm
- 输出信号:接收到光线输出低电平,没有接收到光线输出高电平
四、标准库使用红外传感器
1、实验程序
infrared.h
#ifndef INFRARED_H_
#define INFRARED_H_
#include "stm32f10x.h"
/************引脚重定义************/
#define Infrared_PIN GPIO_Pin_6
#define Infrared_RCC RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO
#define Infrared_Port GPIOC
extern u8 Infrared_LED0;
void Infrared_Init(void); //红外传感器初始化函数
#endif
infrared.c
#include "infrared.h"
/*************************************************
*函数名: Infrared_Init
*函数功能: 红外传感器初始化函数
*输入: 无
*返回值: 无
**************************************************/
void Infrared_Init()
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd(Infrared_RCC, ENABLE); //打开引脚时钟与映射时钟
GPIO_InitStruct.GPIO_Pin = Infrared_PIN; //接收信号引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; //下拉输入
GPIO_Init(Infrared_Port, &GPIO_InitStruct); //引脚初始化
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6); //打开infrared引脚的相应通道
NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn; //中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占式优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //响应式优先级
NVIC_Init(&NVIC_InitStruct); //中断通道初始化
EXTI_InitStruct.EXTI_Line = EXTI_Line6; //中断通道
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE; //中断使能
EXTI_Init(&EXTI_InitStruct); //中断初始化
u8 Infrared_LED0 = 0; //LED闪烁信号标志
/*************************************************
*函数名: EXTI9_5_IRQHandler
*函数功能: 外部中断函数
*输入: 无
*返回值: 无
**************************************************/
void EXTI9_5_IRQHandler(void)
if(EXTI_GetITStatus(EXTI_Line6))
Infrared_LED0 = 1;
EXTI_ClearITPendingBit(EXTI_Line6);
main.c
#include "LED.h"
#include "Delay.h"
#include "System.h"
#include "infrared.h"
/*************************************************
*函数名: main
*函数功能: 主函数
*输入: 无
*返回值: 无
**************************************************/
int main()
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
SysTick_Init(72);
LED_Init();
Infrared_Init();
while(1)
if(Infrared_LED0 == 1) //感知到红外信号
LED_0 = 1; //LED0灭
while(PCin(6) == 0);
Infrared_LED0 = 0;
else
LED_0 = 0; //LED0亮
2、实验效果
五、HAL库使用红外传感器
1、cubemx的主要配置
①
②
③中断引脚
④中断通道
⑤LED引脚(请参考自己开发板的原理图)
⑥
⑥
2、实验程序
函数变量:
static uint8_t LED0_Infrared = 0; //检测红外信号的标志
主函数
if(LED0_Infrared == 1) //检测到红外信号
LED0_Infrared = 0;
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); //灯亮
while(!HAL_GPIO_ReadPin(Infrarred_GPIO_Port, Infrarred_Pin)); //等待手离开
else
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET); //灯灭
回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
if(GPIO_Pin == GPIO_PIN_6) //检测到红外信号
LED0_Infrared = 1;
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6); //清除中断标志
3、实验效果
到这里就结束啦!
以上是关于STM32标准库与HAL库对照学习教程外设篇--红外避障传感器的主要内容,如果未能解决你的问题,请参考以下文章
STM32 HAL库标准外设库LL库(STM32 Embedded Software)