找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4475|回复: 0
收起左侧

max7000系列CPLD红外线遥控课程设计(含源代码与文档)

[复制链接]
ID:259533 发表于 2018-3-12 23:19 | 显示全部楼层 |阅读模式
数字系统设计


第一部分  设计题目及要求
本次设计的题目及要求如下:

一、设计题目

红外线遥控接收器

二、设计步骤

1、EDA实验板组装调试

参照提供的EDA实验板电路原理图、PCB图以及元器件清单进行电路板的组装。电路板组装完成后,编写三个小程序进行电路板测试。

2、红外遥控系统的设计

(1)发射编码部分

使用指定的元器件在万用板上完成红外遥控器的制作。

(2)接收解码部分

接收解码用VHDL语言编写程序,在EDA实验板上实现解码。

二、功能要求

1、将一体化红外接收解调器的输出信号解码(12个单击键、6个连续键,单击键编号为7-18,连续键编码为1-6),在EDA实验板上用七段数码管显示出来。

2、当按下遥控器1—6号连续键时,在EDA实验板上用发光二极管点亮作为连续键按下的指示,要求遥控器上连续键接下时指示灯点亮,直到松开按键时才熄灭,用于区别单击键。

3、EDA实验板上设置四个按键,其功能等同于遥控器上的1—4号按键,当按下此四个按键时七段数码管分别对应显示“1”、“2”、“3”、“4”。

4、每当接收到有效按键时,蜂鸣器会发出提示音。

第二部分   设计分析

本次设计包括两大部分,一是电路设计及电路焊接,二是程序的设计及编写。

电路部分,根据题目要求,要做到红外发送,显然整个电路系统要分为红外发射和红外接收两个电路,分别做到红外的编码发射和译码接受,再在接收板上显示接受到的红外信号。另外还包括一个从电脑下载程序到芯片上的下载线电路。

  • 红外发射电路

本次设计的红外遥控器由红外遥控专用芯片PT2248作为编码及发送部分,PT2248最大可用作18路红外遥控系统的编码,其内部己集成了38kHz的红外载波振荡及相应的数字脉码调制电路,只需外接3×6的矩阵式按键、红外发光二极管及其驱动电路等少量元器件便可完成编码发送的功能。

由PT2248和少量外围元件组成的红外遥控发射电路如下图所示

芯片的发送指令由12位码组成,其中C1~C3是用户码,可用来确定不同的模式。用户码设定是以列线内接入二极管为界线,当T1~T3与CODE之间分别接入二极管时,用户码(C1~C3)为“1”;当T1~T3引脚不接二极管时,用户码为“0”。如果该芯片与BL9150相结合,则C3引脚必须接入二极管;如果该芯片与BL9149相结合,则C2必须接二极管,H、S1和S2是代表连续发送或单次发送的码,且分别与T1、T2和T3列的键对应。D4~D6是发送的数据码(也是键输入码)

上图中3V电源电压一方面为芯片提供推荐工作电压并加到引脚16,另一方面作为信号输出指示复合管的工作电压。为了使振荡频率为455kHz,特采用外接晶振,并外接两个电容120pF旁路到地。图7中三列T1、T2、T3和CODE分别接一个二极管,目的是为了使用户码(C1、C2、C3)为“1”。

  •       红外接受部分
本次设计的红外接受部分采用EDA实验板,EDA实验板的顶层PCB图如下:
.
硬件部分的设计:

板的中心部件采用的是max7000系列CPLD,另外采用4M晶振以及红外接收管(38K接收头)直接在逻辑箱制作红外接收解码电路。红外接收管有3个管脚,自左至右分别是信号输出端,地端,电源端,分别接到逻辑箱的相应管脚上;同时,为了得到更加稳定的信号,在信号输出端与地端加入一滤波电容。

三,下载线电路

本次设计采用的下载线把电脑的打印机口和实验板的数据口连接起来,从而把程序从电脑下载到实验板的芯片里,如下图:

