关键词: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实现触发次数的测量,若需全部代码,请联系简仪科技。
Copyright © 2016-2024 JYTEK All Rights Reserved.