1、基于FPGA的红外线型学习遥控器重庆大学本科生课外实践技术报告项目名称:基于FPGA的学习型红外遥控器设计学院:专业:指导老师:实验日期:引言随着人们生活水平的提高,家用电器的种类增多,红外遥控器的种类也随之增加,不同种类的遥控器之间由于采用的编码格式不同,使得不同产品的遥控器不能相互兼容,用户在使用的过程中容易产生混乱,给人们的生活带来诸多不便。针对这一现况,万能遥控器便应需出现了,目前主要分为两种类型,编码型和学习型。编码型万能遥控器需要各大电器制造商生产的遥控器的控制码编码格式,使用时选定相应机型,遥控器便可提取出其编码,再和38k的载波进行ASK调制便可驱动红外线发射管进行控制信号发射
2、了,但其显著的缺点是使用时需要查询冗长的机器型号手册。相对之下另外一种学习型的万能遥控器机理就比较简单了,其对不同遥控器发出的信号(解调后的信号)进行记录,待控制时调用出存储的信号对载波进行调制,便可驱动红外线发射管发射红外线对设备进行控制了。通过对比这两种万能遥控器的设计方案可知,相对编码型遥控器,自主学习型遥控器原理简单,实现较为方便。基于此本文尝试着设计了一款基于FPGA的红外线学习型遥控器,主要由FPGA控制模块、红外线接收模块、红外线发射模块和存储模块组成。在本文中详细的给出了设计的原理、技术方案、软硬件的实现过程等,并在附录中给出了各单元电路图、主程序和仿真电路图。1 设计方案与指
3、标1.1 设计原理简介基于FPGA制作一个红外遥控器,并可通过程序控制记忆按键功能,达到遥控器的自主学习功能,其实现原理框图如下:图1系统框图由原理框图可知,本设计主要由5个部分组成,FPGA控制器、红外线发射器、红外线接收器、学习遥控指示灯和操作键组成。遥控器自主学习工作进程如下:一、红外线接收器接收红外信号;二、红外接收模块对信号进行放大、检波、整形,解调出基带信号;三、FPGA控制器将解调出的信号的高、低电平的时间宽度进行储存;四、当要发射红外信号时,从储存区中还原出相应的红外遥控编码,以其对38kHz的载波信号进行调制;五、调制出的控制信号驱动红外发光二极管发射红外信号,从而实现对设备
4、的控制。红外编码解码原理:遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们采用的是NEC类型。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图3所示。遥控编码是连续的32位二
5、进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在4563ms之间,图4为发射波形图。当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms18ms),高8位地址码(9ms18ms),8位数据码(9ms18ms)和这8位数据
6、的反码(9ms18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12
7、ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。 根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。1.2 技术指标实现对能够通过学习来控制大多数需要红外线控制的设备(如:电视、空调等),并且设备能正确执行控制指令。2 遥控器硬件组成2.1 器件的选择在本设计中,控制模块利用的是手中已有的资源,Altera公司的芯片EP3C10E144C7,红外线发射模块选用Arduino电子积木红外发射模块IR Transmitter,红外线接收模块选用TSOP4838。并且购进了一个组合的红外接收发射模块发射模块,该模块基于940红外发射管,高电平驱动,所
8、需拉电流小,控制简易,应用广泛,接收模块基于HL-A838红外一体化接收头,可接收38KHz的红外信号,并解调成逻辑电平,即收到信号即输出低电平,否则输出高电平。低功耗、宽角度及长距离接收。2.2 PCB板的绘制和投板3 程序设计系统的程序设计部分主要有以下几个具体模块电路:按键去抖动、分频模块、红外发射、红外接收、存储模块(各个模块VHDL程序见附录)其系统顶层电路原理图如下所示:图2 系统顶层设计原理图4设计成果展示硬件完整电路图片以及操作视频(视频在文件夹里)5总结通过本次设计一个实用的万能遥控器,我们对课题设计的完整流程有了深入的认识,包括项目的选择、资料的收集、元件购买、PCB板的绘
9、制投板、模块程序设计以及报账流程等,最主要的是因为我们的设计程序在网上的相关资料很少,所以我们是自己根据要实现的功能尝试着自己写程序,自己调试,受益匪浅,不仅很好地巩固和理解了课堂理论知识,更为以后做项目参加比赛等积累了很好的经验。同时,4人小组的合作也很成功,经过这次设计懂得了团队协作和正确分工的重要性!6元件清单名称数量单价/元总计/元贴片电阻1500.1522.5贴片电容1000.2424S9013三极管201.8537IR5308C-C-45201.8537HL-A838203.774排针1*3301.8555.5250附录去抖动程序LIBRARYieee;USEieee.std_lo
10、gic_1164.all;USEieee.std_logic_unsigned.all;ENTITYhw_qdISPORT(clk:INSTD_LOGIC;kin:INSTD_LOGIC;kout:OUTSTD_LOGIC);ENDENTITY;ARCHITECTUREbehavOFhw_qdISSIGNALkh,kl:std_logic_vector(3downto0);BEGINPROCESS(kin,clk)BEGINifrising_edge(clk)thenif(kin=0)thenkl=kl+1;elsekl=0000;endif;endif;ENDPROCESS;PROCESS(
11、kin,clk)BEGINifrising_edge(clk)thenif(kin=1)thenkh=kh+1;elsekh1100)thenkout0111)thenkout=0;endif;endif;ENDPROCESS;ENDbehav;红外接收程序libraryieee;useieee.std_logic_1164.all;entityhw_InfraredPortisport(CLK:instd_logic;-50MHzRST:instd_logic;IRIN:instd_logic;RD:instd_logic;CS:instd_logic;led:outstd_logic;DA
12、TA:outstd_logic_vector(31downto0);endentityhw_InfraredPort;architectureoneofhw_InfraredPortistypestateis(s0,s1,s2,s3,s4);signalsta:state;signalvData:std_logic_vector(31downto0);signalclk_1m:std_logic;-1MHzbeginprocess(CLK)variableclk_counter:integerrange0to25;beginif(CLKeventandCLK=1)thenclk_counter
13、:=clk_counter+1;if(clk_counter=25)thenclk_counter:=0;clk_1m=notclk_1m;endif;endif; endprocess;process(RST,CLK)variablestep:integerrange0to32;variablecounter:integerrange0to10000;beginif(RST=0)thensta=s0;vData=X00000000;ledled=0;counter:=0; if(IRIN=0)thenstaled3200)then-time(9ms)3.2mssta=s2;counter:=
14、0;elsestaled8000)then-time(4.5ms)8ms,backtobeginsta=s0;endif;elsif(counter8000)then-time(4.5ms)8ms,continuesta=s3;counter:=0;step:=0;elsestaled=1;if(IRIN=0)thencounter:=counter+1;elsif(counter1600)then-time(0.56ms)1.6ms,continuesta=s4;counter:=0;elsestaled3200)then-time(1.12ms)3.2ms,backtobeginsta=s
15、0;DATA800)then-time0.8ms,getthedata1vData(step)=1;elsevData(step)=0;-time0.8ms,getthedata0endif;step:=step+1;sta=s3;counter:=0;endif;endcase;endif;endprocess;endarchitectureone;存储写入程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityhw_addressisport(clk:instd_logic;data:in
16、std_logic_vector(31downto0);anjian1:instd_logic;anjian2:instd_logic;anjian3:instd_logic;od:outstd_logic_vector(15downto0);ad:outstd_logic_vector(4downto0);endentity;architecturebehavofhw_addressistypestateis(s0,s1,s2,s3);signalsta:state;signaladdr:std_logic_vector(4downto0);beginad=addr;process(anji
17、an1,anjian2,anjian3,clk)beginif(anjian1=1andanjian2=1andanjian3=1)thensta=s0;od=x0000;addrif(anjian1=0)thenod=x0000;addr=00001;sta=s1;elsif(anjian2=0)thenod=x0000;addr=00011;sta=s1;elsif(anjian3=0)thenod=x0000;addr=00101;staaddr=addr;od=data(15downto0);staaddr=addr+1;od=data(31downto16);stasta=s3;en
18、dcase;endif;endprocess;存储读出程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityhw_adoutisport(clk:instd_logic;inin:instd_logic_vector(15downto0);anjian1:instd_logic;anjian2:instd_logic;anjian3:instd_logic;output:outstd_logic_vector(31downto0);endentity;architecturebehavofhw
19、_adoutistypestateis(s0,s1,s2,s3);signalsta:state;signalin1:std_logic_vector(15downto0);signalout1:std_logic_vector(31downto0);beginin1=inin;output=out1;process(anjian1,clk)beginif(anjian1=1andanjian2=1andanjian3=1)thensta=s0;out1out1(15downto0)=in1;staif(out1=in1)thensta=s1;elseout1(15downto0)=in1;s
20、taif(out1=in1)thensta=s2;elseout1(31downto16)=in1;stasta=s3;endcase;endif;endprocess;endbehav;红外发射程序libraryieee;useieee.std_logic_1164.all;entityhw_OUTPUTisport(CLK:instd_logic;-50MHzkin:instd_logic;DATA:instd_logic_vector(31downto0); IROUT:outstd_logic);endentityhw_OUTPUT;architectureoneofhw_OUTPUT
21、istypestateis(s0,s1,s2,s3,s4);signalsta:state;signalclk_1m:std_logic;-1MHzsignalclk_38k:std_logic;-38kHzbeginprocess(CLK)variableclk_counter:integerrange0to25;beginif(CLKeventandCLK=1)thenclk_counter:=clk_counter+1;if(clk_counter=25)thenclk_counter:=0;clk_1m=notclk_1m;endif;endif; endprocess;process
22、(CLK)variableclk_counter:integerrange0to658;beginif(CLKeventandCLK=1)thenclk_counter:=clk_counter+1;if(clk_counter=658)thenclk_counter:=0;clk_38k=notclk_38k;endif;endif; endprocess;process(kin,clk_1m)variablestep:integerrange0to32;variablecounter:integerrange0to100000;beginif(kin=1)thenIROUT=0;step:
23、=0;staIROUT=0;if(counter100000)thencounter:=counter+1; elsestaIROUT=clk_38k;if(counter9000)thencounter:=counter+1; elsestaIROUT=0;if(counter4500)thencounter:=counter+1;elsestaIROUT=clk_38k;if(counter560)thencounter:=counter+1;elsestaIROUT=0;if(DATA(step)=0)thenif(counter565)thencounter:=counter+1;elsif(step32)thensta=s3;step:=step+1;counter:=0;elsesta=s0;step:=0;counter:=0;endif;elsif(DATA(step)=1)thenif(counter1690)thencounter:=counter+1;elsif(s
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1