找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4129|回复: 0
打印 上一主题 下一主题
收起左侧

低频频率特性测试仪制作

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-25 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hongniu 于 2015-6-25 22:57 编辑

今年“XILINX&高教社”杯SOC专项比赛使今年的省赛有意思了。我有幸参加了吉林省的比赛,测试时第32号,一共40队。测试完毕后是第一名,成绩比第二名多一倍。从8月29号开始学习FPGA,到9月12号比赛,虽然学的时间没几天,但是对这个题目还是有比较深刻的认识的,比赛时我带实验室两个大一的师弟比赛,我负责所有程序的编写和一半的硬件。比赛题目不知道的网上去下,这里不说了。

首先说我对这个开发板的评价--相当的不爽,首先电源,没有单独的3.3V输出,只在普通I/O口每组有两个,而且那个普通I/O口相当恶心,还不如做成插针的。还把大部分I/O弄成那种借口,我都忘了叫什么了,根本就买不到那个座,所以大部分I/O口都用不了...

对于ISE,BUG实在太多,第一个就是我的笔记本装上用不了,XPS总是不能生成BIT文件,网上也没有解决方案最后只能借别人电脑来用。用的时候也问题多多。。。

言归正传~~
我看到很多人的解决方案都是外面用个单片机,把FPGA当元件用(我感觉就是没用,往那一摆)。这事钻试题的空子,严格来说就是没做出来。
分析一下试题:
1.阻容双T网络:开始一看挺蒙,后面一分析,就是个无源带阻滤波器
2.中心频率30K,带宽100HZ...我是做不出来,当时就找了一个压差比较大的参数(最大压差有1.4V左右)
3.要扫频,必须有DDS,无论你是用SPWM实现+低通,还是用D/A,或者现成DDS。
4.要测幅频特性,就得有A/D,还要有峰值检测电路。
5.要测相频特性,就得把正弦波弄成方波,这里用比较器。
6.要在一个示波器上用XY同时显示两条曲线(有绝大多数人都用的两个示波器的YT模式,虽然给分了,但严格说
  不服合题意),要用到两路D/A,这里我用的滤波整流,没用芯片,下文详细说。
7.显示部分,题目要求用数码管,可板上就4个数码管,怎么显示那么多东西啊!(这里题目有点问题,最可气
的是我用12864同时显示所有数据,竟然有评委说不符合要求!!!说必须用数码管。。。其实我数码管也做
  了嘻嘻)

   
                     首先声明,我说的纯属个人经验,要是有技术上的问题还请雅正~

首先安装ISE10.1我安了2天,每次都是ISE好用,XPS点生成BIT流文件后就是不运行,每次打开之前还有个警告,反正就是不好使。查了好多资料也不知道为什么。最后不行向师弟借的电脑,同样的安装步骤,人家的就好用...无语了。

对于教程,比赛之前何宾老师给每个赛区的参赛带队老师都做了培训,那个培训资料非常的好,网上能下到,大家按照那个教程(5篇PPT)看一看,就会用ISE和EDK了。最重要的就是讲ISE和EDK那两篇,其余了解。

使用软件时要注意几点:
1.所有路径不能包涵中文,包括你的安装路径和打开的工程路径。
2.使用EDK更新自定义IP时,make.file经常出问题,需要手动改动make.file文件,具体怎么该到官网上查。
3.使用EDK时,如果你的SOPC系统有结构错误,EDK往往不能提示(似乎只能检查语法错误)。会表现为打开工程非常的慢,可能刚开始要30秒就能打开你的EDK工程,改一改后可能得10分钟才能打开,甚至卡死。这时候不要以为是软件有错(我添加4个GPIO后,就会出现这个情况,当时我以为是软件BUG),其实是你在配置时有某些细节没有注意,不是软件的错。

还有些记不太清了,有新问题给我留言,我知道的一定解答。

这些日子忙着找工作,一直没更新 现在终于签了 呵呵



关于阻容双T网络,不是我做的,我对模电也不怎么感兴趣。但有一点可以肯定,必须做成带阻滤波器。因为当时比赛的时候我看到有人做成带通的,似乎没给分。我们做的带宽要有1K左右,实在做不了太好了,电位最大差值有1.3V差不多就行,这块没怎么追求。

