你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CUBEME--自定义红外NEC解码,定时器TIM捕获方式

[复制链接]
STMCU-管管 发布时间:2020-12-2 13:01
STM32CUBEME--自定义红外NEC解码,定时器TIM捕获方式
概述
   本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。4 v# Z! a3 F: R1 y0 u3 l
/ ^% ]. N7 u# @
6 u3 ?' j8 v7 Z
硬件准备
    首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:    5 T) Y0 v. x- m' H7 W
11.png
选择芯片型号
       使用STM32CUBEMX选择芯片stm32f030r8,如下所示:" X0 l0 R8 Y/ [& ~: n+ a4 v
12.png
配置时钟源
    HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:
7 e9 d( h* h, A+ t
13.png
配置时钟树
    STM32F0的最高主频到48M,所以配置48即可:
7 [+ L4 P% W6 b  b2 q
14.png
串口配置
    本次实验使用的串口1进行串口通信,波特率配置为115200。/ s+ Z4 d0 g+ T& R0 O6 U
15.png
定时器配置
   本次使用定时器1的通道2进行检测,配置入下。; a9 H+ [) U  k) q& b
红外接收管
    这里使用VS838的接收管,如下所示:% I" a( I- O& L  y! Y+ H
16.png
红外编码
     这里使用VS838的接收管,如下所示:! d- q3 }3 Z! z/ s- N
17.png
NEC协议载波:38khz# F9 I" `% h( ^; C- R5 `  i3 H
18.png

: n. z9 h$ o# ~& S  m6 h& U/ I, T" A5 j1 w# u
自定义红外编码
    本文中数据1的低占空比设置为1120us,总时间为1.68ms,不是上图的2.25ms。
