LabVIEW小组
直播中

刘娟

8年用户 671经验值
私信 关注
[Labview经验]

基于LabVIEW的连续高速的数字信号输出设计

引 言

在TPH性能测试的工程当中,需要四种类型的测试:
(1)标准样张打印,即验证TPH的基本打印性能
(2)打印浓度测试,即浓度值、均匀性是否到达要求及
(3)耐脉冲测试(SST:Step Stress Test)
(4)走行测试,即连续实机打印以测定TPH寿命。
这四种测试都需要用到可以任意设定参数的打印系统。针对这样的需求我们设计了一套可以针对不同电气参数要求的多功能打印系统。又因为TPH的驱动信号主要是由数字信号驱动,所以为适应高速的打印要求就需要实现连续高速的数字信号输出。

1 TPH原理介绍

在进行系统介绍前先做一下TPH原理的介绍
(1) TPH工作信号主要为:
如表1所示

2) TPH工作原理

       首先由CLOCK控制Shift Register进行DATA的串行传输,然后由LATCH将Shift Register中的已传输进的数据锁存到输出段,最后当STROBE信号打开时,DATA为1的点就通电并加热印字。

2 系统硬件结构

        由计算机、DO板卡、外围驱动电路、其他保护电路、TPH等5部分构成[1],参考图2。


        驱动TPH的时序信号直接由板卡输出,经过驱动电路及保护电路处理之后,送至TPH。

3 系统软件介绍[2]

        计算机将位图按Bitmap的格式从硬盘读取[4],并按单点分解成为1和0的形式,形成二维数组,作为DATA信号,再通过labview软件根据

(1)CLK的频率
(2)DATA、LATCH、STROBE同CLK的逻辑时序关系
(3)LATCH、STROBE的正、负逻辑
(4)打印的速度、打印的宽度
(5)STROBE的宽度(即打印能量)等条件

        将CLK、DATA、LATCH、STROBE四种信号合成,有时根据不同的产品STROBE可能会有一个至十几个,这样的话按照以上信号的状态合成的数据将是16或32bits。
被合成的数据由Labview软件通过DMA的方式送给板卡的缓存[3],再由板卡按照设定的频率进行连续输出。

4 问题提出

4.1 数据量较大[4]

       按照200dpi,打印宽度为216mm的打印头来计算共有1728个发热点,若纵向打印长度为10000行的话将至少会产生:

       All Dots=Column (10000 Lines)×Row(1728 dots)=17,280,000 Dots的象素数,则17,280,000 Dots×4(32 Bits=4 Bytes)/dot×2(对应每个CLK脉冲会送出2次数据)=138,240,000 Bytes即130M Bytes左右的数据量,数据量很大。

        130M如此庞大的数据量,要想保证数据高速连续的输出,最好要购买一块内存大于130M的板卡,这样可能会花几万元,费用较高。这样就要用计算机的内存代替板卡内存。那么现在主要的问题即是如何从内存把数据高速、连续送到板卡。

4.2 高速打印

        要实现连续的高速的打印,例10M的打印速度,按照最低要求的2分频的话,也要使用20M 的时钟频率进行数据输出,按照32 bits即4 Bytes的输出的话,数据的输出速度为20M Pulse/S×4 Bytes/Pulse=80M Bytes /S

4.3动态改变打印数据

        为保证数据的连续性,一个位图在输出的同时,下一个位图就要提前准备好。但是下一个位图的内容是根据条件不同动态改变,这样就存在动态改变内存数据的问题。

5 对 策

5.1 DLL

        首先对于高速、连续的地输出大量的数据,在没有大内存板卡支持的情况下,就要尽量地提高从内存到板卡数据的传输能力,即计算机需要保证向板卡输出数据的同时,随后的数据要提前准备好。因Windows为非Run-time系统,系统会同时处理多个进程,一旦板卡需要补充数据的时候,恰逢Windows正在处理别的任务,就会造成数据中断,所以为避免这种情况的发生,我们引入在Labview下调用DLL(动态链接库)的方式[5],采用Visual C++编写DLL[6],来进行数据传输,以实行对Labview资源的独占及对系统资源尽可能占有的方式来提高实时性。

5.2 Dobule Buffer[3]

要实现动态改变内存数据的功能,就要引入Dobule Buffer的功能,即在计算机的内存中开辟两个(或更多)缓冲区,在第一个缓冲区通过直接内存存取 (DMA)向板卡传送数据时,根据条件选择后续的数据(位图)并放入第二个缓冲区,在这期间我们始终采用函数‘数据传送完了的置位信号检查’(next ready check)来判断正在进行数据输出的缓冲区是否传送完了,若传送完了两个缓冲交换功能,即第一个缓冲区准备数据,第二个缓冲区传送数据,如此交替进行下去,即实现了动态的传送数据。

