- 一、写在前面
- 二、平台介绍
- 二、整体思路简要
- 三、发送端
- 四、接收端
- 五、细节和注意事项
- 六、作品图片
2021年的国赛从8月推迟到10月,到11月,这对于考研人来说是非常大的压力,几经考虑过放弃,但是我真的非常热爱这个比赛,我时常陷落于PCB那精致小巧的美,倾心于信号波形那优雅曲线的曼妙,着迷于逻辑世界的可思议迷宫,沉醉于最后做出作品的那份成就与喜悦。我投入了那么长时间,从单片机,到模拟电路,最后再到FPGA,我实在是不想放弃,而且我的队友都还没有放弃,我们都坚持到了最后,拿了国奖。
二、平台介绍- 我用的是ZYNQ7020,使用了其中的FPGA部分和处理器部分,协同处理。缺点就是功耗太高,功耗那一项很难得分。
可以选用一些低功耗的器件,主体思路不变。 - 采集模块使用的是AD9238,DAC模块是AD9767。
键入的数字用单一点频的组合表示,每个数字对应不同的频率组合,建立起一个数字-频率组合表,然后由DAC将这些组合信号输出,由合路电路(加法器)将数字对应的频率组合信号和模拟信号加在一起,经放大器,功率放大器,天线输出。接收端经带通滤波器,放大器,解调器解调后,用ADC采集解调后的信号。
采集后的数据分两条支路进行处理,其中一条支路是对信号进行FFT运算,得到发送端的信号幅度谱,然后把它和预设的数字-频率组合表进行对照,得出对应的发送数字,然后显示。
另一支路,对信号做数字滤波处理,将除了函数发生器给的模拟信号以外的信号滤掉,然后经过DAC,再经过模拟滤波器。最终将模拟信号还原出去。
-
使用的是AM调制,占用的信道带宽是基带信号的2倍,而信号频率范围是50Hz~10kHz,要求信号带宽为25kHz以内,则我们能够使用的频率范围是0-50Hz,和10k-12.5kHz。低频范围周期较长,难以满足题目要求的2s内完成显示,故选择高频范围。
-
接下来重点要做的是理清发送的具体时序。题目要求发四个数字,我们这里依次进行发送,发送第一个数字用时250ms,经过150ms的空白间隔后,再发送第二个,然后再间隔150ms,以此类推,不断循环发送这四个数字。 示意图如下:
-
编码,在10k-12.5kHz的范围内选择四个点频用来编码十进制数字,设计的原则是:
①每个数字用尽可能少的频率表示。
②选择的频率要方便接受端还原模拟信号时滤除。
③频率之间的间隔要足够接收端进行FFT运算后分辨出来。
综上考虑,我选择了f1=10.9k,f2=11.0k,f3=11.1k,f4=11.2k 这四个频率。(也可以用更高一点的频率和更大的频率间隔,会更好实现,我当初选了较低的频率是为了怕后续调制系统的不理想导致额外的带宽)编码方式如下图:
f1 | f2 | f3 | f4 | N |
---|---|---|---|---|
0 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 2 |
0 | 1 | 0 | 0 | 3 |
0 | 1 | 0 | 1 | 4 |
0 | 1 | 1 | 0 | 5 |
1 | 1 | 0 | 0 | 6 |
1 | 0 | 0 | 0 | 7 |
1 | 0 | 0 | 1 | 8 |
1 | 0 | 1 | 0 | 9 |
0代表没有,1代表有,N(Number)表示数字
- 关于如何产生对应的频率信号。有几种解决方式:
①单纯用单片机和DAC:需要提前将sin波形数值相加放入内存中,然后精细的计算出每种组合信号的周期,按照周期将组合后数据输出到DAC中,方能保证信号的连续,不然在数据轮换点处容易导致波形失真,会引入高的频率成分,对系统产生影响。当然,可以在DAC输出后加一个模拟滤波器以平滑信号。
②用单片机加DDS模块,首先你要有足够的DDS能输出四路信号,然后经过加法器相加即可。
③用FPGA内部的DDS,用四个DDS产生四个频率,然后相加,再经DAC输出即可。
注意:上述三种方法,都建议在DAC输出端加上一个通带为12.5kHz低通滤波器,以限制数字信号输出的带宽。这里有两方面原因:第一就是DAC输出的阶梯要滤除。第二是,在上面第2点所述,在进行数字的开断循环发送的时候,其本质是和原来的信号和一个脉宽为250ms,周期为400ms的脉冲信号相乘,是会扩宽频谱的。 - 载频的话,首先是越高越好,利与天线传输。其次载频间隔不宜过大,这样接收端的带通滤波器对每种载频的衰减倍数几乎一致,就不用再做幅度修补。这里我选择29.4M,29.5M,29.6M三个载频。载频的产生可用单片机控制锁相环或者控制DDS模块(例如AD9958,AD9910)产生。
- AM调制的乘法器使用的是AD835。
- 发送端简易的控制代码如下:
接收端带通滤波器使用LC无源滤波器,使用包络检波方法进行解调。解调后的信号放大到适合ADC采集的幅度范围内。ADC采集使用的采样率要大于最高频率的两倍,这里建议不要用过低的采样率,因为除了要进行FFT计算之外,还要进行数字滤波+还原信号,速率太低的话,经过DAC输出后,模拟滤波器难以恢复原来的时域信号。这里我采用102.5k的采样率。
采集后的数据分两个支路:
- 一条数据支路:将102.5k采样得来的信号再4抽点,得到采样率为25.625k的信号数据,对其进行1024点FFT,则频率分辨率约为25Hz。取合适的判决门限,判断f1,f2,f3,f4是否存在,然后根据发送的编码方式解码即可得出数字信号,再显示即可,若持续若干秒没有收到这四个频率,则熄灭显示。
- 另一条数据支路:使用一个400阶数(视FPGA的乘法器数目而定,阶数越高越好)的FIR滤波器,截止频率约为10.1k(10k有衰减,测试的是单个点频波形不失真即可,没有要求很好的幅频特性曲线),配合DAC输出端的模拟滤波器,可以很好的滤除掉用来表示数字信息的那些频率成分。
- 发送端使用DAC发送的信号的最大幅度要保持一致,当两个频点信号合成发出的时候,其单个频点的幅度要为单独只发送一个频点的信号幅度的1/2。这样是为了防止 不同数字对应的信号幅度不一,而加大后续放大器和AM调制系统的实现难度。
- 由于发送和接收端没有进行同步的处理,所以发送端和接收端一定要按照事先安排好的发送顺序进行工作。也就是接收端一定要先启动并进入工作状态后,才能开启发送端发送包含数字信息的信号。
- 有疑问的可以留言,看到了都会尽量给予解答。
- 发送端和接收端的主要代码链接:点击这里转到下载页面
- zynq7020完整工程代码链接:点击这里转到下载页面
- 代码积分已经设置的最低了,没有积分的可以留言,看到了都会发过去。
- 据说如果看完点赞的话,电赛拿国一的几率会大大提高。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)