八通道探伤数据实时传输模块驱动设计
探伤系统中需要进行驱动设计的模块主要分为两大类。第一类是与超声波探伤功能相关的信号处理部分,主要通过 FPGA 实现,包括实时波形传输模块、硬件实时报警和报警波形存储模块以及参数配置模块等,这些模块涉及到的主要是 FPGA 中的高速信号处理以及数据流向 ARM传输的功能,与系统性能关系密切,需要对其中的控制算法进行重点优化设计。第二类是 ARM系统的外设驱动部分,主要有 RTC 实时时钟模块、DAC 增益控制模块、ADC 电池电量监控模块、LCD 驱动、LCD 背光亮度控制模块以及矩阵键盘驱动。这些外设与探伤功能没有直接关系,却是组成 ARM 嵌入式系统不可缺少的部分。
八通道探伤数据实时传输模块驱动设计
探伤系统的前端模拟部分采用八通道高速 ADC 进行采样,采样速率为 40M,10bit。在 FPGA中,对八通道的高速数据需要进行非均匀压缩处理,将高速数据流压缩为 ARM 处理器可处理的低速数据流。在 FPGA 中设置了八个 FIFO,分别存储八路通道压缩后的波形数据。ARM 系统需要从 FIFO 中读入波形数据并进行实时的波形显示,这对系统的实时性要求非常高。为了保证 FPGA 能够向 ARM 子系统及时高效地传输探伤数据,探伤系统采用了中断方式进行控制。由于软件同时只显示一个通道的波形,因此 FPGA 中通过八选一数据选择器对八通道进行选择,每次只发送需要进行显示的通道的中断。中断的选择通过该设备驱动程序中的 ioctl()实现,在ioctl()函数中,修改内核空间的通道号变量,并且向 FPGA 中的通道选择寄存器写入相应的通道号控制字就可以实现显示通道的切换。
以重复频率 50Hz 为例,FPGA 对波形数据进行非均匀压缩后,每隔 20ms 发送一个中断信号给 ARM,ARM 模块接收到中断后,由 Linux 操作系统负责处理中断,调用该设备驱动程序中的中断服务子程序。在中断处理程序中,首先通过通道号变量确定需要进行传输的通道,并确定需要读入 FIFO 数据的端口地址。然后通过 insw()调用,从 FPGA 中的 FIFO 中读取探伤波形数据到操作系统的内核空间。接下来需要与应用程序通信,通知波形数据已经到达。驱动程序与进程的通信属于进程间通信,Linux 中进程间通信方式包括管道(Pipe)、FIFO、信号(Signal)、共享内存(Shared Memory)以及套接字(Socket)等。其中信号既可以用于两个进程之间进行通信,也可以用于内核与进程之间的通信,但内核只能向进程发送信号而不能接收信号。
驱动程序采用了异步通信的机制来实现与应用程序的通信。当驱动程序从 FIFO 中读取完毕波形数据后,向应用程序发送信号 SIGIO。应用程序接收到 SIGIO 信号后,再调用驱动中的 read()方法,从内核空间读取波形数据进行实时显示。这种方法在一定程度上实现了软件意义上的中断机制。与反复轮询方法相比,减少了系统的开销,提高了系统的运行效率。