0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA学习系列:35. 红外线遥控系统的设计

FPGA学习交流 2018-09-07 11:59 次阅读

设计背景:

红外线(Infrared)是波长介乎微波与可见光之间的电磁波,波长在760纳米(nm)至1毫米(mm)之间,比红光长的非可见光红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。现在工业设备中,也已经广泛在使用。。。。。

设计原理:

红外遥控系统主要由红外的发送装置和接收装置组成,发送装置可由按键,编码模块,发射电路等组成,接收装置由红外接收电路,遥控,解码模块等组成,此次设计我们用到的硬件平台式是Altera的DE1_SOC,晶振为50MHZ。

在红外的编码中,我们对1 和 0 的编码是通过38KHZ的脉冲来定义的,在红外的的编码中每个脉冲的为256.25us长的38KHZ载波频率(26.3us),对0,1的脉冲的定义的时间如下图

红外的数据格式为包括引导码,用户码,数据码和数据纠错码,停止位编码总为32位。数据反码是数据码反相后的编码,可用于对数据的纠错。此外第二段的用户码可以在遥控应用电路中设置为第一段用户码的反码。

数据格式如下图:

一帧数据在发送时先发送9MS的高电平,然后发送4.5MS的低电平的起始位,然后发送用户码,数据码,数据反码。然后再发送一位的停止位。不发送数据时数据线一直为低。

发送的时序图如下:

接受的时,接收到的时序和发送的时序恰恰相反,如发送时先发送9ms的高,4.5ms的低,接收为接收9ms的低电平,4.5ms低电平。

接收的控制器我们用的时红外遥控装置,按键发送的数据如下图所示

设计架构图:

设计的总框架如下图:

image.png

在我们的设计中分频模块提供所需要的38KHZ的时钟,当按键按下时发送我们的发送模块发送一个给定的数值,我的设计中用户码为8b0第二段用户码为8hff,然后发送给定的数据码,和数据反码。上电后我们的设计会发一次我们给定的数据码,然后在接受模块会接受到其发送的数据并在数码管上显示出来,之后我们可以用我们我的遥控键盘来发送数据,接收模块接收显示出来,通过验证我们接收和发送的正确。

设计代码:

顶层代码:

00moduleinfrared(clk,rst_n,key,tx,seg1,seg2,rx);

01

02 inputclk,rst_n;

03 inputkey;

04 outputtx;

05 inputrx;

06 wire[7:0]show_data;

07 output[7:0]seg1,seg2;

08 wire[31:0]data_n;

09 wireclk_38khz;

10

11

12 clk_frep clk_frep_dut( //分频模块

13 .clk(clk),

14 .rst_n(rst_n),

15 .clk_38khz(clk_38khz)

16 );

17

18

19 tttxxx tx_dut( //发送模块

20 .clk(clk_38khz),

21 .rst_n(rst_n),

22 .data_n(data_n),

23 .tx(tx),

24 .key(key)

25 );

26

27 seg seg01( //数码管模块

28 .clk(clk),

29 .rst_n(rst_n),

30 .seg7(seg1),

31 .data_in(show_data[3:0])

32 );

33

34 seg seg02(

35 .clk(clk),

36 .rst_n(rst_n),

37 .seg7(seg2),

38 .data_in(show_data[7:4])

39 );

40

41 rx_led led_dut( //接收模块

42 .clk(clk_38khz),

43 .rst_n(rst_n),

44 .rx(rx),

45 .show_data(show_data)

46 );

47

48

49endmodule

发送模块:

000 moduletttxxx(clk,rst_n,data_n,tx,key);

001

002 inputclk,rst_n;

003 inputkey;

004 input[31:0]data_n;

005 outputregtx;

006

007 parameterT9ms =342;//9000/26.3

008 parameterT4500us =171; //4.5ms 4500/26.3

009 parameterT0 =21; //(1125-562.25)/26.3

010 parameterT1 =63; //(2250-562.25)/26.3

011 parameterT562us =21; // 562.25/26.3;

012 parameterT =2666;// 一帧数据

013 regT9_flag;

014 regT45_flag;

015 regT0_flag;

016 regT1_flag;

017 regT9_down;

018 regT45_down;

019 regT0_down;

020 regT1_down;

021 reg[9:0]cnt9;

022 reg[9:0]cnt45;

023 reg[9:0]cnt0;

024 reg[9:0]cnt1;

025 reg[9:0]cnt562;

