From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Digital I/O

cancel
Showing results for 
Search instead for 
Did you mean: 

Digital Waveform Generation with arbitrary clock on PCI-6251 and software trigger

Hello,

I try to program a PCI-6251 card with Matlab (nidaqmx ANSI C library) to generate digital waveform and trig it trought the matlab interface.

For now I have a problem to set an arbitrary clock frequency, since only the 20MHzTimebase,80MHzTimebase,100kHzTimebase terminal source seems working. Since I use the digital I/O it seems no "OnBoardClock" is available. See below for the code used.

How can I change the framerate the sample are generated (for example 10Hz) and can I trig the start of the generation after the datas to generate have been uploaded on the card.

Thank you for any help,
    Lynda

calllib('nicaiu','DAQmxCreateTask','TaskName',taskh1);
calllib('nicaiu','DAQmxCreateDOChan',get(taskh1,'Value'),"Dev1/port0/line0",""LineName",DAQmx_Val_ChanForAllLines);
calllib('nicaiu','DAQmxCfgSampClkTiming',get(taskh1,'Value'),'100kHzTimebase',...
    double(5),DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,double(15));

reserved=libpointer('uint32Ptr',[]);
digidata=uint8([1,1,0,0,1,0,1,1,1,0]);       % data sequence to write on output
write = libpointer('uint8Ptr',digidata);
writtenSample=libpointer('int32Ptr',0);

calllib('nicaiu','DAQmxWriteDigitalLines',get(taskh1,'Value'),int32(10), uint32(0),double(10),...
    uint32(do.DAQmx_Val_GroupByChannel),write,writtenSample,reserved);

calllib('nicaiu','DAQmxStartTask',get(taskh1,'Value'));

calllib('nicaiu','DAQmxStopTask',get(taskh1,'Value'));

0 Kudos
Message 1 of 2
(3,090 Views)
I finally manage to do it by creating a pulse generator on ctr0 and internally link it:

[do.error,do.taskname,do.taskh2] = calllib('nicaiu','DAQmxCreateTask','counterTask',do.counterTask); % doesnt return a pointer!! Task taskh1
do.counterTask=libpointer('uint32Ptr',do.counterTask);                                       % thus typecast again to pointer
[do.error,do.taskname,do.taskh1] = calllib('nicaiu','DAQmxCreateTask','selectOutputTask',do.selectOutputTask); % doesnt return a pointer!! Task taskh1
do.selectOutputTask=libpointer('uint32Ptr',do.selectOutputTask);                                       % thus typecast again to pointer

[do.error,do.lineId2,do.lineName2]=calllib('nicaiu','DAQmxCreateCOPulseChanFreq',get(do.counterTask,'Value'),'Dev1/ctr0','Counter0',do.DAQmx_Val_Hz,...
    do.DAQmx_Val_Low, double(0),double(do.applicationFreq/10),double(0.5));
do.error=calllib('nicaiu','DAQmxCfgImplicitTiming',get(do.counterTask,'Value'), do.DAQmx_Val_ContSamps,do.samplesToGenerate);

[do.error,do.lineId1,do.lineName1]=calllib('nicaiu','DAQmxCreateDOChan',get(do.selectOutputTask,'Value'),'Dev1/port0/line0','Line0',do.DAQmx_Val_ChanForAllLines);
[do.error,do.source]=calllib('nicaiu','DAQmxCfgSampClkTiming',get(do.selectOutputTask,'Value'),'/Dev1/Ctr0InternalOutput',double(5),do.DAQmx_Val_Falling,do.DAQmx_Val_FiniteSamps,do.samplesToGenerate);

do.reserved=libpointer('uint32Ptr',[]);
do.write = libpointer('uint8Ptr',do.patternToGenerate);
do.writtenSample=libpointer('int32Ptr',0);
[do.error,do.write,do.writtenSample,do.reserved]=calllib('nicaiu','DAQmxWriteDigitalLines',get(do.selectOutputTask,'Value'),int32(10),uint32(0),double(10),uint32(do.DAQmx_Val_GroupByChannel),do.write,do.writtenSample,do.reserved);
do.write=libpointer('uint8Ptr',do.write);
do.writtenSample=libpointer('int32Ptr',do.writtenSample);
do.reserved=libpointer('uint32Ptr',do.reserved);

[do.error]=calllib('nicaiu','DAQmxStartTask',get(do.selectOutputTask,'Value'));
[do.error]=calllib('nicaiu','DAQmxStartTask',get(do.counterTask,'Value'));

0 Kudos
Message 2 of 2
(3,079 Views)