6 w1 P6 O% ]: g) f- V% R) A8 H    协议如下:9 a8 b; u% s- _+ J% c% C" k8 I
19.png
生成工程设置
    注意在生产工程设置中不能出现中文,不然会报错。( U; m/ i  a4 N2 l  ^1 b2 E  v
20.png
代码生成设置
    最后设置生成独立的初始化文件:
# ^, l" w3 u2 Y! t/ K9 a
21.png
生成代码
22.png
配置keil
23.png
24.png
    在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。, l8 w' M4 E/ T2 G/ \

  1. - B3 r, J- s4 b
  2. /* USER CODE BEGIN Includes */
    4 |- p1 I% O8 S8 }5 \1 g
  3. #include "stdio.h"
    & l8 h! E: _6 ~/ K) Y( B# Y' |
  4. /* USER CODE END Includes */
复制代码
红外接收口定义 。$ b. \1 G- }* p( n0 m

  1. / n: ?- [8 O( }- e; ~* X7 m2 f
  2. /* USER CODE BEGIN PTD */+ z. ^  ^9 P" f. u* E
  3. #define IR_IN1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)
    8 ?1 u1 Z' {& F! w+ V( V2 I
  4. /* USER CODE END PTD */
复制代码
  函数声明和串口重定向:
5 q! f) U4 D  [4 _; E& Q

  1. . ]  D$ }& D' L$ }7 }* P0 k
  2. /* USER CODE BEGIN PFP */! G8 s' k7 h7 f- S6 w. l( G
  3. #ifdef __GNUC__
    ' s( v: {' T1 U5 E5 n! l4 R
  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)4 h. \1 C! ?( G0 a0 ?- Q
  5. #else! s- @& V- }' _% V! }+ M9 e; p
  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)# M7 Z4 p! {3 W7 u3 J
  7. #endif /* __GNUC__ */
    % D; K" p: ]5 g+ C7 q. V
  8. PUTCHAR_PROTOTYPE% Q; S" k: p) k0 b, r# k4 @+ B# W  p
  9. {
    2 {/ H0 K& O( G. ?  ]: ~
  10.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);6 Q: o0 L( l# C* {; m6 v1 E
  11.     return ch;
    ( b. X! A! K6 d7 U% [
  12. }% P" ?3 z9 ~4 A' L% @: c
  13. /* USER CODE END PFP */
复制代码
  定时器配置:$ E* I0 K! w! E6 a" m4 C
  1.   /* USER CODE BEGIN 2 */0 w9 b: S/ q. H8 i4 T' n5 l7 i
  2.   HAL_TIM_Base_Start_IT(&htim1);//启动定时器* l/ i& G' c8 k, D
  3.   HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断0 P( _7 A4 P& t& g# k  }
  4.   printf("IR Capture !! \r\n");
    * V9 H& _- M8 k
  5.   /* USER CODE END 2 *
复制代码
  红外接收代码1 g5 T/ V- G  |
/ z/ M' s7 w% H! }1 w1 z

; K0 R+ ^/ T' P2 D[4400,5000]是用于捕获4.5ms的信号! C4 }. b+ Q" s" {# {

! r0 N6 L5 E1 C+ S* h0 j" r

1 _0 g% _" }3 N  \& G4 \5 ~[550,700]是用于捕获560us的数据0信号' n6 g0 R$ v; J4 f/ ?; f

! a0 @2 [5 {+ Z, f0 C) F  b/ v
( e7 e* n: Y4 M! t
[1100,1250]是用于捕获1120us的数据1信号
8 {; N2 I6 O: d
) H" S: p. b' l! ]+ e9 P6 x  {

8 g5 T& F9 Y0 z[2000,2500]是用于捕获2240us的截止位信号9 t4 z" H/ d  g0 Q' y

  1. ! }% \4 i# z% @. [" }
  2. /* USER CODE BEGIN 4 */
    7 c0 p: }8 e0 t: v
  3. // 捕获中断回调函数,每次捕获到信号就会进入这个回调函数0 q. ^4 D/ B$ L) i$ N- ~$ Q+ w
  4. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    1 z/ w! x& D1 F1 `
  5. {
    8 r7 ]. }, ]& c* _
  6.   uint32_t fallingCount = 0 ; // 下降沿计数
    7 o5 t& }+ [; ^' a- o  g
  7.   uint8_t temp = 0 ;
    ! c9 `8 p+ M/ H  [3 w% T2 z3 m
  8.   // 判断是否是定时器1的外部捕获口2
    ' i$ l$ d) l& }* E2 |9 D1 h9 }
  9.   if(htim->Instance == TIM1)" j; K: Y: G+ O! b
  10.   {! @. \! a; D7 A- Z. G6 R
  11.     // 捕获到了上升沿
    ' b3 l$ o, C/ y, V0 }. u6 @% M( o2 b
  12.     if(IR_IN1)
    0 p' s. N- E# g8 I! N
  13.     {
    ( x1 ]/ d. S  l* L9 p) N; D& u
  14.       __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获
    6 ^' d' y) a2 H: s
  15.       __HAL_TIM_SET_COUNTER(htim, 0); // 计数清零,从头开始计
    4 D$ \( o3 i' N1 `1 Q, T$ `/ G
  16.     }
    # Q! {+ q- R. f2 {. s
  17.     else
    8 W1 {& L# `8 t) \% U! }
  18.     {
    8 H6 D0 k& Q- `  A
  19.       fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 读取捕获计数,这个时间即为上升沿持续的时间( M  M2 _- s7 T) k/ p
  20.       __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿捕获
    $ H  V3 j. M& c. I7 J, X
  21.       if( ((fallingCount > 4400) && (fallingCount <5000))) % Z, i$ Y0 b7 z" K
  22.         OK = 1;/// 4.5ms引导电平
    9 L1 E) Z, P1 V3 g2 `  I) O) [
  23.       else if (((fallingCount > 550) && (fallingCount < 700)))  
    : X, l. Z; w% h3 g4 i* ~! c
  24.       {
    ' V6 w) v( v) O6 I
  25.         temp = 0;//560 us,数据为0
    2 `4 ?2 v% y' Q% A' j
  26.       }    A; c2 q% z2 X4 U
  27.       else if (((fallingCount > 1100) && (fallingCount < 1250)))
    1 K& ~# X6 u2 B4 J
  28.       {
    9 w3 B; L1 @, J
  29. 4 m7 H( M7 R/ J9 c( V
  30.         temp = 1;//1120 us,数据为1
    " e$ N/ W, Y& t4 O4 ^3 t
  31.       }
    * l* h/ U( ^% F; J3 f! Q3 I8 @
  32. % [' a9 p# w* W3 ~6 B; T1 f+ ?
  33.       else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500)))  //2.240ms截止码
    , J2 i% T+ D$ w+ F2 i3 t% [
  34.       {
    # R* A2 e4 c# n, t% U$ A
  35.         ReadyFlag = 1 ;; o' @% P2 c4 o
  36.         OK = 0;( ^9 @$ M/ {6 ]1 w! S: l
  37.       }
    5 Z+ e6 M1 W0 D- m1 F$ v' R% s/ N
  38.       if(OK)
    - L5 `: b/ L; v3 F: g1 v) B$ w
  39.       {
    - V0 b; _* R4 ]: j9 J" F/ r" J  t* U
  40.         OrderData <<= 1 ;
    % K. a; S6 F/ g# m$ v* G# @% {$ W
  41.         OrderData += temp ;
    ; L: @/ g  c5 Z4 K1 N: X
  42.         KeyCount = 0; // 按键次数
    + m" v- c) D# J# c( s: k
  43.       }
    $ n5 h  T, [# W7 x
  44.     }
    2 i9 B8 w. T( k' H5 r' w
  45.   }. i4 s( c2 q: \7 J5 |+ x
  46. }
    2 Y4 M; V! Z0 m, V
  47. /* USER CODE END 4 */
复制代码
   主函数。  w' {* {. A- |+ z% ^9 ~) J  U/ f' l
  1. /* USER CODE BEGIN WHILE */
    7 ^- j6 Q7 |, D4 p& G/ }
  2.   while (1)
    # P  }3 V* I: G% q0 h+ O
  3.   {$ u2 H. J0 j1 _3 d
  4.     /* USER CODE END WHILE */
    8 ?- }) p- o: B6 r& Q2 j

  5. 2 \% B2 h" x8 L
  6.     /* USER CODE BEGIN 3 */# q, h" b) u6 W9 L3 q
  7.     if(ReadyFlag)
    ( u6 J5 P" I6 U
  8.     {
    : j& [# g- ~9 m3 ^. W
  9.       printf("order=%08X , code=%d\r\n",OrderData,OrderData);
    # }. U/ ]6 L- @
  10.       OrderData = 0;
    ! Y7 i6 A" r4 c+ P4 R
  11.       OK = 0;
    3 U. o8 ?8 N( L* y
  12.       ReadyFlag = 0;    ! I$ m% a1 S+ k  I
  13.     }
    / o1 t' K9 W1 A
  14.   }
复制代码
演示效果
    红外连续发送5次码值,发送分别为:, L! ?# T+ W' j- o
7 T: l# a. @( t; }

2 n; h/ ?5 f1 [( Z2 q9 k1 C! D# ]1011(11)+ E& f) d7 V( f5 i4 s
11 1010(58)
; l' o# J" g& r6 V3 s; n* o11 0001(49)3 j7 `4 {" v7 t0 p, O( u9 J. s
11 1111(63)
. d. A3 I0 z6 h; U- Z7 A11 0011(51)
+ m. s6 t# n2 [9 X$ _9 h; P    分别如下所示:6 X: t9 G" y4 `9 r8 z1 ^4 v

/ r0 |& t2 l  x- g. ~( o
( [4 J: I  e6 _1 ~: G
% E; r* x: E8 j3 Q1 o- S
& Y) c# d0 I+ p2 c* ]5 b( d

$ ^) P: p& g" Q: ^
赞 收藏 评论1 发布时间:2020-12-2 13:01

举报

1个回答
goyhuan 回答时间:2020-12-2 14:53:02
红外接收很通用

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版