下载线电路采用芯片74LS244构成下载线电路,电路图如下:
下载线电路板的顶层PCB图如下:
第三部分  系统模块的划分以及各模块的功能描述

在这一部分,我将对系统功能进行模块化划分,对各模块功能作详细阐述。

  • 发射板部分

  发射板主要由红外线编码芯片PT2248 构成红外编码这个模块。

  PT2248的管脚图如下图所示:



其各个管脚的功能如下表:




PT2248组成的十八路遥控发送器其编码规则如下:

(1)设a为一个时间单位,时间长度是38kHz的16个时钟周期,即

a=1÷38kHz×16=0.421ms

              编码是以串行形式发送的,在接收端(38kHz一体化红外接收解调器)接收到如下形式的1位的编码时分别表示“0”和“1”:

1个a的低电平,3个a的高电平表示编码“0”

3个a的低电平,1个a的高电平表示编码“1”

编码以串行形式发送,接收端的一体化红外接收解调器输出波形如下图所示:

此外,由于发射器发送的时候,有两个信号,一种是表示单击的,一种则是表示连续的,这两种不同的信号,其自身都有自己的特点:

(2)遥控器的每个按键编码由12位按以上编码规则所代表的“0”、“1”组成,时间长度为48a,当按下遥控器的7到18号单击按键,则以12位为一组(48a)发送两次编码,如下图所示:

60a为自按下按键到发送编码的等待时间,80a是前后两次发送12位48a编码的高电平时间间隔。7到18号单击按键无论发送端按键时间持续多长只发送一次这样形式的两组相同的12位编码。

(3)当按下1到6号连续按键时,编码按如下格式连续发送:

由上图可以清楚的看到,两种信号的巨大差别,可是在程序的编写过程中,这种差别却没有什么很大的作用,因为两种信号在译码上的区别也是相当明显的,故为了简化程序,直接由译码来区别连续单击比利用上图的效果更好,具体见程序。

(4)芯片的发送指令由12位码组成,如下所列。其中C1~C3是用户码,可用来确定不同的模式。用户码设定是以列线内接入二极管为界线,当T1~T3与CODE之间分别接入二极管时,用户码(C1~C3)为“1”;当T1~T3引脚不接二极管时,用户码为“0”。

具体每个12位的串行编码规则如下:

C1、C2、C3为用户可通过在遥控器发射电路中是否接入IN4148二极管决定其为“0”或“1”,这里取“111”,H、S1、S2为单击连续按键的标志位,相当于列坐标,D1至D6为按键输入码,相当于行坐标,低9位的按键编码如下表所示:


按键
低9位编码
H
S1
S2
D1
D2
D3
D4
D5
D6
1
1
0
0
1
0
0
0
0
0
2
1
0
0
0
1
0
0
0
0
3
1
0
0
0
0
1
0
0
0
4
1
0
0
0
0
0
1
0
0
5
1
0
0
0
0
0
0
1
0
6
1
0
0
0
0
0
0
0
1
7
0
1
0
1
0
0
0
0
0
8
0
1
0
0
1
0
0
0
0
9
0
1
0
0
0
1
0
0
0
10
0
1
0
0
0
0
1
0
0

续上表:
二,接收部分

接收部分电路主要可分为红外接受模块,译码电路模块,小键盘模块和数码管显示模块几个部分,红外信号的编码从发射板发射到接收板上的红外信号接收头后 ,译码电路把红外编码翻译后送到数码管显示,小键盘输入的代码也经译码电路在数码管上显示对应的按键信息。


(一).红外信号接受

本设计的红外接受头采用一体化红外接收解调器,如下图:

其引脚图如下:

一体化红外接收解调器的内部电路如下图:

  上面详述的红外信号发射电路把发射板上的按键信息编成编码以红外信号的形式发射到接收板,该一体化红外接收解调器接收到红外信息后,把其包含的编码信息传到下一级译码电路,从而完成红外信号的接收。