026 regt0_clk,t1_clk;

027 reg[8:0]count;

028 reg[2:0]state;

029 regdata;

030 reg[31:0]d_data;

031

032 always@(posedgeclk)

033 if(!rst_n)

034 begin

035 count <=0;

036 state <=0;

037 tx <=0;

038 d_data <={8'b0,8'hff,8'b10100010,8'b01011101}; //默认的发送数据

039 end

040 else

041 case(state)

042 0 : if(count <10)

043 begin

044 tx <=0;

045 count <=count +1;

046 end

047 elseif(!key)

048 begin

049 count <=0;

050 state <=1;

051 T9_flag <=1;

052 tx <=1;

053 end

054

055 1 : if(T9_down) //起始位 高电平9 ms

056 begin

057 state <=2;

058 T45_flag <=1;

059 tx <=0;

060 T9_flag <=0;

061 end

062 else

063 begin

064 tx <=1;

065 state <=1;

066 end

067

068 2 : if(T45_down) // 低电平 4.5ms

069 begin

070 state <=3;

071 tx <=0;

072 T45_flag <=0;

073 end

074 else

075 tx <=0;

076

077 3 : if(count <32) //32位的数据编码,如果那一位 1(0)跳转4(5)状态通过发送标志结束来发送出位 1的时序

078 begin

079 count <=count +1;

080 if(!d_data[31-count])

081 begin

082 T0_flag <=1;

083 state <=4;

084 T1_flag <=0;

085 end

086 else

087 begin

088 T1_flag <=1;

089 state <=5;

090 T0_flag <=0;

091 end

092 end

093 else

094 begin

095 count <=0;

096 state <=6;

097 T0_flag <=0;

098 T1_flag <=0;

099 end

100

101 4 : if(T0_down) //位0的设置

102 begin

103 state <=3;

104 tx <=0;

105 end

106 else

107 begin

108 tx <=t0_clk;

109 end

110

111 5 : if(T1_down) //位1的设置

112 begin

113 state <=3;

114 tx <=0;

115 end

116 else

117 tx <=t1_clk;

118

119 6 : if(count <T562us -1) //停止位

120 begin

121 count <=count +1;

122 tx <=1;

123 end

124 else

125 begin

126

127 tx <=0;

128 end

129 default: state <=0;

130 endcase

131

132 always@(posedgeclk) //计数一个9ms

133 if(!rst_n)

134 begin

135 T9_down <=0;

136 cnt9 <=0;

137 end

138 elseif(T9_flag)

139 begin

140 if(cnt9 <T9ms -1)

141 begin

142 T9_down <=0;

143 cnt9 <=cnt9 +1;

144 end

145 else

146 begin

147 T9_down <=1;

148 cnt9 <=0;

149 end

150 end

151

152 always@(posedgeclk) //计数一个4.5ms

153 if(!rst_n)

154 begin

155 T45_down <=0;

156 cnt45 <=0;

157 end

158 elseif(T45_flag)

159 begin

160 if(cnt45 <T4500us -1)

161 begin

162 T45_down <=0;

163 cnt45 <=cnt45 +1;

164 end

165 else

166 begin

167 T45_down <=1;

168 cnt45 <=0;

169 end

170 end

171

172 reg[9:0]cnt00;

173 always@(posedgeclk) //产生位0的时序

174 if(!rst_n)

175 begin

176 t0_clk <=0;

177 T0_down <=0;

178 cnt0 <=0;

179 cnt00 <=0;

180 end

181 elseif(T0_flag)

182 begin

183 if(cnt0 <T562us -1)

184 begin

185 t0_clk <=1;

186 cnt0 <=cnt0 +1;

187 T0_down <=0;

188 end

189 else

190 begin

191 if(cnt00 <T0 -1)

192 begin

193 cnt00 <=cnt00 +1;

194 t0_clk <=0;

195 T0_down <=0;

196 end

197 else

198 begin

199 T0_down <=1;

200 cnt0 <=0;

201 cnt00 <=0;

202 end

203 end

204 end

205

206 reg[9:0]cnt11;

207 always@(posedgeclk) //产生位1的时序

208 if(!rst_n)

209 begin

210 t1_clk <=0;

211 T1_down <=0;

212 cnt1 <=0;

213 cnt11 <=0;

214 end

215 elseif(T1_flag)

216 begin

217 if(cnt1 <T562us -1)

218 begin