6 实 现

6.1 DLL、Dobule Buffer的建立[7]

在Visual C++中选择DLL输出模式, 并建立cpp文档如下(择选)
#include //包含Windows 标准函数
#include"dask.h" //包含板卡的相关函数
void printer (U32 out_count,U32 out_count2,F64 samp_rate,
//输出数据用主函数
U16 *p1,U16 *p2,U16 TRIG_MODE,U16 height,I16 times)
// p1、p2为数据输入地址
{
ao_buf1=(U16*)malloc(out_count*2); //建立4个缓冲区
ao_buf2=(U16 *)malloc(out_count2*2);
ao_buf3=(U16 *)malloc(out_count*2);
ao_buf4=(U16 *)malloc(out_count2*2);
memcpy(ao_buf1, p1, out_count*2); //向4个缓冲区送入数据
pbak=&p1[out_count];
memcpy(ao_buf3, pbak, out_count*2);
pbak=&p1[out_count*2];
memcpy(ao_buf2, p2, out_count2*2);
memcpy(ao_buf4, p2, out_count2*2);
err = DO_ContMultiBufferSetup (card, ao_buf1,out_count , &id);
//配置4个缓冲区
err = DO_ContMultiBufferSetup (card, ao_buf2, out_count2, &id);
err = DO_ContMultiBufferSetup (card, ao_buf3,out_count , &id);
err = DO_ContMultiBufferSetup (card, ao_buf4, out_count2, &id);
err = DO_ContMultiBufferStart (card, 0, samp_rate);
//以需要频率启动缓冲区
for (i=0;i { if(!err)
{
do {
do
{DO_AsyncMultiBufferNextReady(card, &halfReady, &viewidx);
//执行缓冲状态检查
} while (!halfReady);
if(halfReady)
{if(viewidx==0)
//若1缓冲准备好,则发送新数据
{ memcpy(ao_buf1, pbak, out_count*2);
pbak=&p1[out_count*(j+3)];
j++;}
Else
if(viewidx==2)
//若3缓冲OK,则发送新数据
{
memcpy(ao_buf3, pbak, out_count*2);
pbak=&p1[out_count*(j+3)];

j++;}}
} while(j<(height));
//到位图尾则跳出循环
}
DO_AsyncClear(card, &count1); //清除作业
}
编译、调试、输出为DLL文件,以备Labview调用。

6、2 动态链接库的调用[8]

        做好DLL之后,要用适当的方式将其同Labview连接,这里采用的是”Call Library Funtion”的方式,如下图3


        首先对“Call Library Funtion”函数进行配置,如图4

1、设置DLL路径
2、选用函数名
3、设定返回类型
4、设定各项形式参数(输入值)

       数据数组要采用指针的方式进行传递。


       最后对做好的程序进行调试,为检验dll是否被有效执行,一个方法是:用示波器对产生的波形进行监控,另外还可以采用返回相应想监控的值,来验证程序是否被正确执行。

7 结 论

        本设计实现了80M Bytes/s(10M Hz/Line)以下连续(数小时)、高速、大量的DO功能,具体输出波形节选及实际印字样张见图5



        本设计是对Labview的易用性、可视化及Visual C++的高效性的有效结合,可用于各种打印、数据传输的应用,也可应用于其他对Run-time要求较高的场合。但同时需要注意配置性能稍高的计算机和板卡。计算机至少应满足PIII933及内存512M以上,板卡要具有DMA的功能,且至少带32K以上缓存。

参考文献

[1]武一.虚拟信号测量仪的设计开发[J],电子测量技术,2008,31(3):55-57.
[2]郭俊峰.基于虚拟仪器的电磁环境检测系统[J],电子测量技术,2006,29(2):47-49.
[3]ADLINK TECHNOLOGY INC.NuDAQ PCI-7300 digital Input/Output card user‘s guide[M].
[4]周承仙.基于Labwindows/CVI的多路高速数据采集系统设计[J]. 电子测量技术,2007,30(12):66-69.
[5]杨乐平.LabVIEW高级程序设计[M].北京:清华大学出版社.
[6]寇蒄.虚拟仪器技术在蓝牙调频教学试验中的应用[J].电子测量技术.2006,29(2):50-51.
[7]谭浩强. C程序设计[M].北京:清华大学出版社.
[8]候国屏.LabVIEW7.1编程与虚拟仪器技术[M].北京:清华大学出版社.

更多回帖

×
20
完善资料,
赚取积分