草庐IT

2021年电赛E题解析数字模拟信号混合传输收发机(详细介绍)

PuzzledForest 2023-04-22 原文

目录

一、写在前面

2021年的国赛从8月推迟到10月,到11月,这对于考研人来说是非常大的压力,几经考虑过放弃,但是我真的非常热爱这个比赛,我时常陷落于PCB那精致小巧的美,倾心于信号波形那优雅曲线的曼妙,着迷于逻辑世界的可思议迷宫,沉醉于最后做出作品的那份成就与喜悦。我投入了那么长时间,从单片机,到模拟电路,最后再到FPGA,我实在是不想放弃,而且我的队友都还没有放弃,我们都坚持到了最后,拿了国奖。

二、平台介绍

  1. 我用的是ZYNQ7020,使用了其中的FPGA部分和处理器部分,协同处理。缺点就是功耗太高,功耗那一项很难得分。
    可以选用一些低功耗的器件,主体思路不变。
  2. 采集模块使用的是AD9238,DAC模块是AD9767。

二、整体思路简要

键入的数字用单一点频的组合表示,每个数字对应不同的频率组合,建立起一个数字-频率组合表,然后由DAC将这些组合信号输出,由合路电路(加法器)将数字对应的频率组合信号和模拟信号加在一起,经放大器,功率放大器,天线输出。接收端经带通滤波器,放大器,解调器解调后,用ADC采集解调后的信号。
采集后的数据分两条支路进行处理,其中一条支路是对信号进行FFT运算,得到发送端的信号幅度谱,然后把它和预设的数字-频率组合表进行对照,得出对应的发送数字,然后显示。
另一支路,对信号做数字滤波处理,将除了函数发生器给的模拟信号以外的信号滤掉,然后经过DAC,再经过模拟滤波器。最终将模拟信号还原出去。

三、发送端

  1. 使用的是AM调制,占用的信道带宽是基带信号的2倍,而信号频率范围是50Hz~10kHz,要求信号带宽为25kHz以内,则我们能够使用的频率范围是0-50Hz,和10k-12.5kHz。低频范围周期较长,难以满足题目要求的2s内完成显示,故选择高频范围。

  2. 接下来重点要做的是理清发送的具体时序。题目要求发四个数字,我们这里依次进行发送,发送第一个数字用时250ms,经过150ms的空白间隔后,再发送第二个,然后再间隔150ms,以此类推,不断循环发送这四个数字。 示意图如下:

  3. 编码,在10k-12.5kHz的范围内选择四个点频用来编码十进制数字,设计的原则是:
    ①每个数字用尽可能少的频率表示。
    ②选择的频率要方便接受端还原模拟信号时滤除。
    ③频率之间的间隔要足够接收端进行FFT运算后分辨出来。
    综上考虑,我选择了f1=10.9k,f2=11.0k,f3=11.1k,f4=11.2k 这四个频率。(也可以用更高一点的频率和更大的频率间隔,会更好实现,我当初选了较低的频率是为了怕后续调制系统的不理想导致额外的带宽)编码方式如下图:
    0代表没有,1代表有,N(Number)表示数字

f1f2f3f4N
00010
00101
00112
01003
01014
01105
11006
10007
10018
10109
  1. 关于如何产生对应的频率信号。有几种解决方式:
    单纯用单片机和DAC:需要提前将sin波形数值相加放入内存中,然后精细的计算出每种组合信号的周期,按照周期将组合后数据输出到DAC中,方能保证信号的连续,不然在数据轮换点处容易导致波形失真,会引入高的频率成分,对系统产生影响。当然,可以在DAC输出后加一个模拟滤波器以平滑信号。
    用单片机加DDS模块,首先你要有足够的DDS能输出四路信号,然后经过加法器相加即可。
    用FPGA内部的DDS,用四个DDS产生四个频率,然后相加,再经DAC输出即可。
    注意:上述三种方法,都建议在DAC输出端加上一个通带为12.5kHz低通滤波器,以限制数字信号输出的带宽。这里有两方面原因:第一就是DAC输出的阶梯要滤除。第二是,在上面第2点所述,在进行数字的开断循环发送的时候,其本质是和原来的信号和一个脉宽为250ms,周期为400ms的脉冲信号相乘,是会扩宽频谱的。
  2. 载频的话,首先是越高越好,利与天线传输。其次载频间隔不宜过大,这样接收端的带通滤波器对每种载频的衰减倍数几乎一致,就不用再做幅度修补。这里我选择29.4M,29.5M,29.6M三个载频。载频的产生可用单片机控制锁相环或者控制DDS模块(例如AD9958,AD9910)产生。
  3. AM调制的乘法器使用的是AD835。
  4. 发送端简易的控制代码链接在文章末。

四、接收端

接收端带通滤波器使用LC无源滤波器,使用包络检波方法进行解调。解调后的信号放大到适合ADC采集的幅度范围内。ADC采集使用的采样率要大于最高频率的两倍,这里建议不要用过低的采样率,因为除了要进行FFT计算之外,还要进行数字滤波+还原信号,速率太低的话,经过DAC输出后,模拟滤波器难以恢复原来的时域信号。这里我采用102.5k的采样率。
采集后的数据分两个支路:

  1. 一条数据支路:将102.5k采样得来的信号再4抽点,得到采样率为25.625k的信号数据,对其进行1024点FFT,则频率分辨率约为25Hz。取合适的判决门限,判断f1,f2,f3,f4是否存在,然后根据发送的编码方式解码即可得出数字信号,再显示即可,若持续若干秒没有收到这四个频率,则熄灭显示。
  2. 另一条数据支路:使用一个400阶数(视FPGA的乘法器数目而定,阶数越高越好)的FIR滤波器,截止频率约为10.1k(10k有衰减,测试的是单个点频波形不失真即可,没有要求很好的幅频特性曲线),配合DAC输出端的模拟滤波器,可以很好的滤除掉用来表示数字信息的那些频率成分。
  3. 接收端简易的控制代码链接在文章末。

