微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > PyQt5信号检测系统(结项)

PyQt5信号检测系统(结项)

时间:10-02 整理:3721RD 点击:

工程代码地址:https://github.com/agdhun/PyQtDetect

考虑到Firefly3399板载的PCIE是MiniPCIE和PCIE M2(NGFF) B key版,而DSP上带有的PCIE接口是标准的X4接口,考虑到Firefly带有网口和WIFI,故确定最终实现为网口传输方式,使用TCP/IP协议。
本次试用我实现的整体结构如下:


首先从ADC控制着一部分说起,FPGA控制选择ADC通道,ADC内部叫做地址;FPGA也同时可以读取ADC的数据,考虑到ADC地址与数据映射关系,实现的地方我采用,先送地址再送数据,FPGA每隔100us便读取一次样本,这是考虑到ADC和SPI接口速度的缘故,我采用的ADC为TLC1543,它最大支持的SPI速度为25MHz,而每一次SPI采样过程时间至少达到1.425us,采样率为38K,选取100us,给ADC提供了充足的转化时间。
其次,每个样本都及时存入BlockRAM,利用BlockRAM的高地址位来提醒A9及时取走数据,A9取走数据后,将数据打包,通过LWIP这个轻量级TCP/IP库发送到Firefly RK3399网络链路上,Firefly RK3399读取链路上数据,通过Python处理,利用PyQt图形库显示。这是显示的完整流程,接下来我将介绍控制。
PyQt显示提供了通道选择按钮和FFT勾选框,其中0-10是采样通道,11-13是3个TLC1543内部的测试通道,14则是Python提供测试通道,如下图所示。


首先GUI界面一旦有选择按钮勾选,则Python会将按“通道号:FFT state”这种格式发送到网络链路中,A9接收后,实时反馈到FPGA部分,FPGA会实时处理ADC。
下图是RK3399上PyQt显示的内部通道波形


下图是RK3399上PyQt显示的内部通道波形的FFT


由于手里没有信号源等啥设备,只好用直流电压进行测试,channel0,如下所示


接下来重点阐述PyQt5部分设计,PyQt5部分涉及到网口通信部分我是使用Python提供的Socket库,使用比较简单,socket连接代码如下:

  1. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  2. s.connect((host, port))

复制代码

由于接收数据需要死循环来保证数据的持续接收,因此需要开线程,使得在接收数据的同时程序还可以处理其他事,例如GUI界面点击等操作,开线程可以使用如下代码完成:recvThread = threading.Thread(target =self.recvFromServer)//self.recvFromServer即表示需要在另一个线程处理的函数

  1. recvThread.setDaemon(True)
  2. recvThread.start()

复制代码

网络和线程代码处理完毕后,就可以摆放控件了,以及使用painter进行波形绘制。接收到网口数据后我们需要先校验数据长度对不对,不对则丢弃,对则需要将数据解包处理,转换为list类型的数据,传送给painter执行绘图操作。转换的代码如下所示:

  1. data = s.recv(10240)
  2. if not data:
  3. exit()
  4. str_data = data.decode()
  5. list_str_data=str_data.split(',')
  6. list_data=list(map(int,list_str_data))
  7. self.paint.setPoints(list_data)

复制代码

以下是视频演示:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top