在windows系统上如何精确循环获取PXIe-9817模拟重触发次数
来源: | 作者:JYTEK | 发布时间: 2023-03-16 | 682 次浏览 | 分享到:

关键词:PXIe-9817、精确循环、模拟重触发


1.简介

简仪本程序的目的是使用PXIe-9817循环获取触发次数,根据单位时间内的触发次数,判断信号的强度。触发信号频率最高为10KHz,幅值500mV以内,高电平持续时间200ns左右。因此需要用到PXIe-9817的模拟触发功能以及windows系统的精确定时。

PXIe-9817是简仪科技提供的高速、高质量采集的数字化仪产品。每个输入通道支持最高125MS/s的采样率,16位分辨率A/D转换器。允许在所有通道上同时记录信号,几乎没有通道间相位延迟。并且具备灵活的输入范围,包括10V、5V、1V和0.5V,以及软件可选的50Ω或1MΩ输入阻抗。

图 1 PXIe-9817产品介绍


2.程序设计

为了获取信号的触发次数,需要配置PXIe-9817的模拟触发功能,为了精确定时和提高程序运行效率,本程序使用C/C++编写。

使用简仪科技提供的SDK,也是5步即可完成程序的设计。

第1步:打开PXIe-9817板卡

1. err = JY981x_Open(cardNumber, &hDevice);         // 打开板卡  

2.     if (err != 0)  

3.     {  

4.         printf("JY981x_Open Error: %d, Open device failed!n", err);  

5.         return 0;  

6.     }  


第2步:配置基本参数,主要包括添加通道、配置采集模式、采样率、采样点数以及模拟触发参数配置

1. err = JY981x_AI_EnableChannel(hDevice, CHANNEL_COUNT, pChannel, pRangeLow, pRangeHigh, pCoupling, pImpendance);       // 添加通道  

2. if (err != 0)  

3. {  

4.     printf("JY981x_AI_EnableChannel Error: %d, set channel failedn", err);  

5.     goto err_free;  

6. }  

7.   

8. err = JY981x_AI_SetMode(hDevice, JY981x_SampleMode::JY981x_Finite);     // 设置为有限点采集  

9. if (err != 0)  

10. {  

11.     printf("JY981x_AI_SetMode Error: %d, set acquisition mode failedn", err);  

12.     goto err_free;  

13. }  

14.   

15. err = JY981x_AI_SetSampleRate(hDevice, sampleRate, &actualSampleRate);   // 设置采样率  

16. if (err != 0)  

17. {  

18.     printf("JY981x_AI_SetSampleRate Error: %d, set sampleRate failedn", err);  

19.     goto err_free;  

20. }  

21.   

22. err = JY981x_AI_SetSamplesToAcquire(hDevice, SAMPLING_TO_ACQUIRE);       // 设置采样点数  

23. if (err != 0)  

24. {  

25.     printf("JY981x_AI_SetSamplesToAcquire Error: %d, set sampleToAcquire failedn", err);  

26.     goto err_free;  

27. }  

28.   

29. err = JY981x_AI_SetStartTriggerType(hDevice, JY981x_TriggerType::JY981x_Analog);    // 设置为模拟触发  

30. if (err != 0)  

31. {  

32.     printf("JY981x_AI_SetStartTriggerType Error: %d, set trigger type failedn", err);  

33.     goto err_free;  

34. }  

35.   

36. // 设置为边沿触发,触发源为通道0,上升沿,大于1.2V触发  

37. err = JY981x_AI_SetAnalogEdgeStartTrigger(hDevice, JY981x_AnalogTriggerSource::JY981x_Channel_0, JY981x_AnalogTriggerEdge::JY981x_RisingSlope, 1.2);  

38. if (err != 0)  

39. {  

40.     printf("JY981x_AI_SetAnalogEdgeStartTrigger Error: %d, set SetAnalogEdge failedn", err);  

41.     goto err_free;  

42. }  

43.   

44. // 设置重触发次数,-1,无限次重触发  

45. err = JY981x_AI_SetReTriggerCount(hDevice, -1);  

46. if (err != 0)  

47. {  

48.     printf("JY981x_AI_SetReTriggerCount Error: %d, set ReTriggerCount failedn", err);  

49.     goto err_free;  

50. }  


第3步:开始采集,实现代码如下

1.     err = JY981x_AI_Start(hDevice);  

2.     if (err != 0)  

3.     {  

4.         printf("JY981x_AI_Start Error: %d", err);  

5.         goto err_free;  

6.     } 



第4步:判断缓存状态并读取数据

1.         if (err != 0)  

2.         {  

3.             printf("JY981x_AI_CheckBufferStatus Error: %dn", err);  

4.             goto err_ret;  

5.         }  

6.        

7.           

8.         if (availableSamples != 0)  

9.         {  

10.             pDatabuf = new double[availableSamples * CHANNEL_COUNT];  

11.             // 读取数据,-1表示永不超时(读取时创建的数组有对齐的要求吗?)  

12.             err = JY981x_AI_ReadData(hDevice, pDatabuf, availableSamples, 10000, &actualSample);     // 10ms为超时  

13.             if (err != 0)  

14.             {  

15.                 printf("JY981x_AI_ReadData Error: %dn", err);  

16.                 goto err_ret;  

17.             }  

18.             // 删除数据  

19.             delete[] pDatabuf;  

20.             pDatabuf = NULL;  

21.   

22.           }  


第5步:停止采集,关闭板卡

1. JY981x_AI_Stop(hDevice);           // 停止采集  

2. JY981x_Close(hDevice);             // 关闭板卡  

以上即为调用简仪科技提供的SDK完成PXIe-9817的重触发配置过程。那么在windows上如何实现精确定时,可以使用C/C++类库中提供的QueryPerformanceFrequency和QueryPerformanceCounter函数实现。

首先调用QueryPerformanceFrequency函数获取CPU基准频率,再利用QueryPerformanceCounter函数获取计数值,利用启停时刻的计数值差除以基准频率即得到逝去时间。代码实现如下。

1. QueryPerformanceFrequency(&perfCnt);          // 获取CPU频率  

2. QueryPerformanceCounter(&start);             // 获取当前CPU计数  

3. do  

4. {  

5.     QueryPerformanceCounter(&next);            // 获取结束本轮结束时刻CPU计数  

6. } while ((next.QuadPart - start.QuadPart) / (float)(perfCnt.QuadPart) * 1000000 < _intervalTime);   // 10ms定时  

基于以上程序,即可使用PXIe-9817实现触发次数的测量,若需全部代码,请联系简仪科技。