五、注意事项、工程代码、原理图下载链接

  1. 发送端使用DAC发送的信号的最大幅度要保持一致,当两个频点信号合成发出的时候,其单个频点的幅度要为单独只发送一个频点的信号幅度的1/2。这样是为了防止 不同数字对应的信号幅度不一,而加大后续放大器和AM调制系统的实现难度。
  2. 由于发送和接收端没有进行同步的处理,所以发送端和接收端一定要按照事先安排好的发送顺序进行工作。也就是接收端一定要先启动并进入工作状态后,才能开启发送端发送包含数字信息的信号。
  3. 有疑问的可以留言,看到了都会尽量给予解答。
  4. 发送端和接收端的主要代码链接:点击这里转到下载页面
  5. zynq7020完整工程代码链接:点击这里转到下载页面
  6. 2021国赛E题全部电路原理图,全部发送和接收端原理图。点击这里转到下载页面
    ( 原理图文件名都已修改,都匹配对应文章中框图里面的名字,除文章中系统框图介绍的模块外,还包含自动增益电路原理图,而且其中LC滤波,高频放大器,功率放大器,匹配电路除pdf外还包含altium designer 原理图工程文件,可直接用来绘制PCB。)
  7. 听说看完点赞的小伙伴比赛拿奖的概率会更大哦~

六、作品图片


有关2021年电赛E题解析数字模拟信号混合传输收发机(详细介绍)的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  3. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  4. ruby - 使用 Ruby 将 HTTP GET 的响应主体流式传输到 HTTP POST - 2

    我正在尝试下载一个大文件,然后使用Ruby将该文件发布到REST端点。该文件可能非常大,即超过可以存储在内存中甚至磁盘上的临时文件中的容量。我一直在用Net::HTTP尝试这个,但我愿意接受任何其他库(rest-client等)的解决方案,只要他们做我想做的事情。这是我尝试过的:require'net/http'source_uri=URI("https://example.org/very_large_file")source_request=Net::HTTP::Get.new(source_uri)source_http=Net::HTTP.start(source_uri.ho

  5. ruby - 在 Ruby 中使用 GTK3 自定义信号 - 2

    我想从gtk3中的Widget发出自定义信号。在GTK2中,有一个名为signal_new的函数来创建一个新信号。您可以在此处查看示例:https://github.com/ruby-gnome2/ruby-gnome2/blob/ec373f87e672dbeeaa157f9148d18b34713bb90e/glib2/sample/type-register.rb在GTK3中,这个功能似乎不再可用。那么在ruby​​的GTK3中创建自定义信号的新方法是什么? 最佳答案 GTK3更改为使用define_signal方法而不是si

  6. ruby - QtRuby 使用参数/参数连接信号和槽 - 2

    我想知道如何连接到带参数的信号(使用Rubyblock)。我知道如何连接到一个不带参数的:myCheckbox.connect(SIGNAL:clicked){doStuff}但是,这不起作用:myCheckbox.connect(SIGNAL:toggle){doStuff}它不起作用,因为切换槽采用参数voidQAbstractButton::toggled(boolchecked)。我怎样才能让它与参数一起工作?谢谢。 最佳答案 对您的问题的简短回答是,您必须使用slots方法声明要连接的插槽的方法签名:classMainGU

  7. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  8. ruby - 发送信号时运行代码,但不要在 Ruby 中捕获信号 - 2

    我有在服务器上运行的代码,在服务器硬关闭之前,发送了一个信号SIGTERM让我的代码知道它需要清理。我想在发生这种情况时运行代码并将信号发送回同一个程序,以便任何其他需要清理的代码都可以这样做。我不想捕获信号或改变信号行为,我只需要在我的程序的其余部分解释SIGTERM之前运行一些东西。目前我可以做类似的事情Signal.trap('TERM')doputs"Gracefulshutdown"exitend但如果同一个应用中的多段代码试图做同样的事情,它就不起作用了。例如:Signal.trap('TERM')doputs"Gracefulshutdown"exitendSignal.

  9. ruby - Capistrano 3.0 文件传输? - 2

    似乎Capistrano曾经有anextensivefiletransferpackage.但是在3.0版本重写后好像没有了。知道是否还有其他方法可以将文件传输到服务器/从服务器传输文件吗? 最佳答案 下载:desc"downloadfoobar.txtintolocal_dir/"task:foobardodownload!"some_remote_path/foobar.txt","local_dir/"end我知道这从Cap3.2.1开始有效,因为我现在正在使用它。 关于ruby-

  10. ruby-on-rails - 如何将数据从我的生产数据库传输到 heroku 中的登台数据库? - 2

    我正在尝试将数据从我的生产数据库传输到我的登台数据库,但没有成功。我正在关注heroku的相关文档:http://devcenter.heroku.com/articles/pgbackups#transfers这些是我运行的命令...$herokuaddons:addpgbackups--remotestaging$herokuaddons:addpgbackups--remoteproduction$herokupgbackups:capture--remoteproduction$herokupgbackups:restoreDATABASE`herokupgbackups:ur

随机推荐