概述
本篇文章主要介紹如何使用STM32CubeMX對紅外波形進行解碼,并通過串口打印。
硬件準備
首先需要準備一個開發板,這里我準備的是NUCLEO-F030R8的開發板:
選擇芯片型號
配置時鐘源
HSE與LSE分別為外部高速時鐘和低速時鐘,在本文中使用內置的時鐘源,故都選擇Disable選項,如下所示:
配置時鐘樹
STM32F0的最高主頻到48M,所以配置48即可:
串口配置
本次實驗使用的串口1進行串口通信,波特率配置為115200。
在這里插入圖片描述
定時器配置
本次使用定時器1的通道2進行檢測,配置入下。
紅外接收管
這里使用VS838的接收管,如下所示:
紅外編碼
NEC協議載波:38khz
其邏輯1與邏輯0的表示如圖所示:
NEC協議格式:
自定義紅外編碼
協議如下:
代碼
在main.c中,添加頭文件,若不添加會出現 identifier "FILE" is undefined報錯。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
紅外接收口定義
/* USER CODE BEGIN PTD */
#define IR_IN1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)
/* USER CODE END PTD */
函數聲明和串口重定向:
/* USER CODE BEGIN PFP */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
uint32_t OrderData = 0;
uint8_t ReadyFlag = 0;
uint8_t OK = 0;
/* USER CODE END 0 */
定時器配置
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1);//啟動定時器
HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//函數用于使能定時器某一通道的輸入捕獲功能,并使能相應的中斷
printf("IR Capture !!
");
/* USER CODE END 2 *
紅外接收代碼
- [4400,5000]是用于捕獲4.5ms的信號
- [550,700]是用于捕獲560us的數據0信號
- [1100,1250]是用于捕獲1120us的數據1信號
- [2000,2500]是用于捕獲2240us的截止位信號
/* USER CODE BEGIN 4 */
// 捕獲中斷回調函數,每次捕獲到信號就會進入這個回調函數
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
uint32_t fallingCount = 0 ; // 下降沿計數
uint8_t temp = 0 ;
// 判斷是否是定時器1的外部捕獲口2
if(htim->Instance == TIM1)
{
// 捕獲到了上升沿
if(IR_IN1)
{
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); // 改變捕獲極性為下降沿捕獲
__HAL_TIM_SET_COUNTER(htim, 0); // 計數清零,從頭開始計
}
else
{
fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 讀取捕獲計數,這個時間即為上升沿持續的時間
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改變捕獲極性為上升沿捕獲
if( ((fallingCount > 4400) && (fallingCount <5000)))
OK = 1;/// 4.5ms引導電平
else if (((fallingCount > 550) && (fallingCount < 700)))
{
temp = 0;//560 us,數據為0
}
else if (((fallingCount > 1100) && (fallingCount < 1250)))
{
temp = 1;//1120 us,數據為1
}
else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500))) //2.240ms截止碼
{
ReadyFlag = 1 ;
OK = 0;
}
if(OK)
{
OrderData <<= 1 ;
OrderData += temp ;
KeyCount = 0; // 按鍵次數
}
}
}
}
/* USER CODE END 4 */
主函數
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(ReadyFlag)
{
printf("order=%08X , code=%d
",OrderData,OrderData);
OrderData = 0;
OK = 0;
ReadyFlag = 0;
}
}
/* USER CODE END 3 */
結果演示
紅外連續發送5次碼值,發送分別為
- 1011(11)
- 11 1010(58)
- 11 0001(49)
- 11 1111(63)
- 11 0011(51)
分別如下所示:
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
定時器
+關注
關注
23文章
3246瀏覽量
114742 -
開發板
+關注
關注
25文章
5035瀏覽量
97386 -
stm32cubemx
+關注
關注
5文章
283瀏覽量
14792
發布評論請先 登錄
相關推薦
STM32CUBEMX(5)--自定義紅外NEC解碼,定時器TIM捕獲方式
概述
本篇文章主要介紹如何使用STM32CubeMX對紅外波形進行解碼,并通過串口打印。
硬件準備
首先需要準備一個開發板,這里我準備的是NUCLEO-F030R8的開發板:
教學視頻
選擇
發表于 09-05 16:19
Stm32CubeMx基本定時器的概念
Stm32CubeMx基本定時器基本定時器概念Stm32CubeMx 配置基本配置配置LED燈配置晶振時鐘配置串口時鐘數配置TIM6
發表于 08-18 08:18
STM32CUBEMX配置教程(十二)STM32的定時器觸發的固定頻率ADC采樣(使用DMA)
STM32CUBEMX配置教程(十二)STM32的定時器觸發的固定頻率ADC采樣(使用DMA)
發表于 11-24 13:51
?85次下載
STM32CUBEMX配置教程(十三)STM32的定時器觸發的固定頻率DAC輸出(使用DMA)
STM32CUBEMX配置教程(十三)STM32的定時器觸發的固定頻率DAC輸出(使用DMA)
發表于 11-24 14:06
?46次下載
STM32CubeMX實戰教程(五)——通用定時器(PWM輸出)
前言在上一章《STM32CubeMX實戰教程(四)——基本定時器(還是點燈)》中,已經介紹過基本定時器的功能及用法,在這一章中,我講主要介紹一下通用定時器的相關功能以及配置方法,廢話不
發表于 11-26 15:36
?13次下載
STM32的定時器TIM用作輸入捕獲
定時器TIM2的通道3(PA2)為輸入捕獲。分頻值根據自己需要設置,分頻值越大采出的頻率精度越低。周期最好拉滿,這樣采集時不會溢出。2.定時器TIM
發表于 12-14 18:58
?2次下載
STM32CUBEMX開發GD32F303(13)----定時器TIM捕獲PWM測量頻率與占空比
概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中進行開發,同時通過開發板內進行驗證。 本章STM32CUBEMX配置STM32F103輸出PWM,同時使
評論