【STM8L】STM8L之红外发射(定时器中断产生38K信号)

摘自:http://blog.csdn.net/feilusia/article/details/53305956


一、简介

本文介绍STM8L系列如何使用红外发射管发射38K信号。

其中,红外协议采用为最常见的NEC协议,38K信号由定时器产生。


二、实验平台

编译软件:IAR for STM8 1.42.2

硬件平台:stm8l101f3p6开发板

仿真器:ST-LINK

库函数版本:STM8L_STMTouch_Lib_V1.1.0


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902


四、硬件原理

1、发射管元器件


附淘宝链接:

https://detail.tmall.com/item.htm?spm=a1z10.3-b.w4011-3079905380.29.6Sd192&id=16965424268&rn=40b8f46057241ffac5e0d72df2c9b8d7&abbucket=14


2、原理图


上图的蓝色部分为红外发射部分,R2为红外距离调节的电阻,阻值越小、距离越远。



五、基础知识

1、什么是红外?

答:红外是红外线的简称。红外是一种波长范围为760nm~ 1mm的电磁波,可以实现数据的无线传输,距离大概十几米以内,且需要对准接收端进行发射。

红外的成本比其它无线设备要低的多,所以家电遥控器大多采用红外控制。常见的红外设备:电视遥控器、空调遥控器等。

遥控器的基带通信协议有很多,大概有几十种。常见的红外协议: ITT 协议、NEC 协议(最常见)、Sharp 协议、Philips RC-5 协议、Sony SIRC 协议等。


2、什么是NEC协议?

答:NEC协议的数据格式:引导码、用户码、用户反码、键码、键码反码、停止位。


注意几点:

1)上图黑色部分为一定频率(如38K)的载波,并不是长时间的高电平。该载波可通过定时器定时翻转IO口或PWM来产生。

2)上图为发射端的信号波形,由于接收端空闲时为高电平、接收到载波时为低电平,因此接收端的信号波形与发射端信号波形完全相反,接收端信号波形如下图


3)时序如下:

①引导码:9ms 的载波+4.5ms 的空闲。
②比特值“0”:560us 的载波+560us 的空闲。
③比特值“1”:560us 的载波+1.68ms 的空闲。

4)举例(上图的接收信号波形来读数据):

①引导码:9ms 的载波+4.5ms 的空闲。

②用户码:0x00。

③用户码反码:0xFF。

④键码:0x30。

⑤键码反码:0xCF。

⑥停止位。

所以解析出来的红外键值为:0x00FF30CF(4个字节)。


3、本文中编码红外发射的流程是如何的?

答:

1)使用定时器2产生一个13us的定时中断(当13us翻转一次IO,产生的就是38K的频率)。

2)当需要发送红外键值时,按上图的NEC时序依次发送:引导码、用户码、用户反码、键码、键码反码、停止位。


六、实验前提

在进行本文步骤前,请先阅读并实现以下博文:

1、《STM8L之timer2》:http://blog.csdn.net/feilusia/article/details/53167211


七、实验步骤

1、修改定时器产生中断的时间(替换GUA_Timer2.c中的GUA_Timer2_Init)

由于香瓜使用的是内部晶振导致定时器不准,并且定时器产生13us时会影响代码正常运行,因此香瓜实测代码中设置为9us时能产生17us的红外载波。

2、工程中添加自己写的红外发射的驱动

