PCIe/PXIe-5411实现高精度脉冲输出示例
来源: | 作者:JYTEK | 发布时间: 2022-09-16 | 642 次浏览 | 分享到:

关键词:PCIe/PXIe-5411、DO


1.简介


图 1  PCIe/PXIe-5411

PCIe/PXIe-5411 是一个32 通道高速数字I/O (HSDIO)模块。32 个数字通道可以使用软件对数据方向进行编程。信号电平支持4 个选项:1.8V、2.5V、3.3V和5V。数据序列可通过软件自由组合。该设备利用高吞吐量PCI Express 总线和多核优化驱动程序和应用软件来提供高性能功能。



2.问题描述

如何使用PCIe/PXIe-5411输出10us脉宽,间隔100us的双脉冲信号?


3.问题答复

配置PCIe/PXIe-5411更新率为5MS/s,则1个点为200ns,使用有限点模式,编辑10us的高电平,100us的低电平,10us高电平的数据,也就是50个高,500个低,50个高,一共600个字节数据,写入PCIe/PXIe-5411输出,即可实现高精度脉冲输出。


4.参考代码

配置PCIe/PXIe-5411更新率为5MS/s,则1个点为200ns,使用有限点模式,编辑10us的高电平,100us的低电平,10us高电平的数据,也就是50个高,500个低,50个高,一共600个字节数据,写入PCIe/PXIe-5411输出,即可实现高精度脉冲输出

  • 获取高低电平点数

1. /* 

2.  * 一个点的时间 = 1/采样率 

3.  */  

4. highcount = (double)numericUpDown1.Value / 0.2; //高脉宽的点数=脉宽时间/一个点的时间  

5. idlecount = (double)numericUpDown2.Value / 0.2;//脉宽间隔的点数=脉宽间隔的时间/一个点的时间  

6.   

7. datacount = (int)(highcount + idlecount + highcount);//所有数据点数   


  • 写入数据

1.       /// <summary>  

2.       /// writeData  

3.       /// </summary>  

4.       private void writeData()  

5.       {  

6.           writeValue = new byte[datacount + 1];  

7.   

8.           singlePeriodwriteValue = new byte[datacount + 1];  

9.   

10.           //分别写入高低脉宽  

11.           for (int i = 0; i < highcount; i++)  

12.           {  

13.               singlePeriodwriteValue[i] = 1;  

14.           }  

15.   

16.           for (int i = 0; i < idlecount; i++)  

17.           {  

18.               singlePeriodwriteValue[(int)highcount + i] = 0;  

19.           }  

20.   

21.           for (int i = 0; i < highcount; i++)  

22.           {  

23.               singlePeriodwriteValue[(int)highcount + (int)idlecount + i] = 1;  

24.           }  

25.   

26.           //生成复制到 writeData 数组的单周期数字信号  

27.           int periodcount = 0;  

28.           //输出一个周期  

29.           periodcount = writeValue.Length / singlePeriodwriteValue.Length;  

30.           for (int i = 0; i < periodcount; i++)  

31.           {  

32.               //数据拷贝  

33.               Buffer.BlockCopy(singlePeriodwriteValue, 0, writeValue, i * singlePeriodwriteValue.Length * sizeof(byte), singlePeriodwriteValue.Length * sizeof(byte));  

34.           }  

35.   

36.           //writeData  

37.           doTask.WriteData(writeValue, (uint)datacount, -1);  

38.       }