【STM32】標準庫與HAL庫對照學習教程外設篇--紅外避障傳感器
- 一、前言
- 二、準備作業
- 三、紅外避障傳感器
- 1、傳感器原理說明
- 2、傳感器特性
- 四、標準庫使用紅外傳感器
- 1、實驗程式
- 2、實驗效果
- 五、HAL庫使用紅外傳感器
- 1、cubemx的主要配置
- 2、實驗程式
- 3、實驗效果
一、前言
本篇介紹如何使用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、實驗效果

到這里就結束啦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/375021.html
標籤:其他