大体硬件结构就是:FPGA控制产生一个可调正弦波输入双T网络。输出后分两路,一路经过峰值检测电路,然后接AD求伏频(这个电路上网去查吧)。另一路和输入分别进过比较器过零比较,转换成两路方波,直接输入两个FPGA引脚,用门电路自己做相拼检测电路自定义IP,这代码之后我会发给大家。显示部分用12864做的。

关于曲线显示硬件:(为了省事,没用DA)FPGA输出X,Y两路PWM,经低通整成直流,经电压跟随器->加法器(调零点用的,因为我需要负电压才能用XY模式显示

两个曲线)->放大器(调峰值用的,让曲线填满示波器)->电压跟随器->输入到示波器。

时间久了可能有部分忘了,哪里不明白大家问。

DDS叫数字频率合成,一般有两种实现方式:一种是控制AD输出模拟量,另一种是通过SPWM和低通整流而来
本程序是第二种
工作机理有两部分组成:PWM的产生和表
产生部分由两个寄存器和一个计数器组成,计数器不听累加同时与两个寄存器作比较,两个寄存器一个控制置底一个控制拉高,一般把一个固定就行了(有的地方说是一个控制周期一个控制高电平时间,其实是一样的)
表里放的是一个正弦数组(产生正弦波),之后有一个寄存器控制读取表的速度(间隔),把读取出的表值存入上面那个没固定的寄存器就行了