1)写一个驱动GUA_Infrared_Send.c(存放在工程的USER文件夹中)

  1. //******************************************************************************                
  2. //name:             GUA_Infrared_Send.c               
  3. //introduce:        红外传感器发送驱动        
  4. //author:           甜甜的大香瓜                       
  5. //email:            897503845@qq.com           
  6. //QQ group          香瓜单片机之STM8/STM32(164311667)                        
  7. //changetime:       2016.11.16      
  8. //******************************************************************************     
  9. #include "stm8l10x.h"  
  10. #include "GUA_Infrared_Send.h"  
  11.   
  12. /*********************宏定义************************/  
  13. #ifndef U8    
  14. typedef unsigned char U8;    
  15. #endif    
  16.   
  17. #ifndef U16    
  18. typedef unsigned short U16;    
  19. #endif    
  20.   
  21. #ifndef U32    
  22. typedef unsigned long U32;    
  23. #endif    
  24.   
  25.   
  26.   
  27. /*********************外部变量************************/  
  28. //红外开关的标志位  
  29. U8 gGUA_Infrared_Flag = GUA_INFRARED_FLAG_OFF;  
  30.   
  31. //红外38K脉冲翻转次数  
  32. U16 gGUA_Infrared_Count = 0;  
  33.   
  34. //******************************************************************************          
  35. //name:             GUA_Infrared_Send          
  36. //introduce:        红外发送       
  37. //parameter:        nGUA_Data:要发送的数据         
  38. //return:           none        
  39. //author:           甜甜的大香瓜               
  40. //email:            897503845@qq.com           
  41. //QQ group          香瓜单片机之STM8/STM32(164311667)                        
  42. //changetime:       2016.11.16         
  43. //******************************************************************************    
  44. void GUA_Infrared_Send(U32 nGUA_Data)  
  45. {  
  46.   U8 i = 0;  
  47.     
  48.   //初始化红外,默认为关  
  49.   gGUA_Infrared_Flag = GUA_INFRARED_FLAG_OFF;  
  50.     
  51.   //9ms起始信号低电平,683*13us=8.879ms(后面的*3/4为实际的校准值)  
  52.   gGUA_Infrared_Count = 683*3/4;  
  53.   gGUA_Infrared_Flag = GUA_INFRARED_FLAG_ON;  
  54.   while(gGUA_Infrared_Count);  
  55.     
  56.   //4.5ms起始信号高电平,341*13=4.433ms(后面的*3/4为实际的校准值)  
  57.   gGUA_Infrared_Count = 341*3/4;  
  58.   gGUA_Infrared_Flag = GUA_INFRARED_FLAG_OFF;  
  59.   while(gGUA_Infrared_Count);  
  60.     
  61.   //循环发送32bit的数据  
  62.   for(i = 0; i < 32; i++)  
  63.   {  
  64.     //通用的0.56ms低电平,42*13us=0.546ms(后面的*3/4为实际的校准值)  
  65.     gGUA_Infrared_Count = 42*3/4;  
  66.     gGUA_Infrared_Flag = GUA_INFRARED_FLAG_ON;  
  67.     while(gGUA_Infrared_Count);      
  68.     
  69.     //数值0  
  70.     if((nGUA_Data & 0x80000000) == 0)  
  71.     {  
  72.       //0.565ms高电平,43*13us=0.559ms(后面的*3/4为实际的校准值)  
  73.       gGUA_Infrared_Count = 43*3/4;            
  74.     }  
  75.     //数值1  
  76.     else  
  77.     {  
  78.       //1.69ms高电平,128*13us=1.664ms(后面的*3/4为实际的校准值)  
  79.       gGUA_Infrared_Count = 128*3/4;  
  80.     }  
  81.       
  82.     //执行高电平  
  83.     gGUA_Infrared_Flag = GUA_INFRARED_FLAG_OFF;  
  84.     while(gGUA_Infrared_Count);  
  85.   
  86.     //数据移位  
  87.     nGUA_Data <<= 1;  
  88.   }  
  89.     
  90.   //0.263ms低电平作为结束位,20*13=0.26ms(后面的*3/4为实际的校准值)  
  91.   gGUA_Infrared_Count = 20*3/4;  
  92.   gGUA_Infrared_Flag = GUA_INFRARED_FLAG_ON;  
  93.   while(gGUA_Infrared_Count);  
  94.     
  95.   //关闭红外  
  96.   gGUA_Infrared_Flag = GUA_INFRARED_FLAG_OFF;    
  97. }  
  98.   
  99. //******************************************************************************          
  100. //name:             GUA_Infrared_Send_Init          
  101. //introduce:        红外发送初始化       
  102. //parameter:        none         
  103. //return:           none        
  104. //author:           甜甜的大香瓜               
  105. //email:            897503845@qq.com           
  106. //QQ group          香瓜单片机之STM8/STM32(164311667)                        
  107. //changetime:       2016.11.16         
  108. //******************************************************************************    
  109. void GUA_Infrared_Send_Init(void)  
  110. {  
  111.   //按红外IO配置为推挽输出  
  112.   GPIO_Init(GUA_INFRARED_SEND_PORT, GUA_INFRARED_SEND_PIN, GUA_INFRARED_SEND_MODE);   
  113.     
  114.   //关闭红外  
  115.   GPIO_WriteBit(GUA_INFRARED_SEND_PORT, GUA_INFRARED_SEND_PIN, GUA_INFRARED_OFF);    
  116. }  

由于定时器产生的中断不准,因此实际的时序需要根据逻辑分析仪上的实测波形来修改。


