本刊前两期给出了数字示波器DIY制作方案,第一篇集中介绍了LCD绘图显示,第二篇介绍了模拟信号调理,完成这些内容学习之后,读者可能会发现一个致命的问题,那就是高速数据采集,前面给出的方案是基于MCU控制的ADC,这种方案致命的缺陷是数据采集的速度慢,对频率稍高的信号无法有效采样,本篇将介绍一种MCU加CPLD控制的DMA高速数据采样方案。
一、传统低速数据采集
传统MCU控制的ADC数据采集原理框图如图1所示,MCU运行驱动程序控制ADC循环转换,每次转换通常由启动、查询等待、读取数据、写入RAM几个过程,每一个过程都需要CPU执行若干指令来实现,这样的数据采集不仅受ADC速度,尤其是受到MCU运行速度影响,通常只能做低速数据采集。
二、DMA数据采集
DMA也就是DirectMemoryAccess简称,是直接内存存取的意思,DMA的主要优势是可在无CPU干涉的情况下进行数据的交换,可以将ADC的速度发挥到极致。基于MCU加CPLD控制的DMA原理框图如图2所示。MCU通过对CPLD的控制,实现让出数据总线,由CPLD时序逻辑电路控制AD循环转换并将结果直接存储到RAM中,这个循环过程是纯硬件电路实现的,因此速度快,不受MCU速度影响。MCU查询到一帧数据采集完成后,再夺回数据总线,从RAM中读取数据,处理数据并显示波形。
下面我们结合具体的器件来介绍这种DMA方案,ADC器件选择TLC5510,RAM选择UT62256,32KSRAM。
TLC5510是美国德州仪器公司生产的8位半闪速结构模数转换器,它采用CMOS工艺制造,可提供最小20Msps的采样率。
TLC5510的工作时序图如图3所示,时钟信号CLK在每一个下降沿采集模拟输入信号。第N次采集的数据经过2.5个时钟周期的延迟之后,在时钟上升沿将转换得到的结果送到内部数据总线上,在时钟其他时间段数据保持不变。可以看到,该器件可以在20MHz时钟信号驱动下以20MHz的采样率采集数据,平均获得一个数据只要0.05μs。
RAM数据写入时序图如图4所示。RAM的写入条件是具备确定的地址ADDR,CE=0,WE=0,OE=1;数据线上的数据将被写入RAM内部相应的单元。
综合TLC5510的工作时序和RAM的写入时序,提出如图5所示的驱动过程。基于同一个时钟信号驱动,在时钟下降沿①、低电平②、上升沿③、高电平④4个节拍中,同步实现AD转换和数据写入RAM。
数据写入RAM后,还要能够被MCU从RAM中获取,RAM数据读出时序如图6所示。
从图中看出,当CE=0;OE=0时,RAM将地址选择的内部单元数据输出到数据总线从而可以被MCU读取。
这里有一个问题要考虑清楚,为了实现ADC结果直接存入RAM,已经将5510的数据线和RAM的数据线直接相连了,现在还要将MCU的数据线和RAM的数据线相连,会不会出现数据冲突?其实只要器件数据线具有三态功能,就能够实现数据线分时复用,通过控制电路实现数据总线上某阶段只能有一个数据输出源,例如当ADC直接给RAM存入数据时,MCU要让出数据总线,当MCU读取RAM数据时,ADC要高阻态隔离数据总线。
三、控制电路设计
控制电路原理如图7所示,在MCU的控制下,RAM和ADC的控制信号通过多路选择器选择与MCU总线模式或DMA模式相连,这两种模式被MCU完全控制,可以自由切换,当选择DMA模式时,MCU首先要让出数据总线,确保ADC与RAM占用数据总线,此时,RAM的地址由地址计数器产生,RAM_CE=0(片选有效);RAM_OE=1(禁止读);ADC_OE=0(内部数据总线上的数据直接输出到外部数据总线上);RAM_WE与ADC_CLK、地址计数器共用同一时钟信号,按图5中4节拍实现AD转换后数据直接存储到RAM中,DMA过程在MCU清零地址计数器后开始,没一个时钟周期AD输出一个数据直接存入RAM,同时地址计数器加1,当地址计数器溢出后被MCU检测到则表示一帧数据采集完成。
一帧数据采集完成后,MCU切换到MCU总线模式读取RAM的结果,这时RAM_CE=0(或接MCU地址引脚);RAM_OE=RD(MCU读控制信号);ADC_OE=1(禁止ADC数据占用数据线);RAM_WE=WR,ADC_CLK=0,这时MCU可以自由读取RAM。
图7所示逻辑电路用硬件描述语言在CPLD上实现非常方便,请读者吸收DMA设计思路后自己完成电路设计。
四、结束语
笔者完成的DMA高速数据采集卡对2MHz、1MHz的正弦信号采样并绘图效果如图8(a)、(b)所示。对于低于1MHz的正弦信号采集后能够非常光滑清晰的还原出正弦波形。在CPLD内部时钟精确分频后还可以实现多频点采样,例如20MHz采样,10MHz采样,1MHz采样。
作者:田开坤 李任青 来源:《电子制作》