经过实验 主频50M的这种DDS最大产生到20K的正弦波就不稳定了不符合题意
1、用自定义IP向导新建IP模板后,在程序目录的pcores文件夹下回出现IP核文件夹 文件夹中有三个子文件夹:datadevl hdl 首先手动修改data下的.mbp文件,将需要的IO口声明:
......
PARAMETER C_FAMILY = virtex5, DT = STRING
## Ports
PORT DDS_PWM="", DIR= O,(这句是要添加的)
PORT SPLB_Clk = "", DIR = I, SIGIS = CLK, BUS= SPLB
2、在hdl文件件夹下的VHDL文件夹中的dds_ip.vhd中再次声明端口
port
  (
    -- ADD USERPORTS BELOW THIS LINE ------------------
    --USER portsadded here
    DDS_PWM    : out std_logic;
   -- ADD USER PORTS ABOVE THIS LINE ------------------
同时在此文件中添加端口对应关系
port map
    (
     -- MAP USER PORTS BELOW THIS LINE ------------------
     --USER ports mapped here
     DDS_PWM      =>DDS_PWM,
     -- MAP USER PORTS ABOVE THIS LINE ------------------
3、在第二部路径下的user_logic.vhd中编写逻辑代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library proc_common_v2_00_a;
use proc_common_v2_00_a.proc_common_pkg.all;
entity user_logic is
  generic
  (
    C_SLV_DWIDTH                  :integer             := 32;
   C_NUM_REG                     :integer             := 1
  );
port
  (
   DDS_PWM    :out std_logic;
   Bus2IP_Clk                    : in  std_logic;
   Bus2IP_Reset                  : in  std_logic;
   Bus2IP_Data                   : in  std_logic_vector(0 to C_SLV_DWIDTH-1);
   Bus2IP_BE                     : in  std_logic_vector(0 toC_SLV_DWIDTH/8-1);
   Bus2IP_RdCE                   : in  std_logic_vector(0 to C_NUM_REG-1);
   Bus2IP_WrCE                   : in  std_logic_vector(0 to C_NUM_REG-1);
   IP2Bus_Data                   : out std_logic_vector(0 to C_SLV_DWIDTH-1);
   IP2Bus_RdAck                  : out std_logic;
   IP2Bus_WrAck                  : out std_logic;
   IP2Bus_Error                  : out std_logic;
  );
attribute SIGIS : string;
attribute SIGIS ofBus2IP_Clk    :signal is "CLK";
attribute SIGIS of Bus2IP_Reset  : signal is"RST";
end entity user_logic;

architecture IMP of user_logic is
constantpwm_0000      : std_logic_vector(0 to 10):="11111010000";
constantpwm_0001      : std_logic_vector(0 to 10):="11111001111";
constantpwm_0002      : std_logic_vector(0 to 10):="11111001110";

正弦表,省略2000行

constantpwm_1498      : std_logic_vector(0 to 10):="10011100011";
constantpwm_1499      : std_logic_vector(0 to 10):="10011100010";
constantpwm_1500      : std_logic_vector(0 to 10):="10011100010";

signalslv_reg0                      : std_logic_vector(0 to 31);
  signalslv_reg_write_sel             : std_logic_vector(0 to 0);
  signalslv_reg_read_sel              : std_logic_vector(0 to 0);
  signalslv_ip2bus_data               : std_logic_vector(0 to C_SLV_DWIDTH-1);
  signalslv_read_ack                  : std_logic;
  signalslv_write_ack                 : std_logic;
  signal  cycle        : std_logic_vector(0 to31):="00000000000000000000011111010000";
  signal  hightime     : std_logic_vector(0 to31):="00000000000000000000001111101000";
  signal  tcnt         : std_logic_vector(0 to 31);
  signal  pwm          : std_logic;
begin
DDS_PWM<=pwm;
hightime(1 to 31)<=cycle(0 to 30);

process(Bus2IP_Clk,Bus2IP_Reset)
begin
if(Bus2IP_Reset='1')then
tcnt<="00000000000000000000000000000000";
elsif(Bus2IP_Clk'event and Bus2IP_Clk='1')then
if(tcnt=hightime)then
    pwm<='0';
    tcnt<=tcnt+'1';
elsif(tcnt=cycle)then   
    pwm<='1';
    tcnt<="00000000000000000000000000000000";
else   tcnt<=tcnt+'1';
end if;
end if;
end process;

process(Bus2IP_Clk,Bus2IP_Reset)
begin
if(Bus2IP_Reset='1')then
cycle<="00000000000000000000011111010000";
elsif(Bus2IP_Clk'event and Bus2IP_Clk='1')then
case slv_reg0(21 to 31) is
when "00000000000" =>
      cycle(21 to 31)<=pwm_0000(0 to 10);
when "00000000001" =>
      cycle(21 to 31)<=pwm_0001(0 to 10);
when "00000000010" =>
      cycle(21 to 31)<=pwm_0002(0 to 10);
...此出省略4000行 都是和上面一样的格式
when "10111011011" =>
      cycle(21 to 31)<=pwm_1499(0 to 10);
when "10111011100" =>
      cycle(21 to 31)<=pwm_1500(0 to 10);
whenothers=>cycle<="00000000000000000000011111010000";
end case;
end if;
end process;

slv_reg_write_sel <= Bus2IP_WrCE(0 to 0);
  slv_reg_read_sel <= Bus2IP_RdCE(0 to 0);
slv_write_ack    <= Bus2IP_WrCE(0);
slv_read_ack     <= Bus2IP_RdCE(0);

  SLAVE_REG_WRITE_PROC : process( Bus2IP_Clk )is
  begin
    ifBus2IP_Clk'event and Bus2IP_Clk = '1' then
     if Bus2IP_Reset = '1' then
       slv_reg0 <= (others => '0');
     else
       case slv_reg_write_sel is
         when "1" =>
           for byte_index in 0 to (C_SLV_DWIDTH/8)-1 loop
             if ( Bus2IP_BE(byte_index) = '1' ) then
               slv_reg0(byte_index*8 to byte_index*8+7) <=Bus2IP_Data(byte_index*8 to byte_index*8+7);
             end if;
           end loop;
         when others => null;
       end case;
     end if;
    end if;
  end process SLAVE_REG_WRITE_PROC;

  SLAVE_REG_READ_PROC : process(slv_reg_read_sel, slv_reg0 ) is
  begin
    caseslv_reg_read_sel is
     when "1" => slv_ip2bus_data <=slv_reg0;
     when others => slv_ip2bus_data <=(others => '0');
    endcase;
  end process SLAVE_REG_READ_PROC;
  IP2Bus_Data  <= slv_ip2bus_datawhen slv_read_ack = '1' else
                 (others => '0');
  IP2Bus_WrAck <=slv_write_ack;
  IP2Bus_RdAck <=slv_read_ack;
  IP2Bus_Error <= '0';

end IMP;

                         比赛中提到要用数码管显示,一般单片机的做法是用软件去扫描。这样既浪费时间,又浪费FPGA的资源。这里发一个数码管硬件扫描的自定义IP核,只要对四个寄存器写入显示的数,硬件就自动完成扫描了。
首先,在打data\smg_ip_v2_1_0.mbp文件中添加端口声明:
...
...
## Ports
PORT SMGs_data_8Bit="", DIR = O, VEC= [0:7]
PORT SMGs_cs_4Bit="", DIR = O, VEC= [0:3]
PORT SPLB_Clk= "", DIR = I, SIGIS = CLK, BUS = SPLB
...
...
第二步,在hdl\vhdl\smg_ip.vhd中添加端口和端口映射:
...
...
port
  (
    -- ADD USERPORTS BELOW THIS LINE ------------------
    --USER portsadded here
    SMGs_data_8Bit   : out std_logic_vector(0 to 7);
    SMGs_cs_4Bit    : outstd_logic_vector(0 to3);
   -- ADD USER PORTS ABOVE THIS LINE ------------------
...
...
port map
    (
     -- MAP USER PORTS BELOW THIS LINE ------------------
     --USER ports mapped here
    SMGs_cs_4Bit     => SMGs_cs_4Bit,
  SMGs_data_8Bit    =>SMGs_data_8Bit,
     -- MAP USER PORTS ABOVE THIS LINE ------------------
...
...

最后就是user_logic.vhd里的逻辑代码:
很多东西都是自动生成的,需要手动编写的就是前面的自定义端口和逻辑进程
-- DO NOT EDIT BELOW THIS LINE --------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library proc_common_v2_00_a;
use proc_common_v2_00_a.proc_common_pkg.all;
-- DO NOT EDIT ABOVE THIS LINE --------------------
--USER libraries added here
------------------------------------------------------------------------------
-- Entity section
------------------------------------------------------------------------------
-- Definition of Generics:
--  C_SLV_DWIDTH                -- Slave interface data bus width
--  C_NUM_REG                   -- Number of software accessible registers
--
-- Definition of Ports:
--  Bus2IP_Clk                  -- Bus to IP clock
--  Bus2IP_Reset                -- Bus to IP reset
--  Bus2IP_Data                 -- Bus to IP data bus
--  Bus2IP_BE                   -- Bus to IP byte enables
--  Bus2IP_RdCE                 -- Bus to IP read chip enable
--  Bus2IP_WrCE                 -- Bus to IP write chip enable
--  IP2Bus_Data                 -- IP to Bus data bus
--  IP2Bus_RdAck                -- IP to Bus read transfer acknowledgement
--  IP2Bus_WrAck                -- IP to Bus write transfer acknowledgement
--  IP2Bus_Error                -- IP to Bus error response
------------------------------------------------------------------------------
entity user_logic is
  generic
  (
    -- ADD USERGENERICS BELOW THIS LINE ---------------
    --USERgenerics added here
    -- ADD USERGENERICS ABOVE THIS LINE ---------------
    -- DO NOTEDIT BELOW THIS LINE ---------------------
    -- Busprotocol parameters, do not add to or delete
   C_SLV_DWIDTH                  :integer             := 32;
   C_NUM_REG                     :integer             := 1
    -- DO NOTEDIT ABOVE THIS LINE ---------------------
  );
  port
  (
    -- ADD USERPORTS BELOW THIS LINE ------------------
    --USER portsadded here
   SMGs_data_8Bit   : out std_logic_vector(0 to 7);
   SMGs_cs_4Bit   : out std_logic_vector(0 to 3);
    -- ADD USERPORTS ABOVE THIS LINE ------------------
    -- DO NOTEDIT BELOW THIS LINE ---------------------
    -- Busprotocol ports, do not add to or delete
   Bus2IP_Clk                    : in  std_logic;
   Bus2IP_Reset                  : in  std_logic;
   Bus2IP_Data                   : in  std_logic_vector(0 to C_SLV_DWIDTH-1);
   Bus2IP_BE                     : in  std_logic_vector(0 toC_SLV_DWIDTH/8-1);
   Bus2IP_RdCE                   : in  std_logic_vector(0 to C_NUM_REG-1);
   Bus2IP_WrCE                   : in  std_logic_vector(0 to C_NUM_REG-1);
   IP2Bus_Data                   : out std_logic_vector(0 to C_SLV_DWIDTH-1);
   IP2Bus_RdAck                  : out std_logic;
   IP2Bus_WrAck                  : out std_logic;
   IP2Bus_Error                  : out std_logic
    -- DO NOTEDIT ABOVE THIS LINE ---------------------
  );
  attribute SIGIS : string;
  attribute SIGIS ofBus2IP_Clk    :signal is "CLK";
  attribute SIGIS ofBus2IP_Reset  : signal is "RST";
end entity user_logic;
------------------------------------------------------------------------------
-- Architecture section
------------------------------------------------------------------------------
architecture IMP of user_logic is
  --USER signal declarations added here, asneeded for user logic
  signalsmg_data_out_i          : std_logic_vector(0 to 7);
  signalsmg_cs_i                : std_logic_vector(0 to 3);
  signaldiv_cnt                 : std_logic_vector(0 to 18);
  signaldata4                   : std_logic_vector(0 to 3);
------------------------------------------
  -- Signals for user logic slave model s/waccessible register example
  ------------------------------------------
  signalslv_reg0                      : std_logic_vector(0 to C_SLV_DWIDTH-1);
  signalslv_reg_write_sel             : std_logic_vector(0 to 0);
  signalslv_reg_read_sel              : std_logic_vector(0 to 0);
  signalslv_ip2bus_data               : std_logic_vector(0 to C_SLV_DWIDTH-1);
  signalslv_read_ack                  : std_logic;
  signalslv_write_ack                 : std_logic;
begin
  --USER logic implementation added here
------------------------------------------
  -- Example code to read/write user logic slavemodel s/w accessible registers
  --
  -- Note:
  -- The example code presented here is to showyou one way of reading/writing
  -- software accessible registers implemented inthe user logic slave model.
  -- Each bit of the Bus2IP_WrCE/Bus2IP_RdCEsignals is configured to correspond
  -- to one software accessible register by thetop level template. For example,
  -- if you have four 32 bit software accessibleregisters in the user logic,
  -- you are basically operating on the followingmemory mapped registers:
  --
--   Bus2IP_WrCE/Bus2IP_RdCE   MemoryMapped Register
--                    "1000"   C_BASEADDR + 0x0
--                    "0100"   C_BASEADDR + 0x4
--                    "0010"   C_BASEADDR + 0x8
--                    "0001"   C_BASEADDR + 0xC
  --
  ------------------------------------------
  slv_reg_write_sel <=Bus2IP_WrCE(0 to 0);
  slv_reg_read_sel <= Bus2IP_RdCE(0 to 0);
slv_write_ack    <= Bus2IP_WrCE(0);
slv_read_ack     <= Bus2IP_RdCE(0);
SMGs_data_8Bit   <= smg_data_out_i;
SMGs_cs_4Bit   <= smg_cs_i;
--其实这个文件真正需要自己编的就是以下几个进程:
process(Bus2IP_Clk,Bus2IP_Reset) --用计数器产生分频,因为扫描不能太快
begin
   if(Bus2IP_Reset='1')then
  div_cnt<="0000000000000000000";
   elsif(Bus2IP_Clk'event andBus2IP_Clk='1')then
  div_cnt<=div_cnt+1;
   end if;
end process;
process(Bus2IP_Reset,Bus2IP_Clk,div_cnt(0 to1))--产生扫描信号
begin
  if(Bus2IP_Reset='1')then
   smg_cs_i<="0000";
  elsif(Bus2IP_Clk 'event and Bus2IP_Clk='1')then
    casediv_cnt(0 to 1) is
    when"00"=> smg_cs_i(0 to3)<="0001";
    when"10"=> smg_cs_i(0 to3)<="0010";
    when"01"=> smg_cs_i(0 to3)<="0100";
    when"11"=> smg_cs_i(0 to3)<="1000";
    when others => smg_cs_i(0 to3)<="0000";
    endcase;
  end if;
end process;
process(smg_cs_i,slv_reg0)--根据不同的扫描信号,数据线上放不同的值
begin
case smg_cs_i(0 to 3)is
   when "0001"=>data4(0 to 3)<=slv_reg0(0 to 3);--4位正好表示0-f
   when "0010"=>data4(0 to 3)<=slv_reg0(4 to 7);
   when "0100"=>data4(0 to 3)<=slv_reg0(8 to 11);
   when "1000"=>data4(0 to 3)<=slv_reg0(12 to15);
   whenothers   => data4<="0000";
  end case;
end process;
process(data4)--这个进程相当于解码
begin
  case data4(0 to 3) is
   WHEN "0000"=>
                 smg_data_out_i(0 to 7) <="11111100";   
        WHEN "0001" =>
                 smg_data_out_i(0 to 7) <="01100000";   
        WHEN "0010" =>
                 smg_data_out_i(0 to 7) <="11011010";   
        WHEN "0011" =>
                 smg_data_out_i(0 to 7) <="11110010";   
        WHEN "0100" =>
                 smg_data_out_i(0 to 7) <="01100110";   
        WHEN "0101" =>
                 smg_data_out_i(0 to 7) <="10110110";   
        WHEN "0110" =>
                 smg_data_out_i(0 to 7) <="10111110";   
        WHEN "0111" =>
                 smg_data_out_i(0 to 7) <="11100000";   
        WHEN "1000" =>
                 smg_data_out_i(0 to 7) <="11111110";   
        WHEN "1001" =>
                smg_data_out_i(0 to 7) <= "11110110";   
        WHEN "1010" =>
                 smg_data_out_i(0 to 7) <="11111010";   
        WHEN "1011" =>
                 smg_data_out_i(0 to 7) <="00111110";   
        WHEN "1100" =>
                 smg_data_out_i(0 to 7) <="10011100";   
        WHEN "1101" =>
                 smg_data_out_i(0 to 7) <="01111010";   
        WHEN "1110" =>
                 smg_data_out_i(0 to 7) <="10011110";   
        WHEN "1111" =>
                 smg_data_out_i(0 to 7) <="10001110";   
        WHEN OTHERS =>
                 smg_data_out_i(0 to 7) <= "00000000";
        
     END CASE;
   END PROCESS;
--以下是程序自动生成的,分别是与SOC接口寄存器的读和写。如果你要对reg读取的话,要手动将下面的读取进程删除,因为VHDL语言中同一个寄存器不能在两个进程里读取。
  -- implement slave model softwareaccessible register(s)
  SLAVE_REG_WRITE_PROC : process( Bus2IP_Clk )is
  begin
    ifBus2IP_Clk'event and Bus2IP_Clk = '1' then
     if Bus2IP_Reset = '1' then
       slv_reg0 <= (others => '0');
     else
       case slv_reg_write_sel is
         when "1" =>
           for byte_index in 0 to (C_SLV_DWIDTH/8)-1 loop
             if ( Bus2IP_BE(byte_index) = '1' ) then
               slv_reg0(byte_index*8 to byte_index*8+7) <=Bus2IP_Data(byte_index*8 to byte_index*8+7);
             end if;
           end loop;
         when others => null;
       end case;
     end if;
    end if;
  end process SLAVE_REG_WRITE_PROC;
  -- implement slave model software accessibleregister(s) read mux
  SLAVE_REG_READ_PROC : process( slv_reg_read_sel,slv_reg0 ) is
  begin
    caseslv_reg_read_sel is
     when "1" => slv_ip2bus_data <=slv_reg0;
     when others => slv_ip2bus_data <=(others => '0');
    endcase;
  end process SLAVE_REG_READ_PROC;
------------------------------------------
  -- Example code to drive IP to Bus signals
  ------------------------------------------
  IP2Bus_Data  <=slv_ip2bus_data when slv_read_ack = '1' else
                 (others => '0');
  IP2Bus_WrAck <=slv_write_ack;
  IP2Bus_RdAck <=slv_read_ack;
  IP2Bus_Error <= '0';
end IMP;


发一下作品图片吧:
这个是没有开始显示时的示波器图片:用放大器和减法器调的示波器原点位置,示波器用的XY模式


这张是显示的伏频(上)相频(下)曲线,伏频还行吧相拼差了点...其实走了一个口字型扫描,之后把两边的竖线移到屏幕两边就行了,当时评委看到非常奇怪的去调那个秒格旋钮,可是曲线不动,就问我怎么做的,而且很不理解怎么出来的两条曲线,呵呵
这是显示部分,不过评委说不合格,因为题目说要用数码管显示...无语

相位的正负判断不出来..献丑了

这个板子的IO口实在是头痛,不得已自己做的转接板...

数码管也显示了 呵呵 显示的电压值

长春工业大学的体育馆外面,组织的挺正式

长春工业体育馆二楼,体育馆确实挺好,没话说

这是比赛前做的北京赛区题目,兵乓球游戏机,练习用的





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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