2)写一个驱动头文件GUA_Infrared_Send.h(存放在工程的USER文件夹中)

  1. //******************************************************************************                
  2. //name:             GUA_Infrared_Send.h               
  3. //introduce:        红外传感器接收驱动的头文件        
  4. //author:           甜甜的大香瓜                       
  5. //email:            897503845@qq.com           
  6. //QQ group          香瓜单片机之STM8/STM32(164311667)                        
  7. //changetime:       2016.11.16        
  8. //******************************************************************************      
  9. #ifndef _GUA_INFRARED_SEND_H_  
  10. #define _GUA_INFRARED_SEND_H_  
  11.   
  12. /*********************宏定义************************/    
  13. //红外发送引脚  
  14. #define GUA_INFRARED_SEND_PORT                  GPIOB  
  15. #define GUA_INFRARED_SEND_PIN                   GPIO_Pin_3  
  16. #define GUA_INFRARED_SEND_MODE                  GPIO_Mode_Out_PP_High_Fast  
  17.   
  18. //红外的IO电平宏  
  19. #define GUA_INFRARED_ON                         SET             //高电平触开启  
  20. #define GUA_INFRARED_OFF                        RESET           //低电平触关闭  
  21.   
  22. //红外标志宏  
  23. #define GUA_INFRARED_FLAG_OFF                   0               //发送端为高电平,接收端为低电平  
  24. #define GUA_INFRARED_FLAG_ON                    1               //发送端为低电平,接收端为高电平  
  25. /*********************外部变量************************/    
  26. extern unsigned char gGUA_Infrared_Flag;  
  27. extern unsigned short gGUA_Infrared_Count;  
  28.   
  29. /*********************外部函数声明************************/    
  30. extern void GUA_Infrared_Send(unsigned long nGUA_Data);  
  31. extern void GUA_Infrared_Send_Init(void);  
  32.   
  33. #endif  

3)工程中添加GUA_Infrared_Send.c



4)添加驱动的路径

注意USER文件夹是与“Project”等文件夹同级的自定义文件,用于存放香瓜写的代码。


2)修改定时器2中断服务函数

  1. //******************************************************************************          
  2. //name:             TIM2_UPD_OVF_TRG_BRK_IRQHandler          
  3. //introduce:        定时器2中断服务函数,当红外的标志位打开时,能产生38K频率;能计数进中断次数。       
  4. //parameter:        none         
  5. //return:           none        
  6. //author:           甜甜的大香瓜               
  7. //email:            897503845@qq.com                  
  8. //QQ group          香瓜单片机之STM8/STM32(164311667)                      
  9. //changetime:       2016.11.16                        
  10. //******************************************************************************    
  11. INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19)  
  12. {  
  13.   BitAction bGUA_Infrared_OnOff_Status = GUA_INFRARED_OFF;  
  14.     
  15.   //计数值计算  
  16.   if(gGUA_Infrared_Count > 0)  
  17.   {  
  18.     gGUA_Infrared_Count--;  
  19.   }  
  20.     
  21.   //红外标志被打开,则输出38K方波  
  22.   if(gGUA_Infrared_Flag == GUA_INFRARED_FLAG_ON)  
  23.   {  
  24.     //读取当前红外输出状态  
  25.     bGUA_Infrared_OnOff_Status = (BitAction)(GPIO_ReadOutputDataBit(GUA_INFRARED_SEND_PORT, GUA_INFRARED_SEND_PIN));  
  26.       
  27.     //如果当前关闭,则打开  
  28.     if(bGUA_Infrared_OnOff_Status == GUA_INFRARED_OFF)  
  29.     {  
  30.       GPIO_WriteBit(GUA_INFRARED_SEND_PORT, GUA_INFRARED_SEND_PIN, GUA_INFRARED_ON);      
  31.     }  
  32.     //如果当前打开,则关闭  
  33.     else  
  34.     {  
  35.       GPIO_WriteBit(GUA_INFRARED_SEND_PORT, GUA_INFRARED_SEND_PIN, GUA_INFRARED_OFF);       
  36.     }  
  37.   
  38.   }  
  39.   //红外标志被关闭  
  40.   else  
  41.   {  
  42.     //关闭红外  
  43.     GPIO_WriteBit(GUA_INFRARED_SEND_PORT, GUA_INFRARED_SEND_PIN, GUA_INFRARED_OFF);     
  44.   }  
  45.     
  46.   TIM2_ClearITPendingBit(TIM2_IT_Update);   
  47. }  

4、应用层中调用

1)添加头文件(main.c中)


2)初始化(main.c的main函数中)


3)添加测试代码(main.c的main函数中)

在这里发送键值0x00FF00FF。

八、实验结果

1、信号波形

利用与发射端相匹配的红外接收头将红外信号接收下来,同时使用逻辑分析仪抓取信号,如下图:


经解析此接收到的键值即为发射端发射的0x00FF00FF键值。


2、功耗

不开低功耗的正常运行时,功耗为2.5mA,发射红外信号时功耗为3.5mA。


3、阻值

当前实测红外调节距离的阻值为51欧姆,场地有限实测3~4米没问题。


因此,实验成功。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值