|
【转载】Firefly-RK3399 PyQt5信号检测系统
发表于 2017-11-3 16:50:58
浏览:10237
|
回复:0
打印
只看该作者
[复制链接]
楼主
本帖最后由 hgl 于 2017-11-3 16:50 编辑
工程代码地址:https://github.com/agdhun/PyQtDetect
考虑到Firefly-RK3399板载的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连接代码如下:
- <li>s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)</li><li>s.connect((host, port))</li>
复制代码
由于接收数据需要死循环来保证数据的持续接收,因此需要开线程,使得在接收数据的同时程序还可以处理其他事,例如GUI界面点击等操作,开线程可以使用如下代码完成:recvThread = threading.Thread(target =self.recvFromServer)//self.recvFromServer即表示需要在另一个线程处理的函数
- <li>recvThread.setDaemon(True)</li><li>recvThread.start()</li>
复制代码
网络和线程代码处理完毕后,就可以摆放控件了,以及使用painter进行波形绘制。接收到网口数据后我们需要先校验数据长度对不对,不对则丢弃,对则需要将数据解包处理,转换为list类型的数据,传送给painter执行绘图操作。转换的代码如下所示:
- <ul type="1" class="litype_1"><li>data = s.recv(10240)</li><li>if not data:</li><li>exit()</li><li>str_data = data.decode()</li><li>list_str_data=str_data.split(',')</li><li>list_data=list(map(int,list_str_data))</li><li>self.paint.setPoints(list_data)
- </li></ul><font face="Monaco, Consolas, Lucida Console, Courier New, serif"></font>
复制代码
以下是视频演示:
|
|