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

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

[复制链接]
STMCU-管管 发布时间:2020-12-2 13:01
STM32CUBEME--自定义红外NEC解码,定时器TIM捕获方式
概述
   本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。$ i+ q5 V: S; M/ f2 q, }
& z8 Z8 X% m6 Z5 B0 m5 [

$ Z5 P0 L  @1 U% H
硬件准备
    首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:   
6 L' x' b/ i! z% i$ L  F
11.png
选择芯片型号
       使用STM32CUBEMX选择芯片stm32f030r8,如下所示:* \) C' a9 ^4 t" H$ K0 X- u
12.png
配置时钟源
    HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:; ^& Q, J+ [: A+ I$ Z* @
13.png
配置时钟树
    STM32F0的最高主频到48M,所以配置48即可:
# f  k8 `4 W+ p- h/ j$ q
14.png
串口配置
    本次实验使用的串口1进行串口通信,波特率配置为115200。
, D; ?, {* t; e' j
15.png
定时器配置
   本次使用定时器1的通道2进行检测,配置入下。. h6 v  p1 Q# j, P* h7 h0 z! p2 ?
红外接收管
    这里使用VS838的接收管,如下所示:8 [# X" e+ M; d. d. y" q1 T
16.png
红外编码
     这里使用VS838的接收管,如下所示:$ C" |0 z* y. J4 V7 J7 V! e
17.png
NEC协议载波:38khz. S& `. H( z3 ^, Z+ c' ~
18.png

& |) o' y% k8 W* j/ P- l; d
  A/ l3 M- d. v$ O
自定义红外编码
    本文中数据1的低占空比设置为1120us,总时间为1.68ms,不是上图的2.25ms。1 V$ l1 {# Y9 I! K# h& K
    协议如下:
$ K. G' h4 F9 m0 m
19.png
生成工程设置
    注意在生产工程设置中不能出现中文,不然会报错。
1 g1 K* Z% T6 [) y8 Q# s
20.png
代码生成设置
    最后设置生成独立的初始化文件:0 R! p/ e/ i3 D: _, i
21.png
生成代码
22.png
配置keil
23.png
24.png
    在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。5 H, f/ Q" Q  ~2 W

  1. 6 ^4 O. ]+ f8 V$ h/ U3 b
  2. /* USER CODE BEGIN Includes */9 P) X2 Z) U1 _, W- ]! p  i
  3. #include "stdio.h"
    # m( \7 U' z! K3 U( _
  4. /* USER CODE END Includes */
复制代码
红外接收口定义 。$ L: o" F/ I, @
  1. 6 y/ O3 P% z4 r7 K* n1 c
  2. /* USER CODE BEGIN PTD */: I  T& E$ t, v3 Z7 F) \% H# @
  3. #define IR_IN1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)- M# \& z0 ?  M: Z
  4. /* USER CODE END PTD */
复制代码
  函数声明和串口重定向:, c. `% o4 [$ o8 O

  1. 2 {5 H, t" |# Q: o
  2. /* USER CODE BEGIN PFP */
      b' j' ^4 ?0 x& {6 s) D
  3. #ifdef __GNUC__
    9 P( t8 H% ]6 k$ ^( B, O
  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)" q" g& l: p6 B
  5. #else% l/ P) k  T; D. K3 O' ]
  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    / o; {3 k! A$ T) a" Z
  7. #endif /* __GNUC__ */
    9 m' |# ^9 d7 W6 x' B, Q
  8. PUTCHAR_PROTOTYPE
      W$ G3 m. T8 h% z2 A! J
  9. {: N& i5 d* G" A) s$ N
  10.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    . w1 W# z. h% i1 n! S
  11.     return ch;' E8 E2 o8 L& x$ d5 z7 i4 n
  12. }2 [2 A1 d9 B: T3 m6 N) U: L( ]
  13. /* USER CODE END PFP */
复制代码
  定时器配置:" w# V; x! O/ R9 `9 ?
  1.   /* USER CODE BEGIN 2 */, O# a# q0 T) z! d. ]  _+ b- f
  2.   HAL_TIM_Base_Start_IT(&htim1);//启动定时器) I2 x* k5 C& Q2 F
  3.   HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断
    " m! G$ a2 c; L0 d- ?$ }
  4.   printf("IR Capture !! \r\n");0 I1 h( C+ H8 B2 d4 E3 q0 Y3 |
  5.   /* USER CODE END 2 *
复制代码
  红外接收代码
" r4 P( g7 M" f+ h* V/ s$ g  |0 o5 W

. @' S  Z+ Y9 Z' `5 q4 y* @$ `* S" a[4400,5000]是用于捕获4.5ms的信号! q! k0 A6 b( Y5 e9 I
1 ?& T# P/ m# k2 i
; a; b+ Q$ l: |( \2 `3 z2 K
[550,700]是用于捕获560us的数据0信号8 \; j: ?+ m% ?# j  c* L

7 V6 [) p* b, r1 ?2 U4 V. U
: V; x; W2 w# o- |6 N
[1100,1250]是用于捕获1120us的数据1信号3 S/ s7 F, F* B# N; _$ [
% B; ]# K4 C" J- F$ }& a
5 L1 O2 T9 s( c8 Y) [3 G# I$ _, i
[2000,2500]是用于捕获2240us的截止位信号
7 _. {' o3 v+ t; T" v2 _

  1. 2 ^# C* c/ s8 {6 H* \' ~' w& j1 H
  2. /* USER CODE BEGIN 4 */
    ) x: _: N* h% J8 d' Z
  3. // 捕获中断回调函数,每次捕获到信号就会进入这个回调函数/ t' Y& I  x% p3 L. I3 f- x/ z
  4. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)9 U5 m2 j! X. k+ t" G
  5. {2 N- v- I% L1 [
  6.   uint32_t fallingCount = 0 ; // 下降沿计数
    $ k9 e2 l( k* E8 q; D$ U
  7.   uint8_t temp = 0 ;) y9 g) J: H& X' F2 p; B; \, w
  8.   // 判断是否是定时器1的外部捕获口2
    / Z9 ?( ]# p5 d$ r1 f3 S0 ?5 Z
  9.   if(htim->Instance == TIM1)( M7 Y+ R0 d8 v0 h4 ~( i
  10.   {/ F" j8 P  x% o; M9 N
  11.     // 捕获到了上升沿
    - Z! Z7 u, F& {  p- E: o
  12.     if(IR_IN1)7 M  i; P3 N3 ?6 c6 L& o8 U
  13.     {0 C1 k& p6 a  S
  14.       __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); // 改变捕获极性为下降沿捕获0 h( Z$ q! ^$ s* k) C
  15.       __HAL_TIM_SET_COUNTER(htim, 0); // 计数清零,从头开始计
    % g7 Y. c. P. P9 K& G7 q
  16.     }- ^/ i( f) H* O8 J/ U: {9 e
  17.     else6 Q& G- N' j. {6 t
  18.     {
    " ^3 @  X9 E3 q. s
  19.       fallingCount = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); // 读取捕获计数,这个时间即为上升沿持续的时间
    # [2 }. a* H9 K
  20.       __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); // 改变捕获极性为上升沿捕获
    $ D% h, z! ?3 v3 x1 u
  21.       if( ((fallingCount > 4400) && (fallingCount <5000)))
    9 X4 h, ?; z4 j3 q
  22.         OK = 1;/// 4.5ms引导电平' c0 v: {7 C& t
  23.       else if (((fallingCount > 550) && (fallingCount < 700)))  
    ( N  S, y) t2 r  M, p
  24.       {
    " F6 X8 [$ c5 o" x( V: D3 ?  W
  25.         temp = 0;//560 us,数据为0
    8 V7 h3 y4 l, A- B
  26.       }  ! N( ~0 x5 o* e
  27.       else if (((fallingCount > 1100) && (fallingCount < 1250)))
    ; W; k% ?( T( U5 O! f1 }
  28.       {- m  ~1 Y+ g& ~+ D
  29. 4 K! p4 y4 F. ?; S. Q% ?( Q6 `2 ~
  30.         temp = 1;//1120 us,数据为19 u% x: p+ _+ ~% T! p- ], q
  31.       }. t5 Q# v) `: y9 k

  32. + C' t4 i' [, F5 r( U
  33.       else if (ReadyFlag==0&& ((fallingCount > 2000) && (fallingCount < 2500)))  //2.240ms截止码
    ; r  M2 F/ a2 o3 U0 F
  34.       {6 X+ x$ a& G, j5 i0 h% r
  35.         ReadyFlag = 1 ;
    : Z( G" d4 H3 Q* P" M
  36.         OK = 0;
    9 h' k$ k5 P: J* ^: K4 v0 U
  37.       }; B1 B7 p4 j9 d( ?$ O0 U
  38.       if(OK)1 n+ a- e  I3 C9 {+ u$ {9 h
  39.       {! g" Q) c; Z3 W* o7 p
  40.         OrderData <<= 1 ;- H2 Y; b1 i$ J' ^3 _7 ?! a
  41.         OrderData += temp ;+ Y) f. N7 L) u9 B
  42.         KeyCount = 0; // 按键次数  f0 ]+ W' k* V# h; W1 P( k
  43.       }
    ; S! c5 o: w) z  I4 m0 f3 z1 G
  44.     }
    2 M7 v' v, }$ U8 s+ n! u
  45.   }
    , }& k! ~1 ~: {) i$ n5 z9 w
  46. }
    " O" m0 R) x$ G2 N" j
  47. /* USER CODE END 4 */
复制代码
   主函数。- w" `+ f1 n- \
  1. /* USER CODE BEGIN WHILE */
    2 Z  t$ W' ~5 P4 {
  2.   while (1)) m7 l# i7 P, R0 g% ~4 M0 T: j
  3.   {
    ! D  `) I& v7 }& c' [8 J4 O+ L
  4.     /* USER CODE END WHILE */
    ' F, `4 L5 j3 h' Y+ t3 p

  5. 6 l! D3 D0 D, l' L) A- s6 }3 A/ P
  6.     /* USER CODE BEGIN 3 */) |7 i. q& J$ v; V( n
  7.     if(ReadyFlag)2 c; n5 L& s, \! N$ v: ~
  8.     {, H4 B# ~  Z- c& ?
  9.       printf("order=%08X , code=%d\r\n",OrderData,OrderData);0 f% p5 U- \) N3 c0 S+ P
  10.       OrderData = 0;
    - p9 k2 }/ L1 L0 P
  11.       OK = 0;! H: \0 x0 {( p% M; J/ t8 I% {
  12.       ReadyFlag = 0;   
    . D" j0 _# t% c
  13.     }
    1 k4 M6 _8 ^& n7 @3 W7 b
  14.   }
复制代码
演示效果
    红外连续发送5次码值,发送分别为:
* [% }% [9 z& p- j+ E4 t( T# z' ?- I5 V7 u; z

$ t& h( I+ ^0 ]4 X" C1011(11)
! ^' M6 ^) e4 x5 H# L1 @11 1010(58)
6 }! K3 _& n8 H1 |11 0001(49)6 k* x5 Y( d  W7 O) a) m: `  q
11 1111(63)6 U2 s6 J5 _/ Y( Y* P, h6 n2 O6 x
11 0011(51)
- q2 `8 f: y$ p0 N# G    分别如下所示:& ]2 U8 Y, p% i# f" U! _& H# M
$ U1 t: \  q$ d% s( q4 m9 w# [
; B0 p$ y1 p: v+ E3 C

2 ]6 p' D8 |0 L8 v) x9 z! ]/ Q5 ^

1 Y9 t+ z) x% i! F; o/ n, F# U! a6 h, Y( ^- E3 |8 p9 @
赞 收藏 评论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 手机版