当红外接收头接收到遥控器发出的信号时,逻辑箱上的蜂鸣器需发出提示声。因设计时只考虑译码器具有最简单的译码功能,这样就要求前面的编码电路在每发出一串12位编码的同时发出一个脉冲给计数器,使计数器输出为高电平,同时开始计数,直至计数到规定值后又回到低电平,完成响铃提示。
(二)红外编码译码电路

根据芯片介绍可知,红外接收头接收到的编码,每一帧完整的串行数据有十二位,而每一位的BIT‘0’、BIT‘1’是占空比不同的矩形方波,要完成以后的功能,就需要一个编码器将其编成逻辑器件能识别的普通逻辑电平‘0’、‘1’。

红外接收头接收负责接收38k载波的红外光,解调得到脉冲,输出至译码电路。接收头接收到的脉冲如图(与发射波形刚好互为反码): (a为38kHz时钟的16个周期)

每个按键的值由12bit组成:

按键编码格式:

译码电路有把对应的译码程序下载后的CPLD构成,CPLD的外围电路如下图:

CPLD和芯片74HC4040以及其他元件构成译码电路,74HC4040的管脚图如下图所示:
其内部电路图如下图:
一体化红外接收解调器接收到红外信息后,将红外编码通过73HC4040传到CPLD进行译码。
(三)红外编码显示电路

这部分电路将译码后得到的十二位普通高低电平‘0、’‘1’编码译成相应的压缩BCD码1~18,应十位仅有0、1两种可能,将译得的BCD码直接接芯片4511的输入引脚,4511的译码输出并接到4位LED数码显示管,再在程序中写入十位和个位选择的进程,即可得到相应1~18数字显示输出。

显示部分电路由芯片CD4511BC构成,译码后的高低电平从CPLD的44,45,46,48,49管脚传输到CD4511BC,进行译码,这部份电路如下:

CPLD的33——41角分别接到三级管(8050)Q2——Q9,通过段路线,选择两个四位LED数码显示管里的共八位显示中的哪一位或哪几位显示,没有接段路线的那些位的显示管将不亮。

CD4511BC的管脚图如下图所示:

其真值表及对应的LED数码显示管显示如下:

(四)小键盘电路

   EDA实验板上有个4*4 的按键矩阵,当按键被按下时,其输出引脚为低电平,而其余时间内均为高电平。当按下每一行的四个键时,七段码显示管应显示1—4,必须将四个按键并行输入的按键编码转换成1—4的BCD码才能输出显示。按键输入与遥控输入应共用两个七段码显示管输出,这样就需要在程序中将输入的遥控信号与按键信号先进行选择再输出。

  这部分电路如下图所示:

第四部分  程序设计及注释源程序

一、本次设计的程序设计的ASM图如下:

        


二、程序设计时的主要部分以及遇到的问题及解决方案:


1频率的同步问题:

这是本程序的一个关卡,由于信号的载波是16k,而晶振的频率采用了4M,就是说无论怎么分频,逻辑箱出来的频率都不可能得到载波信号的频率,所以有可能经过几次解码之后便出现误码。

本设计具体采用的处理措施如下:4M的2的7次方分频(没有安装word的公式,请见谅哦),所得到一个信号(即4个a)为14倍clk,这里用到一个cnt1,每个时钟上升沿计数一次,计数到第7个时钟上升沿时,便进行读数,根据0和1波形的特点,可知在此时输入信号infared_in与其真正表示的值相反,故有:

if cnt1=7 then reg2<=reg2(7 downto 0) & not txout;
end if;
在第14个clk后,剩下的0.2个clk将产生误码,故采取以下措施:
when T1=>
if cnt1=50 then
cnt1<=0;
state<=T0;
else
cnt1<=cnt1+1;
end if;

计到第14个clk时(由于其中经过两个状态,所以计数只计到12),又回到T0,重新检测infared_in=‘0’后回到T1状态,从而取出那0.2个clk的影响。


2)如何判断接收到一串完整的12位数据问题:

如果采用cnt1计数来控制的话,会导致cnt1的取值过大,而且会出现误差时间的积累,故本程序用到的第二个计数器cnt2,其作用也不容小视,在每一次cnt1=7时,都会将cnt2自加,如下:

Ifcnt1=7 then
cnt2<=cnt2+1;
reg<=reg (7 downto 0) & not infared_in;
end if;                                 
if  cnt2=12 then
cnt2<=0;
speaker<='1';
end if;

这是用来记录移入寄存器reg的次数,计到12时,说明已经接收了1个完整的信号了,此时把cnt2清零,以便下一次接收信号时使用。

3) 指示灯跟蜂鸣器的问题:

当接收一个完整的信号之后,当让就是对这存在reg中的一串01代码进行译码了,同时根据题目要求,蜂鸣器要相应的响一声。故当cnt2=12时sound赋为高电平,并启用第三个计数器cnt3,cnt3在下一个时钟上升沿开始自加,加至16000,即延时16000/16k=1秒后停止,后将sound从新赋0。具体实现如下:

if cnt2=12 then
cnt2<=0;
speaker<='1';
end if;
if speaker='1' then
cnt3<=cnt3+1;
if cnt3=16000 then
cnt3<=0;
                              speaker<='0';
end if;
end if;
4、EDA板上的按键问题:EDA试验板的按键的每一行的四个按键分别对应B1 ,B2,B3,B4,具体实现只是在时钟上升沿下加入一下程序段即可。
if B1='0' then
reg<="100100000";
             end if;
             if B2='0' then
reg<="100010000";
             end if;
             if B3='0' then
reg<="100001000";
             end if;
             if B4='0' then
reg<="100000100";
             end if;
  • 源程序