219 t1_clk <=1;

220 cnt1 <=cnt1 +1;

221 T1_down <=0;

222 end

223 else

224 begin

225 if(cnt11 <T1 -1)

226 begin

227 cnt11 <=cnt11 +1;

228 t1_clk <=0;

229 T1_down <=0;

230 end

231 else

232 begin

233 T1_down <=1;

234 cnt1 <=0;

235 cnt11 <=0;

236 end

237 end

238 end

239

240endmodule

接收模块:

0 modulerx_led(clk,rst_n,rx,show_data);

1

2 inputclk,rst_n;

3 inputrx;

4 outputreg[7:0]show_data;

5

6 reg[1:0]state;

7 reg[7:0]cnt;

8 regtemp;

9 reg[9:0]num;

10 regflag;

11 reg[31:0]data;

12 reg[1:0]state_s;

13 regflag_x;

14 reg[12:0]count;

15

16 parameterT =2566;// 一帧数据的时间

17

18 //这个模块是中因为接受的32位编码数据中,不管是位0还是位1,接受的低电平都是相同的,

19 //我们可以通过来判断高电平的时间来确定为位1 还是位0,位’11.68MS,位0 562.25us

20 always@(posedgeclk)

21 if(!rst_n)

22 begin

23 num <=0;

24 data <=0;

25 state_s <=0;

26 flag_x <=0;

27 count <=0;

28 end

29 else

30 begin

31 case(state_s)

32 0 : if(!rx) //判断起始位,是否接受=收数据

33 begin

34 state_s <=1;

35 flag_x <=0;

36 count <=count +1;

37 end

38 else

39 begin

40 flag_x <=0;

41 state_s <=0;

42 count <=count +1;

43 end

44

45 1 : if(num <(342+171-1)) //延迟9ms + 4.5ms的起始时间

46 begin

47 num <=num +1;

48 state_s <=1;

49 count <=count +1;

50 end

51 else

52 begin

53 num <=0;

54 state_s <=2;

55 count <=count +1;

56 end

57

58 2 : if(flag &&num <32) //flag来的时候表示接到了位1 ,或者位0

59 //通过移位寄存器来获取32位数据

60 begin

61 data <={data[30:0],temp};

62 state_s <=2;

63 num <=num +1;

64 count <=count +1;

65 end

66 elseif(num ==32)

67 begin

68 state_s <=3;

69 num <=0;

70 count <=count +1;

71 end

72 else

73 state_s <=2;

74

75 3 : if(num <21-1) //延迟结束位的时间

76 begin

77 num <=num +1;

78 count <=count +1;

79 end

80 else

81 begin

82 if(count ==T -1) //延迟一帧数据的时间后,发送一个标志位

83 begin

84 num <=0;

85 state_s <=0;

86 flag_x <=1;

87 count <=0;

88 count <=count +1;

89 end

90 else

91 count <=count +1;

92 end

93 default:state_s <=0;

94 endcase

95 end

96

97 always@(posedgeclk)

98 if(!rst_n)

99 begin

100 cnt <=0;

101 state <=0;

102 temp <=0;

103 flag <=0;

104 end

105 else

106 if(state_s >1&&state_s <3)

107 case(state)

108 0 : if(rx)

109 begin

110 cnt <=cnt +1;

111 state <=1;

112 flag <=0;

113 end

114 else

115 begin

116 state <=0;

117 flag <=0;

118 end

119

120 1 : if(!rx)

121 begin

122 cnt <=cnt;

123 state <=2;

124 end

125 else

126 cnt <=cnt +1;

127

128 2 : if(400<cnt *26&&cnt *26<600) //判断高电平的时间

129 begin

130 temp <=0;

131 flag <=1;

132 state <=0;

133 cnt <=0;

134 end

135 elseif(1400<cnt *26&&cnt *26<1700) //判断高电平的时间

136 begin

137 temp <=1;

138 flag <=1;

139 state <=0;

140 cnt <=0;

141 end

142 else

143 begin

144 state <=0;

145 cnt <=0;

146 end

147 default:state <=0;

148 endcase

149

150 always@(*) //接收完一帧数据后,当标志位来的时候通过对数据的纠错来捕获数据

151 //我们接收的数据用的是左移,而发送的时候先发的是低位

152 if(!rst_n)

153 show_data <=0;

154 elseif((data[7:0]==~data[15:8])&&(data[31:24]==~data[23:16])&&flag_x)

