精华内容
下载资源
问答
  • 红外接收二极管的型号有HP型、TDE型、OSD型、J16型等多种,下面介绍部分型号的主要参数供选用时参考。 下表是部分型号的红外接收二极管的主要参数。 表:部分型号红外接收二极管参数  
  • 红外接收解码

    2012-01-28 23:45:34
    红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞...
  • 红外接收二极管电路图一: 如图所示,图是红外线遥控接收装置实例。红外线传感器有多种,这里选用光电二极管TPS604。工作原理简介如下:光电二极管TPS604接收到被调制的红外线的微弱信号,先经场效应晶体管VT1的...
  • 红外接收

    千次阅读 2014-12-12 14:14:26
    红外接收头 红外线接收头就是通过红外线发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同。 中文名红外接收头 外文名LED 的 发部构造与 红外线部构造与普 目录 1...
    红外接收头
    
    红外线接收头就是通过红外线发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同。
    中文名红外接收头
    外文名LED
    的    发部构造与
    红外线部构造与普
    目录
    1元件介绍
    2基本原理
    3遥控系统
    4应用领域
    1元件介绍

    红外信号收发系统的典型电路如图1所示,红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。 内部电路包括红外监测二极管,放大器,限幅器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流 信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出 高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
    红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制 载波的不同应选用相应解调频率的接收头。


    大体积红外接收头IRM38A引脚说明

    红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。 有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。
    红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,家庭遥控推荐使用红外发射管(L5IR4-45)的可产生37.91KHz的PWM, PWM占空比设置为1/3, 通过简单的定时中断开关PWM, 即可产生 发射波形。
    2基本原理




    我们知道,人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。
    3遥控系统




    红外遥控的概述:
    红外线的光谱位于红色光之外, 波长是0.76~1.5μm,比红光的波长还长。红外遥控是利用红外线进行传递信息的一种控制方式,红外遥控具有抗干扰,电路简单,容易编码和解码,功耗小,成本低的优点。红外遥控几乎适用所有家电的控制。
    红外遥控系统的主要部分为调制、发射和接收,如图 所示:


    图1 红外遥控系统
    1.调制
    红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源 功耗。
    调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的 455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。


    图2 载波波形
    2.发射系统
    目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。由于发射系统一般用电池供电,这就要求芯片 的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗。芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常 一点误差可以忽略不计。
    红外线通过红外发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同,材料和普通发光二极管不同,在红外发射管两端施加一定电压时,它发出的是红外线而不是可见光。


    图3b 射极输出驱动电路


    图3a 简单驱动电路
    如图3a和图3b是LED的驱动电路,图3a是最简单电路, 选用元件时要注意三极管的开关速度要快,还要考虑到LED的正向 电流和反向漏电流,一般流过LED的最大正向电流为100mA,电流越大,其发射的波形强度越大。
    图3a电路有一点缺陷,当电池电压下降时,流过LED的电流会降低,发射波形强度降低,遥控距离就会变小。图3b所示的 射极输出电路可以解决这个问题,两个二极管把三级管基极电压钳位在1.2V左右,因此三级管发射极电压固定在0.6V左右, 发射极电流IE基本不变,根据IE≈IC,所以流过LED的电流也基本不变,这样保证了当电池电压降低时还可以保证一定的遥 控距离。
    4应用领域




    红外接收头广泛应用于:空调、风扇、暖风机、加湿器、电视、DVD、机顶盒、车载移动DVD、硬盘播放器、多媒体组合音响、数码相框、手机等家电产品,电脑及周边设备,感应洁具,仪表,工业自动化,遥控玩具,通讯器材,照相器材,事务机器,金融电子,汽车电子,灯饰照明等领域。[1] 
    展开全文
  • 1838红外接收

    千次阅读 2015-06-08 20:57:12
    接收部分 类 型 电器元件 红外遥控系统 调制、发射和接收 目录 1红外遥控系统结构 2一体化红外接收头 1红外遥控系统结构编辑 红外
    1838红外接收头

    中文名
    1838红外接收头
    分    布
    接收部分
    类    型
    电器元件
    红外遥控系统
    调制、发射和接收

    1红外遥控系统结构编辑

    红外遥控系统主要分为调制、发射和接收三部分,如图1 所示:
    图1 红外遥控系统。
    1838 红外接收头为接收部分。

    2一体化红外接收头编辑

    红外信号收发系统的典型电路如图1所示, 红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。
    内部电路包括红外监测 二极管放大器,限副器,带通 滤波器积分电路比较器等。红外监测 二极管监测到红外信号,然后把信号送到 放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通 滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和 积分电路进入 比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
    一体化 红外接收头,如图2所示:
    红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。
    红外接收头内部 放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。
    有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。
    图2 红外接收
    收藏
    59
    21

    1838红外接收头编辑

    本词条缺少 概述名片图,补充相关内容使词条更完整,还能快速升级,赶紧来 编辑吧!
    中文名
    1838红外接收头
    分    布
    接收部分
    类    型
    电器元件
    红外遥控系统
    调制、发射和接收

    1红外遥控系统结构编辑

    红外遥控系统主要分为调制、发射和接收三部分,如图1 所示:
    图1 红外遥控系统。
    1838 红外接收头为接收部分。

    2一体化红外接收头编辑

    红外信号收发系统的典型电路如图1所示, 红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。
    内部电路包括红外监测 二极管放大器,限副器,带通 滤波器积分电路比较器等。红外监测 二极管监测到红外信号,然后把信号送到 放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通 滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和 积分电路进入 比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
    一体化 红外接收头,如图2所示:
    红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。
    红外接收头内部 放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。
    有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。
    图2 红外接收
    展开全文
  • 本单元就是来完成一体化接收头接受到的红外遥控器编码后的输出数据,所以只要单片机完成本单元的解码任务,并成功实现之后,只要将IR引脚接上红外接收头之后就可以实现红外遥控的功能了。这是我积累前人经验和自己实践...
  • STM32——红外接收和红外发射

    千次阅读 2019-12-07 16:00:40
    红外数据接收:定时器捕获红外信号(还有一个是通过外部中断的,这里不列出) 红外数据发射:使用PWM输出 下面直接上代码 remote.c /*remote.c*/ #include "remote.h" #include "delay.h" #include ...

    这里没有解析红外的函数,毕竟考虑到学习的红外有几种协议(如:NEC).同时代码存在一些问题(有部分遥控是学习不了的(如:空调、DVD)).

    红外数据接收:定时器捕获红外信号(还有一个是通过外部中断的,这里不列出)
    红外数据发射:使用PWM输出
    下面直接上代码

    remote.c

    /*remote.c*/
    #include "remote.h"
    #include "delay.h"
    #include "usart.h"
    
    /**
    发射:PA7-TIM3-CH2
    接收:PC8-TIM8-CH3
    
    TIM8:
    下面代码中捕获中断和定时中断分开,不在同一中断函数,所以需要配置两次中断优先级(应该可以合在一起配置)
    */
    
    /**
     *  @name			void Remote_Init(void) 
     *	@description	红外遥控初始化 设置IO以及定时器8的输入捕获
     *                  Infrared remote initializer sets IO and timer 8 input capture
     *  @notice			
     */
    void Remote_Init(void)    			  
    {  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_ICInitTypeDef  TIM_ICInitStructure;  
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); //使能PORTB时钟 
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);                      //TIM8 时钟使能 
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                //PC8 输入 
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                    //浮空输入 
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOC, &GPIO_InitStructure);
    	GPIO_SetBits(GPIOC,GPIO_Pin_8);                                          //初始化GPIOC.8
    
    	TIM_TimeBaseStructure.TIM_Period = 9999;                                 //设定计数器自动重装值 最大10ms溢出  
    	TIM_TimeBaseStructure.TIM_Prescaler =(72-1);                             //预分频器,1M的计数频率,1us加1.	   	
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                  //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;              //TIM向上计数模式
    	TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);                          //根据指定的参数初始化TIMx
    
    	TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;                         // 选择输入端 IC4映射到TI4上
    	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;              //上升沿捕获
    	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                    //配置输入分频,不分频 
    	TIM_ICInitStructure.TIM_ICFilter = 0x03;                                 //IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
    	TIM_ICInit(TIM8, &TIM_ICInitStructure);                                  //初始化定时器输入捕获通道
    	TIM_Cmd(TIM8,ENABLE );                                                   //使能定时器4
    
    	NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;                       //TIM8TIM8捕获比较中断
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                //先占优先级0级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                       //从优先级3级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                          //IRQ通道被使能
    	NVIC_Init(&NVIC_InitStructure);                                          //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器	
    	TIM_ITConfig( TIM8,TIM_IT_CC3,ENABLE);                                   //允许更新中断 ,允许CC4IE捕获中断		
    	
    	NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;                       //TIM3中断
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                //先占优先级0级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                       //从优先级3级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                          //IRQ通道被使能
    	NVIC_Init(&NVIC_InitStructure);                                          //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器	
    	TIM_ITConfig( TIM8,TIM_IT_Update,ENABLE);                                //允许更新中断 ,允许CC4IE捕获中断								 
    }
    /**
     *  @name			void TIM3_PWM_Init(u16 arr,u16 psc)
     *	@description	初始化定时器3的设置,将定时器3用于PWM调制,PWM输出口为 PA.7
     *	@param			arr --	u16,定时器重装值
    					psc --	u16,定时器分频值							
     *	@return		
     *  @notice			PWM频率 = 72M/((arr+1)*(psc+1)),这里用作红外发射的载波,需要生成38kHz的方波,故取arr = 1895,psc = 0。
     */
    void TIM3_PWM_Init(u16 arr,u16 psc)
    {
    	/* 初始化结构体定义 */
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef	TIM_TimeBaseInitStructure;                        //定时器基本设置
    	TIM_OCInitTypeDef 	TIM_OCInitStructure;                                  //定时器比较输出配置
    
    	/* 使能相应端口的时钟 */
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);                      //使能定时器2时钟
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设时钟
    	
    	/* GPIOA.7初始化 */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                 // TIM3 CH2
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                           // PA.7 复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	GPIO_SetBits(GPIOA,GPIO_Pin_7);
    
    	/* TIM3 初始化*/
    	TIM_TimeBaseInitStructure.TIM_Period = arr;                               //下一个更新事件装入活动的自动重装载寄存器周期的值
    	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;                            //作为TIMx时钟频率除数的预分频值 
    	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;                          //时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;           //TIM向上计数模式
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    
    	/* 定时器TIM3 Ch2 PWM模式初始化 */
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                         //选择定时器模式:TIM PWM1   TIM_OCMode_PWM1
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;             //比较输出使能
    	TIM_OCInitStructure.TIM_Pulse = (arr+1)/3;                                //占空比1:3 (arr+1)/10  3
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                 //输出极性:TIM输出比较极性高   TIM_OCPolarity_High
    	TIM_OC2Init(TIM3, &TIM_OCInitStructure);
    
    	/* 使能TIM3在CCR1上的预装载寄存器 */
    	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); 
    }
    
    
    u8 	RmtSta=0;                    //红外学习上升或下降标志位
    u16 Dval;                        //上升沿、下降沿的计数器的值
    u8  RmtCnt=0;                    //定时器红外学习计数超时标志位	  
    u8  PulseTabCnt=0;               //上升沿下降沿计数器的值
    u16 PulseTab[MAX_PULSE_LEN]={0}; //红外学习存储数据
    u8  Flag_LearnState = 0;         //红外学习标志位
    
    /**
      *@name  void TIM8_UP_IRQHandler(void)
      *@brief TIM8的定时计数中断函数
      *       The timing count interrupt function of TIM8
      *@note
      */
    void TIM8_UP_IRQHandler(void)
    {
    	if(TIM_GetITStatus(TIM8,TIM_IT_Update)!=RESET)
    	{
    		if(RmtCnt++>50)
    		{
    			RmtCnt = 0;
    
    			if(RmtSta)
    			{
    				RmtSta = 0;
    				Flag_LearnState = 1;
    			}
    		}
    	}
    	TIM_ClearITPendingBit(TIM8,TIM_IT_Update);	 	    
    }
    
    /**
      *@name  void TIM8_CC_IRQHandler(void)
      *@brief 捕获红外载波的高低电平宽度,记录到数组PulseTab
      *       Capture the high and low level width of the infrared carrier and record it to the array PulseTab
      *@note
      */
    void TIM8_CC_IRQHandler(void)
    { 		    	 
    	if(TIM_GetITStatus(TIM8,TIM_IT_CC3)!=RESET)                 //获取上升沿或下降沿状态
    	{	  
    		if(RDATA)                                               //上升沿捕获
    		{
    			Dval=TIM_GetCapture3(TIM8);                         //读取CCR4也可以清CC4IF标志位
    			
    			TIM_OC3PolarityConfig(TIM8,TIM_ICPolarity_Falling); //CC4P=1	设置为下降沿捕获
    			
    			TIM_SetCounter(TIM8,0);                             //清空定时器值
    			
    			if(RmtSta&0X01)
    			{
    				PulseTab[PulseTabCnt++] = Dval;
    				
    				RmtSta = 0x10;
    			}
    			else
    			{
    				RmtSta = 0X10;                                  //标记上升沿已经被捕获
    			}
    		}
    		else                                                    //下降沿捕获
    		{
    			Dval=TIM_GetCapture3(TIM8);                         //读取CCR4也可以清CC4IF标志位
    
    			TIM_OC3PolarityConfig(TIM8,TIM_ICPolarity_Rising);  //CC4P=0	设置为上升沿捕获
    			
    			TIM_SetCounter(TIM8,0);                             //清空定时器值
    			
    			if(RmtSta&0X10)                                     //完成一次高电平捕获 
    			{
    				PulseTab[PulseTabCnt++] = Dval;
    				
    				RmtSta = 0x01;
    			}
    			else 
    			{
    				RmtSta = 0x01;
    			}
    		}				 		     	    					   
    	}
    	TIM_ClearITPendingBit(TIM8,TIM_IT_CC3);	 	    
    }
    
    /**
      *@name            void Infrared_Send_IR1(u16 *irdata,u32 irlen)
      *@description     红外信号发射函数
      *@param           irdata --   u16,红外数据
                        irlen  --   u32,红外数据长度							
      *@return		
      *@notice			
      */
    void Infrared_Send(u16 *irdata,u32 irlen)
    {
    	u32 i;                                      //用于下面的for循环
    
    	for(i=0; i<irlen && irdata[i]!=0xffff; i++) //循环,从i=0开始,当i<irlen 并且 irdata[i] != 0xffff 时成立,当其中一个不成立,退出循环
    	{
    		if(i%2 == 0)                            //偶数的下标的数组成员延时拉高电平
    		{
    			TIM_Cmd(TIM3,ENABLE);
    			
    			delay_us(irdata[i]);
    			
    			TIM_Cmd(TIM3,DISABLE);
    			
    			GPIO_SetBits(GPIOA,GPIO_Pin_7);			
    		}
    		else
    		{
    			GPIO_SetBits(GPIOA,GPIO_Pin_7);
    			
    			delay_us(irdata[i]);
    		}
    	}
    	
    	delay_us(555);
    	
    	GPIO_ResetBits(GPIOA,GPIO_Pin_7);
    	
    	return ;
    }
    

    remote.h

    /*remote.h*/
    #ifndef __RED_H
    #define __RED_H 
    #include "sys.h"   
    
    #define RDATA 	PCin(8)	 	//红外数据输入脚
    
    //红外遥控识别码(ID),每款遥控器的该值基本都不一样,但也有一样的.
    //我们选用的遥控器识别码为0
    #define REMOTE_ID 0      		   
    #define MAX_PULSE_LEN 400 //500  300
    
    extern u8  RmtCnt;			//按键按下的次数
    extern u16 PulseTab[MAX_PULSE_LEN];
    extern u8  Flag_LearnState ;
    extern u8  PulseTabCnt;//上升沿下降沿计数器的值
    
    void Remote_Init(void);    	//红外传感器接收头引脚初始化
    void TIM3_PWM_Init(u16 arr,u16 psc);
    void Infrared_Send(u16 *irdata,u32 irlen);
    
    #endif
    

    main.c

    /*main.c*/
    #include "delay.h"
    #include "sys.h"
    #include "usart.h"	 
    #include "remote.h"
    #include "string.h"
    
    
    /**
      *@name   int main(void)
      *@brief
      *@retval return 0
      *@note
      */
    int main(void)
    {	 
    	delay_init();                                   //延时函数初始化	
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    	
    	uart_init(115200);                              //串口初始化为115200
    
    	Remote_Init();                                  //红外接收初始化		 	
    
    	TIM3_PWM_Init(1895,0);                          //tim3 pwm initialize
    	
    	printf("init ok\r\n");
    	
    	while(1)
    	{
    		if(Flag_LearnState)
    		{
    			printf("%s\r\n",(char *)PulseTab);
    			
    			Infrared_Send(PulseTab,PulseTabCnt);
    			
    			PulseTabCnt = 0;
    			
    			Flag_LearnState=0;
    
    			memset((void *)PulseTab,0,MAX_PULSE_LEN);
    		}
    	}
    }
    

    最后
    实验现象:
    本实验开机之后,即进入等待红外触发,如过接收到正确的红外信号,则500ms后自动从红外发射棒发射红外,同时通过串口1,将接受的红外信号以16进制打印出来.

    注意事项:
    1,可以用最小开发板调试,红外接收头和发射棒可以外接.
    2,当使用的接收或发射引脚不一样是,注意将定时器修改.
    3,本实验为万能学习红外遥控器,属于半成品,未做存储处理,需要储存需使用芯片的flash或外接eeprom.

    展开全文
  • STM32红外接收分析

    千次阅读 2020-06-21 02:44:18
    title: STM32红外接收分析 date: 2020-06-18 00:45:12 tags: categories: STM32学习记录 红外遥控原理分析 对于红外遥控,一般都不会陌生,我们身边就有很多采用红外遥控的设备,例如绝大多数的电视,空调,都使用...

    title: STM32红外接收分析
    date: 2020-06-18 00:45:12
    tags:
    categories: STM32学习记录


    红外遥控原理分析

    对于红外遥控,一般都不会陌生,我们身边就有很多采用红外遥控的设备,例如绝大多数的电视,空调,都使用的是红外遥控原理的遥控器,配上红外接收管接收遥控信号。

    红外线(Infrared)是频率介于微波可见光之间的电磁波,波长在1mm到760纳米(nm)之间,频率比红光低的不可见光。

    红外发射端一般使用红外LED,接收端使用红外接收二极管,利用光电效应,经过滤波和功率放大,形成能够承载信号的数字量。红外线发射管在LED封装行业中主要有三个常用的波段,如下850NM、875NM、940NM。850NM波长的主要用于红外线监控设备,875NM主要用于医疗设备,940NM波段的主要用于红外线控制设备。一般的红外遥控器使用的发射管是940nm波长,当然,我们中学做实验在气垫导轨上用到的光电门,也是这种红外光,这个波长的红外光人眼虽然看不见,但是相机的CMOS传感器是可以捕捉到的,具体验证方法,用手机开启相机,对着空调或者电视遥控器的发射管,按下遥控器,就可以看见屏幕里粉色的灯珠。

    再来谈一谈红外遥控的方式是怎么传递信息的。大多数用于遥控的红外信号,采用NEC编码的方式。将用于驱动红外LED的电平信号,经过调制,形成某个高频信号的幅度、相位、频率等参量变化的过程,用一个信号去装载另一个信号。比如我们的红外遥控信号要发送的时候,先经过38K调制,如图所示:

    红外遥控器通信原理_红外遥控器协议_红外通信对比无线通信的优势

    经过这样的调制信号,我们就可以用它来装载我们需要的信号。比如对于NEC编码,规定发射信号有以下4种:

    1. 起始码:用于判断起始信号
    2. 逻辑0
    3. 逻辑1
    4. 重复码:如果遥控器有连按功能,那么发完一次完整的信号后,按键松开前都会循环发送重复码

    我们由于红外传输的是一种数字信号,所以我们可以使用脉宽调制(JPWM)的方式,用不同的电平时间区分这4种信息。具体的不同就是这样:

    1. 起始码:9ms低电平 + 4.5ms高电平
    2. 逻辑0: 560us + 560us
    3. 逻辑1: 560us + 1680us
    4. 重复码 : 9ms低电平 + 2.5ms高电平

    如果按照NEC编码的功能来区分,以正常的时序,就有以下几种码:

    1. 起始码
    2. 用户地址码(8bit)+用户地址反码(8bit)
    3. 数据码(8bit)+数据反码(8bit)
    4. 如果连按,之后会一直发送重复码

    器件准备

    1. STM32核心板或开发板,有板载红外接收管最好
    2. 一个红外遥控器(可以用空调或者电视遥控器代替)
    3. 一个红外接收管,最好是带有放大电路的,但是不要使用带有解调芯片的。
    4. 如果可以,最好是有一个逻辑分析仪或者示波器,可以提前对未知的红外遥控设备进行直观的解码

    准备的材料

    程序编写

    程序编写分为2个部分,分别是接收程序和发送程序,为了学习标准的NEC编码,我们使用标准遥控器,先通过编写接收程序,来体验红外编码的时序,有一个直观的理解之后,再尝试编写发送代码。

    红外接收有3个引脚,5V,GND,以及信号引脚,先将接收模块连接逻辑分析仪,注意不要忘了共地,打开逻辑分析仪,再软件中设置上升沿和下降沿捕获,然后按下遥控器(可以是空调遥控器,我这里用专用红外遥控器的数字1键演示),然后逻辑分析仪就会捕获到一次信号,如下图:

    逻辑电平图

    这样,我们就得到了红外遥控器上按下数字1的红外信号,根据上面的原理分析,这个信号就很容易理解了:首先是一个起始码,有9ms低电平,4.5ms高电平,紧接着是8位地址码,这里是0(0000 0000),相应的8位地址反码就是255(1111 1111),紧接着是8位数据码,这里是162(1010 0010),相应8位数据反码93(0101 1101),然后经过一段时间高电平,接收到了重复码,有9ms低电平和2.5ms高电平,如果按住不放,之后就一直循环接收到重复码。

    是不是一目了然?其实对我来说,这是迫不得已,因为我买的遥控器,资料非常有限,只给了一个电气参数的PDF,编码表也没有,例程更没有,无奈我只能动用逻辑分析仪,弄清楚了每个按键的编码值,顺便分析了一下电平时间和时序,算是做一个铺垫吧。

    我要在小车上用红外接收,需要用到的按键,有下面一些:
    在这里插入图片描述

    接收程序思路分析

    NEC编码解码的实质,其实是对电平时间的精确读取,我不禁想到了超声波模块。对了!一切都是那么的熟悉,定时器的捕获模式,刚好满足这种需求。

    1. 设置低电平捕获,一旦接收到信号,进入捕获中断,改为高电平捕获,捕捉到高电平时,读取计数值,再根据时基,就得到了低电平的时间,获取高电平时间的方法也是一样
    2. 然后根据时间的范围,设置一些标志位,来判断数据起始位,然后获取地址码,地址反码,数据码,数据反码
    3. 然后校验,将地址码与地址反码的取反进行比较,再与设定的地址码进行比较,如果都相等则表示地址数据无误,并且控制设备无误,继续下一步
    4. 将数据码与数据反码的取反进行比较,相等则表示数据无误,再赋值给需要接收键值的变量。

    由于我是应用在小车上的,本来是设计成蓝牙遥控,这样就可以拓展出红外遥控了,C8T6一共有4个定时器的资源,TIM1用于PWM模式,驱动两个电机,TIM2和TIM4用于读取2个AB相编码器,TIM3用于超声波模块的输入捕获,那么要想红外遥控,只能废掉超声波避障了。

    timer.c&timer.h

    根据红外接收的工作特性,应该接收到一次低电平,程序进入中断,我们开始判断是否是起始位,因此,初始化程序应该配置为Input Capture输入捕获模式,捕获极性为低电平捕获

    #include "timer.h"
    #include "delay.h"
    
    
    TIM_HandleTypeDef htim3;      //定时器3句柄
    
    void Remote_Init(void)
    {  
        TIM_IC_InitTypeDef TIM3_CH3_IC_Initure;	//定时器初始化句柄
        
        htim3.Instance=TIM3;                          //选择定时器:定时器3
        htim3.Init.Prescaler=(72-1);                  //预分频器:72分频,1M的计数频率,1um周期
        htim3.Init.CounterMode=TIM_COUNTERMODE_UP;    //计数方向:向上计数
        htim3.Init.Period=10000;                      //自动装载值:最大计时10ms
        htim3.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频:不分频
        HAL_TIM_IC_Init(&htim3);						//进行初始化
        
        //初始化TIM1输入捕获参数
        TIM3_CH3_IC_Initure.ICPolarity=TIM_ICPOLARITY_RISING;    //捕获极性:上升沿捕获
        TIM3_CH3_IC_Initure.ICSelection=TIM_ICSELECTION_DIRECTTI;//交错映射:直接映射到TI3上
        TIM3_CH3_IC_Initure.ICPrescaler=TIM_ICPSC_DIV1;          //输入捕获分频:不分频
        TIM3_CH3_IC_Initure.ICFilter=0x03;                       //硬件滤波:设置8个定时器时钟周期滤波
        HAL_TIM_IC_ConfigChannel(&htim3,&TIM3_CH3_IC_Initure,TIM_CHANNEL_3);//通道选择:配置TIM4通道3
        HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_3);   //开始捕获TIM3的通道3
        __HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);   //使能更新中断
    }
    
    //Input Capture 输入捕获MSP函数
    void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
    {
        GPIO_InitTypeDef GPIO_Initure;
        __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
        __HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIOB时钟
    	
        GPIO_Initure.Pin=GPIO_PIN_0;            //PB0
        GPIO_Initure.Mode=GPIO_MODE_AF_INPUT;  	//复用输入
        GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);
    
        HAL_NVIC_SetPriority(TIM3_IRQn,1,3); 	//设置中断优先级,抢占优先级1,子优先级3
        HAL_NVIC_EnableIRQ(TIM3_IRQn);       	//开启ITM4中断
    }
    
    

    接下来,我们实际上有两种中断,一种是捕获成功进入捕获中断,另一种未捕获,达到计数重装值,进入更新溢出中断,方便起见,在中断服务函数中写HAL库的中断处理总函数(HAL库就是香),在函数内部会自动进入各自的回调函数:

    void TIM3_IRQHandler(void)
    {
    	HAL_TIM_IRQHandler(&htim3);//HAL库定时器处理函数
    }
    

    由于在处理过程中需要有各种标志的判断,定义一个储存状态的8位变量会方便许多:

    //[7]:收到了引导码标志
    //[6]:得到了一个按键的所有信息
    //[5]:保留	
    //[4]:标记上升沿是否已经被捕获								   
    //[3:0]:溢出计时器
    u8 	RmtSta=0;	//状态标志变量
    

    然后,我们继续分析,起始码中的9ms低电平其实没有必要判断,作为一个触发的信号就好,因为我们完全可以通过后面的4.5ms高电平,就得到一个起始码,然后逻辑电平0和1的区别,也在于高电平的时间长短,甚至重复码的特征也是2.5ms的高电平,那么代码的主要思路就很确定了:上升沿捕获中断中设置计时起点,在下降沿捕获中断期间判断计数值,得到高电平持续的时间,就可以在下降沿中断期间做出判断,是起始码还是重复码,是逻辑1还是逻辑0。

    因此有必要设置一个存储计数值的变量,表示高电平时间,本质是读取CCR4寄存器,所以是16位:

    u16 Dval;		//上升沿期间,计数器增加的值
    

    再定义一个储存所有有效逻辑电平的变量,8+8+8+8一共32位:

    u32 RmtRec=0;	//红外接收到的数据	 
    

    如果需要记录连按,那么就需要一个计数变量,一般情况不是必须的:

    u8  RmtCnt=0;	//按键按下的次数
    

    接下来就是中断回调函数:

    //定时器更新(溢出)中断回调函数
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	if(htim->Instance==TIM3)
    	{
     		if(RmtSta&0x80)//检测第[7]位,如果收到引导码
    		{
    			RmtSta&=~0X10;						//清零第[4]位,清除上升沿捕获标志
    			if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集
    			if((RmtSta&0X0F)<14)RmtSta++;
    			else
    			{
    				RmtSta&=~(0x80);//清空起始标识
    				RmtSta&=~(0x0F);//清空溢出计数器
    			}						 	   	
    		}	
    	}
    }
    
    //定时器输入捕获中断回调函数
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
    {
    	if(htim->Instance==TIM3)
    	{
    		if(DATA_PIN)//读取引脚状态,如果引脚高电平,说明是上升沿捕获
    		{
    			TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3);   					//清除捕获极性
    			TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_ICPOLARITY_FALLING);//配置捕获极性,设置为下降沿捕获
    			__HAL_TIM_SET_COUNTER(&htim3,0);		//清空定时器计数值	  
    		  	RmtSta|=0X10;							//设置第[4]位,标记上升沿已经被捕获
    		}else //下降沿捕获
    		{
    			Dval=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_3);//读取输入捕获的计数值
    			TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3);   //清除捕获极性
    			TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_ICPOLARITY_RISING);//配置捕获极性,设置为上升沿捕获
    			if(RmtSta&0X10)							//完成一次上升沿捕获 
    			{
     				if(RmtSta&0X80)//接收到了引导码
    				{
    					
    					if(Dval>300&&Dval<800)			//收到逻辑0,560us
    					{
    						RmtRec<<=1;
    						RmtRec|=0;   
    					}else if(Dval>1400&&Dval<1800)	//收到逻辑1,1680us
    					{
    						RmtRec<<=1;
    						RmtRec|=1;
    					}else if(Dval>2200&&Dval<2600)	//收到重复码,2.5ms
    					{
    						RmtCnt++; 					//按键次数增加1次
    						RmtSta&=~(0x0F);			//清空溢出计数器		
    					}
     				}else if(Dval>4200&&Dval<4700)		//收到起始码,4.5ms
    				{
    					RmtSta|=0x80;					//设置第[7]位,表示成功接收到了引导码
    					RmtCnt=0;						//清除按键次数计数器
    				}						 
    			}
    			RmtSta&=~(0x10);						//清除上升沿捕获标志
    		}
    	}
    }
    

    所有的操作我都打上了详细的注释,下面我按照正常接收一帧有效数据来过一遍这个时序,单片机如何读到数据,存入RmtRec变量中的:

    1. 首先起始码,9ms低电平,由于是下降沿,不会触发中断,然后4.5ms高电平,触发中断,判断为上升沿捕获,标记上升沿捕获,然后重新设置下降沿捕获,计数值清零,这时便开始记录高电平的持续时间。

      if(DATA_PIN)//读取引脚状态,如果引脚高电平,说明是上升沿捕获
      {
      	TIM_RESET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3);   					//清除捕获极性
      	TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_3,TIM_ICPOLARITY_FALLING);//配置捕获极性,设置为下降沿捕获
      	__HAL_TIM_SET_COUNTER(&htim3,0);		//清空定时器计数值	  
      	RmtSta|=0X10;							//设置第[4]位,标记上升沿已经被捕获
      }
      
    2. 一旦捕获到下降沿,便重新设置上升沿捕获,然后读取CCR4寄存器,存入Dval变量,由于设置的是72分频,计数值就是1um的数量,判断这个变量的所在区间,就可以得到收到的是什么。如果是起始码,就把相应的起始码标志位置1。如果判断标志位已经收到起始码,就判断逻辑码重复码。如果是逻辑码,就将Rec变量左移,如果是1,就进行与操作,如果是0,可以不操作,因为右移自动补0。如果是重复码,就把重复计数加1。

      if(RmtSta&0X10)							//完成一次上升沿捕获 
      {
       	if(RmtSta&0X80)//如果已经收到引导码
      	{
      		
      		if(Dval>300&&Dval<800)			//收到逻辑0,560us
      		{
      			RmtRec<<=1;
      			RmtRec|=0;   
      		}
      		else if(Dval>1400&&Dval<1800)	//收到逻辑1,1680us
      		{
      			RmtRec<<=1;
      			RmtRec|=1;
      		}
      		else if(Dval>2200&&Dval<2600)	//收到重复码,2.5ms
      		{
      			RmtCnt++; 					//按键次数增加1次
      			RmtSta&=~(0x0F);			//清空溢出计数器		
      		}
       	}
      	else if(Dval>4200&&Dval<4700)		//收到引导码,4.5ms
      	{
      		RmtSta|=0x80;					//设置第[7]位,表示成功接收到了引导码
      		RmtCnt=0;						//清除按键次数计数器
      	}						 
      }
      
    3. 如果超时,从逻辑分析仪的数据来看,只有一种可能,就是每次数据之间的上升沿时间会超过我设定的10ms自动重装时间,也就是说,会有下降沿中断无法达到,于是触发了溢出中断回调函数,这个中断就可以作为接收结束的标志,在里面进行标志位的复位操作即可。Sta变量的0-3位,作为计数位使用,可以计数0-15次,对于我的红外遥控器如果是连按的话,通常在15个重装时间150ms内会有重复码,如果15次还没有低电平出现,就视为松开了按键,需要清空起始标志和计数位,等待下一次按下按键。

      //定时器更新(溢出)中断回调函数
      void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
      {
      	if(htim->Instance==TIM3)
      	{
       		if(RmtSta&0x80)//检测第[7]位,如果收到引导码
      		{
      			RmtSta&=~0X10;						//清零第[5]位,清除上升沿捕获标志
      			if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集
      			if((RmtSta&0X0F)<14)RmtSta++;
      			else
      			{
      				RmtSta&=~(0x80);//清空起始标识
      				RmtSta&=~(0x0F);//清空溢出计数器
      			}						 	   	
      		}	
      	}
      }
      
    4. 接下来,一共32位数据就存入了Rec变量中,由于存入数据时采用左移的方式,那么右移32-8=24位,与0xFF得到地址码,右移32-16=16位,得到地址反码,右移8位,得到数据码,直接与0xFF就是数据反码。然后,验证遥控用户码是否等于宏定义的地址码,并且取出从第24位开始的8位数据码,return返回,判断这个值,做相应的控制操作,就完成了。

      u8 Remote_Scan(void)
      {        
      	u8 sta=0;       
      	u8 temp1,temp2;
      	if(RmtSta&(1<<6))//得到一个按键的所有信息了
      	{ 
      	    temp1=RmtRec>>24;			//得到地址码
      	    temp2=(RmtRec>>16)&0xff;	//得到地址反码 
       	    if((temp1==(u8)~temp2)&&temp1==REMOTE_ID)//检验遥控地址码,遥控器发送的地址码要和这里宏定义的相同才匹配 
      	    { 
      	        temp1=RmtRec>>8;
      	        temp2=RmtRec; 	
      	        if(temp1==(u8)~temp2)sta=temp1;//键值正确	 
      		}   
      		if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了
      		{
      		 	RmtSta&=~(1<<6);//清除接收到有效按键标识
      			RmtCnt=0;		//清除按键次数计数器
      		}
      	}
          return sta;
      }
      
      void read_yaokong(void)
      {
      	u8 key;
      	key = Remote_Scan();
      	switch (key)
      	{
      		case 24: Flag_Qian=1,Flag_Hou=0,Flag_Left=0,Flag_Right=0; break;	//前进
      		case 74: Flag_Qian=0,Flag_Hou=1,Flag_Left=0,Flag_Right=0; break;	//后退
      		case 16: Flag_Qian=0,Flag_Hou=0,Flag_Left=1,Flag_Right=0; break;	//左转
      		case 90: Flag_Qian=1,Flag_Hou=0,Flag_Left=0,Flag_Right=1; break;	//右转
      		case 56: Flag_Qian=0,Flag_Hou=0,Flag_Left=0,Flag_Right=0; break;	//停止
      		case 162: mode_flag = 0; break;	//遥控模式
      		case 98: mode_flag = 1; break;	//CCD循迹模式
      		case 226: mode_flag = 2; break;	//超声波避障模式
      	}
      }
      

    然后补上头文件即可完成全部的代码。

    #ifndef __TIMER_H
    #define __TIMER_H
    #include "sys.h"
    
    
    #define DATA_PIN   PBin(0)		//红外数据输入脚
    
    #define REMOTE_ID 0      		   
    
    extern u8 RmtCnt;	        //按键按下的次数
    
    void Remote_Init(void);     //红外传感器接收头引脚初始化
    u8 Remote_Scan(void);
    void read_yaokong(void);
    #endif
    

    显然从逻辑分析仪看,我的红外遥控器发送的地址码是0x00,所以直接宏定义为0即可。

    展开全文
  • 红外接收程序

    千次阅读 2012-04-19 21:11:57
    声明部分内容摘自: http://www.hificat.com/dpj_step/compositive_7.html http://www.ceet.hbnu.edu.cn/bbs/viewthread.php?tid=102 ... ...1、红外遥控系统 ...通用红外遥控系统由发射和接收两大部分
  • 红外接收程序讲解

    万次阅读 多人点赞 2014-08-10 17:25:18
    1、红外遥控系统 ...接收部分包括光、电转换放大器、解调、解码电路。     下面,我们将使用下面两种设备: 另外,使用51单片机进行解码。 2、原理图 从原理图看出,I
  •  常见红外接收头封装种类  塑封的红外接收头  IRM138S系列,多用在电视、机顶盒、车载、DVD等对遥控距离要求不高,而且使用环境相对平和的电器上。塑封的红外接收头体积比压模的稍微大一点,一般是6.8×5.8×...
  • 红外线接收头的代换

    2021-01-20 06:22:30
    如广泛采用的M50436-560P遥控接收系统,红外线接收器组件由红外线接收二极管TLP002CR,前置放大器CX20106A和外围阻容元件三部分组成(如图1所示)。红外线接收头是个灵敏度格高的红外线发光二极管,它将接收的含有...
  • 基于STM32f103c8t6的红外接收发送

    千次阅读 2019-10-25 10:21:34
    红外通信协议(2) 红外接收程序功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一...
  • 红外接收管 的原理和使用

    千次阅读 2019-09-27 17:13:32
    红外接收管一般有两种:红外接收二极管和红外光敏三极管,从外形上无法区分是二极管还是三极管(如上图)。  区分方法:万用表测量,两脚之间的正反向电阻值一大一小的为二极管,正反向都很大的为三极管(阻值大概...
  • 红外接收管的结构其实很简单,主要包括两个部分,第一,高速度和高灵敏度的发光点二极管;第二,标准的塑料管;前者直接放置于后者内,起到很好的保护作用。 2.红外接收管种类 红外线接收管有两种,一种是光电...
  • 如广泛采用的M50436-560P遥控接收系统,红外线接收器组件由红外线接收二极管TLP002CR,前置放大器CX20106A和外围阻容元件三部分组成(如图1所示)。红外线接收头是个灵敏度格高的红外线发光二极管,它将接收的含有...
  • proteus仿真红外发射接收

    热门讨论 2009-12-18 20:30:23
    接收部分则是完成红外 线的接收、放大、解调,还原成同步发射格式相同(但高、低电位刚好相反的脉冲信号)。这些工作通常由一体 化的接收头来完成,主要输出TTL兼容电平。最后通过解码把脉冲信号转换成数据,从而实现...
  • 刚学单片机(msp430f149 DM430-A),试了试红外接头(1838),读取红外遥控器的键值,并以十进制显示在数码管上,如果以后准备将这个遥控器作为其他用途还可以把数码管上的键值化成16进制使用如(74——0x4A)。...
  • IoT End-to-end system 的大作业,项目是其中一个部分,为了实现通过Rpi发送指令的一个红外的遥控器。 UNO与RPi用串口通信,UNO从Raspberry Pi 串口读取指令,然后编码发送与接收的一个简单Demo。 这里Rpi的代码尚未...
  •  常见红外接收头封装种类  塑封的红外接收头  IRM138S系列,多用在电视、机顶盒、车载、DVD等对遥控距离要求不高,而且使用环境相对平和的电器上。塑封的红外接收头体积比压模的稍微大一点,一般是6.8×5.8×...
  • 35 红外接收头在linux内核里的驱动

    千次阅读 2017-06-20 14:38:10
    传输分成发送端(遥控器),接收端(红外接收头)发送端发出表示高低电平的不同的光, 接收端收到红外光后还原成对应的高低电平来表示二进制的0和1.发送端可由专门的红外发射芯片来实现,如图: 红外发射芯片会自动扫描...
  • 红外接收二极管(摘自百度百科)

    千次阅读 2012-07-04 09:20:45
    红外接收二极管又叫红外光电二极管,也可称红外光敏二极管,英文名Infrared receiverdiode。它广泛用于各种家用电器的遥控接收器中,如音响、彩色电视机、空调器、VCD视盘机、DVD视盘机以及录像机等。 红外接收...
  • 如广泛采用的M50436-560P遥控接收系统,红外线接收器组件由红外线接收二极管TLP002CR,前置放大器CX20106A和外围阻容元件三部分组成(如图1所示)。红外线接收头是个灵敏度格高的红外线发光二极管,它将接收的含有...
  • 我们的开发板上会有一个红外接收头和一个遥控器。通过这两个小东西就可以完成红外实验。其中这个遥控器采用了NEC协议。除了这个协议还有RC5、RC6类型的。我们接下来就说说红外接受和红外发射。 红外发送与接收 ...
  • 最近尝试做一个红外接收装置,看了网上大多数参考文章以后,选了比较通用的NEC红外协议入手,正巧有一个遥控器使用的正是NEC协议,解决了信号源问题,我的目标便是用STM32c8t6核心板配合集成红外接收头将遥控器各个...
  • 通过示波器观察,波形非常准确完整,由于红外接收的频率一般是38KHz,虽然晶振的频率可以通过可调电阻微调。但是还是很难匹配,每次试验时都要微调。所以不选择这个方案。 方案二: 如前所述,使用三脚的红外接收器,...
  • 3.VS1838红外接收模块一个 4.数据线一根 5.面包板一块(没有条件的不影响) 2.软件部分 1.Arduino IDE开发工具 2.ESP8266芯片包 3.IRremoteESP8266库 3.代码部分 #define RECV_PIN 2 // 定义红外信号...
  • 开发板上有接收和发射一对管子,因此可以完整的学习发射和接收数据的软、硬件设计。 模块1:发射电路   发射使用的是,该红外发射管重要参数是940nm,也有其他波段的发射管。但一般使用940nm的发射管。画好的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,329
精华内容 4,131
关键字:

红外接收部分