|
如果是自己做板用单片机是很简单的事情,但是用上采集卡涉及到硬件软件之间来回协调,就有些费解了。
用法很直观:NI USB-6210采集卡(AD速度250kps/s),计数器接口外接编码器,信号下降沿计数。
编码器转速是变化的,信号频率最大为25kHz,在每个脉冲到来的时候触发一次AD采集,采集完等下一个脉冲。
看了NI的范例,然后用手头有的低端6008采集卡试了下,外触发只能用一次,也就是说让AD采集启动后,就不能再次触发了。
6210贵一点,好像可以重复触发,但暂时没收到,不过看代码觉得就25kHz这个触发频率有些难实现。
范例是 收到触发信号--->回调函数处理数据--->然后继续等待触发信号--->回调函数处理数据
- /*********************************************************************
- *
- * ANSI C Example program:
- * ContAcq-IntClk-DigStart-Retrig.c
- *
- * Example Category:
- * AI
- *
- * Description:
- * This example demonstrates how to acquire finite amounts of data
- * on each digital trigger.
- *
- * Instructions for Running:
- * 1. Select the physical channel to correspond to where your
- * signal is input on the DAQ device.
- * 2. Enter the minimum and maximum voltage range.
- * Note: For better accuracy try to match the input range to the
- * expected voltage level of the measured signal.
- * 3. Select the number of points to acquire per channel.
- * 4. Specify the rate of the sample clock.
- * 5. Select a source for the digital edge start trigger.
- * 6. Select the edge, rising or falling, on which to trigger.
- *
- * Steps:
- * 1. Create a task.
- * 2. Create an analog input voltage channel.
- * 3. Setup the timing for the acquisition. In this example, the
- * Sample Clock is generated internally by the board. Rate
- * specifies the rate of the internal clock. The timing is set
- * to take a finite number of samples. The number of samples is
- * specified by the Samples per Channel control. For a
- * retriggerable acquisition, the Samples per Channel defines
- * the number of samples to acquire for each trigger.
- * 4. Set the parameters for a digital edge start trigger.
- * 5. Set the Trigger Attribute to set the operation for
- * retriggerable.
- * 6. Call the Start function to start the acquistion.
- * 7. Read the data in the EveryNCallback function until the stop
- * button is pressed or an error occurs.
- * 8. Call the Clear Task function to clear the task.
- * 9. Display an error if any.
- *
- * I/O Connections Overview:
- * Make sure your signal input terminal matches the Physical
- * Channel I/O control. Also, make sure your analog trigger
- * terminal matches the Trigger Source Control. For further
- * connection information, refer to your hardware reference manual.
- *
- *********************************************************************/
- #include <stdio.h>
- #include <NIDAQmx.h>
- #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
- int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
- int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);
- int main(void)
- {
- int32 error=0;
- TaskHandle taskHandle=0;
- char errBuff[2048]={'\0'};
- /*********************************************/
- // DAQmx Configure Code
- /*********************************************/
- DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
- DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
- DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));
- DAQmxErrChk (DAQmxCfgDigEdgeStartTrig(taskHandle,"/Dev1/PFI0",DAQmx_Val_Falling));
- DAQmxErrChk (DAQmxSetStartTrigRetriggerable(taskHandle,1));
- DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,1000,0,EveryNCallback,NULL));
- DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));
- /*********************************************/
- // DAQmx Start Code
- /*********************************************/
- DAQmxErrChk (DAQmxStartTask(taskHandle));
- printf("Acquiring samples continuously. Press Enter to interrupt\n");
- getchar();
- Error:
- if( DAQmxFailed(error) )
- DAQmxGetExtendedErrorInfo(errBuff,2048);
- if( taskHandle!=0 ) {
- /*********************************************/
- // DAQmx Stop Code
- /*********************************************/
- DAQmxStopTask(taskHandle);
- DAQmxClearTask(taskHandle);
- }
- if( DAQmxFailed(error) )
- printf("DAQmx Error: %s\n",errBuff);
- printf("End of program, press Enter key to quit\n");
- getchar();
- return 0;
- }
- int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
- {
- int32 error=0;
- char errBuff[2048]={'\0'};
- static int totalRead=0;
- int32 read=0;
- float64 data[1000];
- /*********************************************/
- // DAQmx Read Code
- /*********************************************/
- DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,data,1000,&read,NULL));
- if( read>0 ) {
- printf("Acquired %d samples. Total %d\r",read,totalRead+=read);
- fflush(stdout);
- }
- Error:
- if( DAQmxFailed(error) ) {
- DAQmxGetExtendedErrorInfo(errBuff,2048);
- /*********************************************/
- // DAQmx Stop Code
- /*********************************************/
- DAQmxStopTask(taskHandle);
- DAQmxClearTask(taskHandle);
- printf("DAQmx Error: %s\n",errBuff);
- }
- return 0;
- }
- int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
- {
- int32 error=0;
- char errBuff[2048]={'\0'};
- // Check to see if an error stopped the task.
- DAQmxErrChk (status);
- Error:
- if( DAQmxFailed(error) ) {
- DAQmxGetExtendedErrorInfo(errBuff,2048);
- DAQmxClearTask(taskHandle);
- printf("DAQmx Error: %s\n",errBuff);
- }
- return 0;
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|