综合上面所讨论的几点,可的得到本次设计的源程序(带注释)
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;
  4. entity infared is
  5. port (clk,infared_in,B1,B2,B3,B4,reset:in std_logic;
  6. --B1.B2.B3.B4为实验版上4*4键盘每一行对应的4个按键
  7. --infared_in为红外接收头接收并解码输出的信号
  8. BCD_out : out std_logic_vector(3 downto 0);   
  9. --芯片输出到4511的经红外编码后的12位按键码对应的4位代码
  10. selet: out std_logic_vector(1 downto 0);        
  11. --数码显示管十位和个位的选择信号
  12. led,speaker : buffer std_logic);               
  13. --连续键的指示灯信号,按键按下即蜂鸣器信号
  14. end infared;
  15.   architecture behav of infared is
  16.       type state_type is (s0,s1,s2);
  17.       signal state : state_type;
  18.       signal reg : std_logic_vector(8 downto 0);
  19.       signal cnt1 : integer range 0 to 14;
  20. --0, 1解码计数器。对0的个数的计数,遇到0则开始计数,遇到1就停止,以区别0和1的编码
  21.       signal cnt2 : integer range 0 to 12;
  22. --输入的编码位数计数器,计数到到12就把编码输出到infared_in
  23.       signal cnt3 : integer range 0 to 16000;
  24. --蜂鸣器延时计数器
  25.       signal cnt4 : integer range 0 to 1;
  26. --个位十位选择计数器,为0时数码管显示个位,为1显示十位
  27.   begin
  28. judge:process (clk,infared_in,cnt1)  
  29. --进程1,判断是否接受到低电平,红外接受低电平有效,infared_in=0时表示有编码输入
  30.       begin        
  31.         if clk'event and clk='1' then
  32.           case state is
  33.             when s0=> if infared_in='0' then
  34.                          state<=s1;
  35.                       else
  36.                          state<=s0;               
  37. --检测输入信号,如果是高电平则继续检测;如果为低电平则进入状态s1
  38.                       end if;
  39.             when s1=> if cnt1=12 then
  40.                          cnt1<=0;
  41.                          state<=s2;
  42.                       else cnt1<=cnt1+1;              
  43. --计数到12时,跳到s2状态,继续检测低电平
  44.                       end if;
  45.             when s2=>
  46. if infared_in='1' then         
  47. --若出现高电平则跳回s0状态
  48.                          state<=s0;
  49.                                                                         else
  50.                          state<=s2;
  51.                     end if;
  52.            end case;
  53.         end if;                                       
  54. --当计数到7时,自动跳到进程com2,每接收完一个完整的0或1信号后,自动接收下一个信号,自身不停地在两个状态中轮换。
  55.      end process judge;
  56. coding:process(clk,cnt1,cnt2,cnt3,B1,B2,B3,B4)      
  57. --编码译码进程
  58. begin
  59.      if clk'event and clk='1' then
  60.          if B1='0' then
  61.            reg<="100100000";         
  62. --B1按下,寄存器储存表示00000001的代码。
  63.          end if;
  64.          if B2='0' then
  65.            reg<="100010000";         
  66. --B2按下,寄存器储存表示00000010的代码。
  67.          end if;
  68.          if B3='0' then
  69.            reg<="100001000";         
  70. --B3按下,寄存器储存表示00000011的代码。
  71.          end if;
  72.          if B4='0' then
  73.            reg<="100000100";         
  74. --B4按下,寄存器储存表示00000100的代码。
  75.          end if;
  76.          if cnt1=7 then                             
  77.             cnt2<=cnt2+1;                           
  78. --cnt2加1,表示移入一位数据
  79.            reg<=reg (7 downto 0) & not infared_in;
  80.           end if;                                 
  81. --当计数到7时,将接收到的infared_in的相反值移入寄存器。
  82.            if cnt2=12 then                        
  83. --当cnt2计数到12时,表示接收到了完整的一串数据,自身清零并开启蜂鸣器
  84.                cnt2<=0;
  85.                speaker<='1';
  86.             end if;
  87.             if speaker='1' then
  88.                  cnt3<=cnt3+1;
  89.               if cnt3=16000 then
  90.                  cnt3<=0;
  91.                  speaker<='0';                        
  92. --计数cnt3计到16000时赋0,蜂鸣器停止,即蜂鸣器鸣响时间持续16000/16k=1秒后停止
  93.               end if;
  94.             end if;
  95.         end if;

  96.      end process coding;
  97. display:process(clk,reg,reset)                          
  98. --显示进程。低9位编码转换成对应的BCD输出,1-6连续按键灯亮,7-18单击键灯灭,
  99.    begin
  100.      if(reset='1') then                                  --高电平复位
  101.        BCD_out<="0000";
  102.        selet<="11";
  103.        led<='1';                                       
  104. --若按下复位键,十位个位同时显示0,指示灯亮
  105.      elsif (clk'event and clk='1') then
  106.        led<='1';                              
  107.          case reg is
  108.           when "100100000" => BCD_out<="0001";            --显示1
  109.                             selet<="01";
  110.                             led<='0';
  111.           when "100010000" =>BCD_out<="0010";              --显示2
  112.                              selet<="01";
  113.                              led<='0';
  114.           when "100001000" => BCD_out<="0011";              --显示3
  115.                             selet<="01";
  116.                             led<='0';
  117.           when "100000100" => BCD_out<="0100";              --显示4
  118.                             selet<="01";
  119.                             led<='0';
  120.           when "100000010" => BCD_out<="0101";              --显示5
  121.                             selet<="01";
  122.                             led<='0';
  123.           when "100000001" => BCD_out<="0110";              --显示6
  124.                             selet<="01";   
  125.                             led<='0';
  126.           when "010100000" => BCD_out<="0111";              --显示7
  127.                             selet<="01";
  128.                             led<='1';
  129.           when "010010000" => BCD_out<="1000";              --显示8
  130.                             selet<="01";
  131.                             led<='1';
  132.           when "010001000" => BCD_out<="1001";             --显示9
  133.                             selet<="01";
  134.                             led<='1';                     
  135. --连续键时led赋为高电平,灯亮;sel赋值''01''表示采用个位显示
  136.           when "010000100" =>if (cnt4=0) then
  137.                              cnt4<=cnt4+1;
  138.                             BCD_out<="0000";            --个位显示0
  139.                              selet<="01";
  140.                             else cnt4<=0;
  141.                             BCD_out<="0001";             --十位显示1
  142.                              selet<="10";
  143.                             end if;                     
  144. --两位数利用计数器cnt4实现个、十位轮流显示。
  145.           when "010000010" =>if (cnt4=0) then
  146.                               cnt4<=cnt4+1;
  147.                              BCD_out<="0001";           --个位显示1
  148.                               selet<="01";   
  149.                              else cnt4<=0;
  150.                              BCD_out<="0001";            --十位显示1
  151.                               selet<="10";   
  152.                              end if;     
  153.           when "010000001" => if (cnt4=0) then
  154.                                cnt4<=cnt4+1;
  155.                               BCD_out<="0010";           --个位显示2
  156.                                selet<="01";
  157.                              else cnt4<=0;
  158.                                BCD_out<="0001";           --十位显示1
  159.                                selet<="10";
  160.                              end if;
  161.           when "001100000" => if (cnt4=0) then
  162.                                cnt4<=cnt4+1;
  163.                                BCD_out<="0011";           --个位显示3
  164.                                selet<="01";
  165.                              else cnt4<=0;
  166.                                BCD_out<="0001";           --十位显示1
  167.                                selet<="10";
  168.                             end if;

  169.           when "001010000" => if (cnt4=0) then
  170.                               cnt4<=cnt4+1;
  171.                               BCD_out<="0100";            --个位显示4
  172.                              selet<="01";
  173.                             else cnt4<=0;
  174.                              BCD_out<="0001";             --十位显示1
  175.                              selet<="10";
  176.                             end if;
  177.           when "001001000" =>if (cnt4=0) then
  178.                              cnt4<=cnt4+1;
  179.                              BCD_out<="0101";             --个位显示5
  180.                              selet<="01";
  181.                           else cnt4<=0;
  182.                              BCD_out<="0001";             --十位显示1
  183.                             selet<="10";
  184.                          end if;
  185.           when "001000100" => if (cnt4=0) then
  186.                              cnt4<=cnt4+1;
  187.                              BCD_out<="0110";             --个位显示6
  188.                              selet<="01";
  189.                            else cnt4<=0;
  190.                              BCD_out<="0001";             --十位显示1
  191.                             selet<="10";
  192.                            end if;
  193.                              led<='1';
  194.           when "001000010" => if (cnt4=0) then
  195.                              cnt4<=cnt4+1;
  196.                              BCD_out<="0111";             --个位显示7
  197.                              selet<="01";
  198.                            else cnt4<=0;
  199.                              BCD_out<="0001";             --十位显示1
  200.                              selet<="10";
  201.                          end if;
  202.           when "001000001" =>if (cnt4=0) then
  203.                              cnt4<=cnt4+1;
  204.                              BCD_out<="1000";             --个位显示8
  205.                              selet<="01";
  206.                            else cnt4<=0;
  207.                              BCD_out<="0001";             --十位显示1
  208.                              selet<="10";
  209.                           end if;
  210.          when others => led<='1';
  211.                       selet<="00";                           
  212. --其他数码无显示,指示灯亮
  213.        end case;
  214.     end if;
  215.   end process display;
  216. end behav;
复制代码


第五部分  程序仿真

本次设计程序的一个仿真波形图见下页:

该波形图可分为两部分,第一部分是EDA板对红外发射所发射的信号进行译码 ,并输出BCD码,即其他输出的部分,第二部分是对EDA试验板的键盘矩阵输入信号的译码BCD码输出。

一、红外译码部分

   在B2的低电平脉冲输入前的部分属于刚才讲的第一部分,即红外译码部分,此时EDA试验板上的按键均没有按下,所也B1,B2,B3,B4都把保持高电平。

   这部分波形图示仿真红外发射器的按键1按下是的情况。根据红外编码芯片PT2248的编码规则,按键1按下是的编码应该是“100100000”,上面也提到,每个代码‘0’或‘1’的波形包括4个时钟周期:‘0’是1个时钟周期的低电平加3个时钟周期的高电平;‘1’是3个时钟周期的低电平加1个时钟周期的高电平。所以“100100000”的波形应该如下图所示:

    当9位编码“100100000”全部接收完后,CPLD的BCD码输出为“0001”,即数码管显示1,如下图:

Selet输出,即选择个位数码管显示。

二 、EDA板上的按键编码及BCD码输出

   EDA板上的按键按下时,红外发射板的信号不能被EDA板接收,故CPLD是对EDA板上的按键信号进行译码的。

这部分波形从B2低电平脉冲,即B2按下开始,B1,B2,B3,B4分别是4*4键盘的右数第一,二,三,四列的任何一个按键,随后是B3,B1,B4的低电平脉冲,如下图:

   先后输出的BCD码为“0010”,“0011”,“0001”,“0100”,如下图:

   即B2按下时数码管显示2,B3按下时数码管显示3,B1按下时数码管显示1,B4按下时数码管显示4,仿真无误。

第六部分  设计体会及心得

一、设计过程中遇到的问题及解决方法

上面已经提过,本次设计的设计分为两个方面:电路板和程序。

程序设计遇到的问题的解决方案及解决方法几经在第四部分阐述,这部分主要讨论电路板设计,焊接及调试遇到的问题和解决方法。

  • EDA试验板和数据线电路板

这两块板发下来时电路已经设计好,主要出现的问题在焊接上。

在焊接前先观察这两块板,看清哪面是元件面,哪面是焊接面,画有元件图案的那面是元件面,焊接是要把元放在这一面上。

在焊接过程中最容易犯的错误就是把IC,晶振,三级管,稳压器,红外接收器,排阻,二极管等元件的管脚焊错。

IC中管角最多的就是CPLD的IC座了,要是焊错了,这个83个脚的元件拆下来的困难程度将是很难想象的。其实把它含对不难,在IC座内部的IC槽有一个是缺脚的,而实验板元件面上画图案也是有一个缺角的,只要把位置对好,先把IC座的两个对角的管脚焊好,再焊其他脚就可以顺利焊好它了。其他IC都有一个缺口,只要把缺口和板上画的缺口对齐,同样把对角的两个管脚焊好再焊其他脚,就行了,IC上有一个管脚的旁边有一个圆形的凹陷,板上和这个角对应的焊盘是方行的,根据这个规则也可以可方便的把IC焊好。

焊晶振,三级管,稳压器,红外接收器时,只要把元件和板上画的图案对齐,就可以焊好。比如:晶振的四个角只有一个角是直角,其他三个角都是圆角,板上画的图案也是这样,只要把直角对齐,就可以焊好了。

普通二极管有一头印有一个黑色的环,试验板上普通二级管的图案也是有一头是有黑色(或白色)的,对其再焊就可以把二极管的正负极焊对。发光二级管的两个管脚是一长一短的,长的那根是正极,试验板已经把发光二极管的正负极标上去,真样也很容易就把放光二极管焊好。

在焊接过程中遇到的另一个问题就是焊电阻等比较矮的元件时,焊好后发现元件没有紧贴在板上,这是就要把焊锡熔调,调整元件的位置,有时候在熔焊锡时,会把焊盘弄调,这时可以在元件面上焊,应为试验板元件面和焊接面都有焊盘的。另外,焊接元件时一定要记住先焊矮的元件,再焊高的,这样就方便把元件紧贴在板上。

焊接结束后,把测数码管的程序下载到CPLD里,发现有一个数码管的亮得不正常,程序写的是8为数码管从右向左依次显示0——9,发现左数第四位的二级管是在其他管亮过一编后再闪一下,怀疑是于这为数码管连接的三极管坏了,根据电路图,找到和这为数码管相连的三级管是Q6,把这个三极管换掉后,数码管就正常显示了。

2.发射板部分

发射板是采用面包板,根据PT2248和少量外围元件组成的红外遥控发射电路设计成的,焊接部分遇到的问题和EDA板焊接遇到的问题类似,只不过,发射板的电路显得比较拥挤,焊盘挨得比较紧,很容易造成短路,焊接时要十分小心,发现两个焊盘有可能短路时马上用万用表的欧姆档检测。

发射板焊接电路最复杂的就是3*6键盘矩阵的焊接电路。考虑到按键的四个管角中,在同一测的两个角是不导通的,而不再同一侧的相对的两队管脚是内部导通的,当按键按下时,四个管角全部连通,开关就相当于一个节点,把18个按键竖着排列在板上,同一侧的管角处于上下位置,把每个同侧管角的右边那个和它正上方(或下方)的按键的管脚焊在一起,这样6根竖线就形成了。在三行按键之间和最下面那行按键的下方固定一条导线,把三行按键下方同测管脚的左边那个通过导线连起来,这样三条横线也形成了。到此,3*6的键盘矩阵电路就焊接完毕,再把这3根横线和6根竖线根据电路图接到芯片上,再焊其他元件,发射板电路就完成了。

在设计发射板电路时,我在红外发射二极管的旁边串连了一个发光二级管,这样有按键按下时,发光二级光就会亮。这样就能检测发射板是否有信号发出,也可以检测发射板是工作正常。


二、心得体会

历经快学期的两周的数字系统设计在我把我亲手做的EDA试验板和红外发射板,还有CPLD里面的程序交到老师手中并通过验收的那一克结束了。看到自己的作品,虽然不管从外表还是实现的功能都和其他同学的相差无几,但心里有一股很强的成就感,也有如释重负的轻快。

短短两周的时间很可能是我走向社会,走向工作的一个缩影,遇到难题,积极求证,分析问题,解决问题…一系列的过程不仅让我体会到了面对问题无从下手的尴尬,也让我体味到问题迎刃而解的喜悦。这次设计使我学到了许多东西,不仅理论知识,实践能力得到了很大的提高,也锻炼了自己的意志。

无可非议,数字系统设计时四门设计中设计面最广,科技含量最大,难度最大,立时最久的一门设计。程序方面,设计的程序比微机设计的复杂;焊板方面,工作量比高频设计的大;实现的功能方面,比模电设计的更前卫,这些因素时使这次设计给我留下了及其极其深刻的印象,也使我学到许多课堂上,课本里根本就学不到的东西。

数字系统是现在社会上的热门话题,这方面的人才的社会需求量也是相当大的。这方面的知识也是很有趣的,特别是程序下载,通过编程可以使实验板有自己想要的功能,这是一件很有趣的事情。

   这次设计加深了我对FPGA/CPLD的认识,也是我巩固可VHDL语言的知识,还锻炼了动手能力,可以说是受益匪浅。我在这方面的知识还是比较薄弱的,但我对这方面的知识很感兴趣,这次设计给了我一个很好的机会学习数字系统的实践知识的机会。

这次设计也是我学会了不轻言放弃,不怕困难,不怕麻烦,在做实验的过程中,会重复不断的遇到一些相同的问题,特别是程序和电路的调试时,往往要经过很多次反复的检查、测量才能找到问题的所在,要使不能静下心来,仔细研究,完成设计时不可能的。

这次的设计给了我又一次认识自我的机会,让我学会了从更多角度分析解决问题,设计的过程中也积攒了一些相关的项目经验,我想对我以后的实际操作肯定会有很大帮助的。设计给与了我们一个平台去发挥自己的学到的理论知识,锻炼了我们的动手能力,巩固了我们所学的知识,为我们以后步入社会做了准备,使大学生学习相当重要的、不可或缺的一部份。


完整的Word格式文档51黑下载地址:

红外线遥控设计-课程设计(含源代码).rar (714.07 KB, 下载次数: 24)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表