155 begin

156 show_data[0]<=data[15];

157 show_data[1]<=data[14];

158 show_data[2]<=data[13];

159 show_data[3]<=data[12];

160 show_data[4]<=data[11];

161 show_data[5]<=data[10];

162 show_data[6]<=data[9];

163 show_data[7]<=data[8];

164

165 end

166 else

167 show_data <=show_data;

168

169endmodule

码管模块:

0 moduleseg(clk,rst_n,seg7,data_in);

1

2 inputclk;

3 inputrst_n;

4 input[3:0]data_in;

5

6 outputreg[7:0]seg7;

7

8

9 `defineT1ms 50_000//分频出1k的时钟

10 //`define T1ms 5

11 reg[15:0]count;

12 regflag;

13 always@(posedgeclk ornegedgerst_n)

14 if(!rst_n)

15 begin

16 count <=15'b0;

17 flag <=1;

18 end

19 else

20 if(count ==`T1ms/2-1)

21 begin

22 count <=15'b0;

23 flag <=~flag;

24 end

25 else

26 begin

27 count <=count +1'b1;

28 end

29

30 always@(posedgeflag)

31 if(!rst_n)

32 seg7 <=8'b1010_0100;

33 else

34 begin

35 case(data_in)

36 0:seg7 <=8'b1100_0000;

37 1:seg7 <=8'b1111_1001;

38 2:seg7 <=8'b1010_0100;

39 3:seg7 <=8'b1011_0000;

40 4:seg7 <=8'b1001_1001;

41 5:seg7 <=8'b1001_0010;

42 6:seg7 <=8'b1000_0010;

43 7:seg7 <=8'b1111_1000;

44 8:seg7 <=8'b1000_0000;

45 9:seg7 <=8'b1001_0000;

46 10:seg7 <=8'b1000_1000;

47 11:seg7 <=8'b1000_0011;

48 12:seg7 <=8'b1100_0110;

49 13:seg7 <=8'b1010_0001;

50 14:seg7 <=8'b1000_0110;

51 15:seg7 <=8'b1000_1110;

52 default:;

53 endcase

54 end

55endmodule

分频模块:

0 moduleclk_frep(clk,rst_n,clk_38khz);

1

2 inputclk,rst_n;

3 outputregclk_38khz;

4

5 reg[9:0]count;

6

7 //分频出红外模块所用的38Khz的时钟

8 //也可以用占空比为1:338khz的时钟

9

10 always@(posedgeclk ornegedgerst_n)

11 if(!rst_n)

12 begin

13 count <=0;

14 clk_38khz <=1;

15 end

16 elseif(count ==(50_000_000/38000/2-1))

17 begin

18 clk_38khz <=~clk_38khz;

19 count <=0;

20 end

21 else

22 count <=count +1'd1;

23

24 endmodule8

测试模块:

0 `timescale1ns/1ps

1

2moduleinfrared_tb();

3

4 regclk,rst_n;

5 regkey;

6 wiretx;

7 wire[7:0]show_data;

8

9 //因为我们代码中只发送一次数据,所以可以把key一直拉低

10

11 initialbegin

12 clk =1;

13 rst_n =0;

14 key =1;

15

16 #100.1rst_n =1;

17

18 #200key =0;

19

20 end

21

22 always#10clk =~clk;

23

24 infrared dut(

25 .clk(clk),

26 .rst_n(rst_n),

27 .key(key),

28 .tx(tx),

29 .rx(rx),

30 .seg1(seg1),

31 .seg2(seg2)

32 );

33

34endmodule

仿真:

仿真中我们可以把数码管模块的计数器的值改小一点,便于仿真


如图中所示的我们发的是32h00ffa25d,那么数据为是8b1010_0010,那么先发送时就时就按下面的序列开始0100_0101接收到的为45,所以工程正确。








声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21736

    浏览量

    603252
收藏 人收藏

    评论

    相关推荐

    温度越高辐射的红外线越怎么样

    引言 红外线是一种电磁波,波长介于可见光和微波之间,具有热效应。红外线辐射是物体因温度而产生的电磁波辐射,其辐射强度和波长与物体的温度密切相关。 红外线的基本概念和特性 2.1 红外线
    的头像 发表于 08-20 09:47 1368次阅读

    红外线的温度高还是紫外线的温度高

    引言 红外线和紫外线是电磁波谱中的两种重要类型,它们在自然界和人类社会中都有着广泛的应用。 红外线与紫外线的基本概念 2.1 红外线
    的头像 发表于 08-20 09:46 2350次阅读

    红外线与紫外线有什么区别与功能

    引言 红外线和紫外线都是电磁波的一种,它们在自然界中广泛存在,对人类的生活和科学研究都有着重要的影响。然而,由于它们的特性和应用领域不同,人们对它们的了解程度也不尽相同。 红外线与紫外线
    的头像 发表于 08-20 09:44 2985次阅读

    红外线外线的特点及应用有哪些

    红外线的特点: a. 波长范围:红外线的波长范围在0.75微米至1000微米之间。 b. 热效应:红外线具有较强的热效应,能够使物体加热。 c. 穿透能力:红外线的穿透能力较弱,容易被
    的头像 发表于 08-20 09:42 1291次阅读

    红外线最显著的特点是它的什么效应

    红外线最显著的特点是它的 热效应 。这种效应体现在红外线能够辐射热量,使物体发热。具体来说,红外线的热效应包括以下几个方面: 辐射热量 :红外线是光谱中光热效应最大的区域,任何高于绝对
    的头像 发表于 08-20 09:39 1232次阅读

    红外线有哪些特点和作用

    引言 红外线是一种电磁波,波长介于可见光和微波之间。它在自然界和人类社会中有着广泛的应用,如热成像、遥感、医疗、工业、军事和通信等领域。本文将介绍红外线的特点和作用。 红外线的定义和分类 红外
    的头像 发表于 08-20 09:33 2158次阅读

    源码系列:基于FPGA红外线遥控系统设计(附源工程)

    今天给大侠带来基于FPGA红外线遥控系统设计,附源码,获取源码,请在“FPGA技术江湖”公众号内回复“
    发表于 05-01 19:59

    红外线传感器工作原理与特点

    红外线传感器是一种非接触式的光电传感器,用于检测物体是否存在或者物体特征的变化。它广泛应用于许多领域,例如家电、工业控制、机器人学和汽车安全等。 1)红外线传感器的工作原理 基于物体对红外线的反射
    的头像 发表于 03-27 18:25 3363次阅读

    如何实现一种基于FPGA红外线遥控系统设计呢?

    红外线(Infrared)是波长介乎微波与可见光之间的电磁波,波长在760纳米(nm)至1毫米(mm)之间,比红光长的非可见光。
    的头像 发表于 03-27 11:26 1836次阅读
    如何实现一种基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>红外线</b><b class='flag-5'>遥控</b><b class='flag-5'>系统</b>设计呢?

    如何区分红外线接收头的引脚图与放大电路

    如何区分红外线接收头的引脚图与放大电路 红外线接收头是一种用于接收红外线信号的元件,常用于红外线遥控器、
    的头像 发表于 01-31 15:04 4850次阅读

    如何区分红外线发射管与红外线接收管

    如何区分红外线发射管与红外线接收管 红外线技术在我们的日常生活中扮演着重要角色,它被广泛应用于安全监控、遥控器、自动化控制等领域。红外线发射
    的头像 发表于 01-31 15:04 3146次阅读

    如何区分红外线接收头的故障部位?

    如何区分红外线接收头的故障部位? 红外线接收头是一种常见的电子元件,用于接收红外线信号。它在家电、无线通信等领域被广泛应用,但由于长期使用或其他原因,红外线接收头可能会出现故障。以下是
    的头像 发表于 01-31 15:04 2273次阅读

    如何提高红外线发射管在遥控器上的发射距离

    如何提高红外线发射管在遥控器上的发射距离  遥控器成为了我们日常生活中不可或缺的一部分,我们通过遥控器可以控制电视、空调、音响等大量设备。而遥控
    的头像 发表于 01-31 14:47 3302次阅读

    红外遥控与蓝牙遥控的区别

    ,我们将详细介绍红外遥控和蓝牙遥控的特点和区别。 首先,红外遥控是一种基于红外线的无线
    的头像 发表于 01-25 16:23 7375次阅读

    红外线感应开关原理 红外线感应开关怎么接线

    红外线感应开关是一种利用红外线传感技术实现自动开关控制的设备。它广泛应用于电梯、自动门、安防系统、照明等各种场合,具有非接触式、高精度、高可靠性等特点。 红外线感应开关的工作原理主要包
    的头像 发表于 01-23 17:15 3828次阅读