当前位置:   article > 正文

【STM32CubeMX学习】定时器输入捕获读取红外NEC码_stm32cudemx输入捕获读取霍尔值

stm32cudemx输入捕获读取霍尔值

1、NEC编码介绍

NEC Protocol是目前广泛使用的红外遥控的编码,其载波频率位为38khz,即每秒可产生38000个脉冲,每个脉冲周期为:1000000us/38000=26.3us。

NEC协议采用脉冲间隔的方式编码每一位数据,用不同数据位的时间间隔来表示不同的逻辑位。

发送的数据高位在前。

注:遥控接收头在收到脉冲的时候为低电平,在空闲的时候为高电平

逻辑"0":562.5µs的有效脉冲 + 562.5µs的空闲间隔,总时长为1.125ms。

逻辑"1":562.5µs的有效脉冲 + 1.6875ms的空闲间隔,总时长为2.25ms。

起始位:9ms的有效脉冲 + 4.5ms的空闲间隔,总时长为13.5ms。

 以此为基础,NEC发送一帧数据:起始位 + 地址码 + 地址码反码 + 命令码 + 命令码反码

 重复码:当一直按着一个按键不放,在发送了一帧数据后,每隔110ms会发一个重复码。

9ms的有效脉冲 + 2.25ms的空闲间隔 ,总时长为11.25ms。

 2、STM32CubeMX配置

原理图如下:

STM32CubeMX配置如下:

分频系数为71,而主频为72mhz,因此定时器频率为72mhz/(71+1)=1mhz,即每1µs计数一次。

计数方式为向上计数。

自动加载值为最大值65535,65.535µs会溢出,大于所有的逻辑位,因此不用担心溢出问题。

使能自动加载。

下降沿触发。

 

 使能中断、引脚设置上拉。

3、代码解析NEC码

在TIM3初始化后启动输入捕获

  1. /* USER CODE BEGIN TIM3_Init 2 */
  2. HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3); //启动输入捕获
  3. /* USER CODE END TIM3_Init 2 */

 定义全局变量

  1. uint16_t IRTimer_Data = 0;//存放计数值
  2. uint32_t IRCode = 0;//存放红外码
  3. uint8_t IR_Flag = 0;//IR解析完成标志位
  4. uint8_t IR_LeaderCode = 0;

中断处理函数及解析函数

  1. /* USER CODE BEGIN 4 */
  2. void Paser_IRCode(uint16_t PData)
  3. {
  4. if((PData>12000)&&(PData<15000))//获得引导码,理论值13500
  5. IR_LeaderCode = 1;
  6. if(IR_LeaderCode==1)
  7. {
  8. if((PData>1000)&&(PData<1300))//0,理论值1125
  9. {
  10. IRCode=(IRCode<<1);
  11. i++;
  12. }
  13. else if((PData>2000)&&(PData<2500))//1,理论值2250
  14. {
  15. IRCode = (IRCode<<1)|0x01;
  16. i++;
  17. }
  18. if(i==32)
  19. {
  20. i = 0;
  21. IR_LeaderCode = 0;
  22. IR_Flag = 1;
  23. }
  24. }
  25. }
  26. void TIM_IRQHandler(void)
  27. {
  28. IRTimer_Data = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3);//获取当前的捕获值.
  29. __HAL_TIM_SET_COUNTER(&htim3,0); //设置计数寄存器的值变为0
  30. Paser_IRCode(IRTimer_Data);
  31. }

记得将函数放进中断函数里面

  1. void TIM3_IRQHandler(void)
  2. {
  3. /* USER CODE BEGIN TIM3_IRQn 0 */
  4. /* USER CODE END TIM3_IRQn 0 */
  5. TIM_IRQHandler();
  6. /* USER CODE BEGIN TIM3_IRQn 1 */
  7. /* USER CODE END TIM3_IRQn 1 */
  8. }

在main函数里打印NEC码

  1. /* Infinite loop */
  2. /* USER CODE BEGIN WHILE */
  3. while (1)
  4. {
  5. /* USER CODE END WHILE */
  6. /* USER CODE BEGIN 3 */
  7. if(IR_Flag ==1)
  8. {
  9. printf("%08x\r\n",IRCode);
  10. IR_Flag = 0;
  11. }
  12. }
  13. /* USER CODE END 3 */

遥控器在按下按键1的结果如下,可以看出,地址码是0x00,地址反码是0xff,命令码是0x68,命令反码是0x97。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/493134
推荐阅读
相关标签
  

闽ICP备14008679号