With a 4227 set on logical triggering "Trigger on Input A or Input B" , does the driver return which input has received the trigger? I need to know which input was triggered to process my data accordingly. Processing will depend whether the signal was coming in from Input A or Input B.
Thx.
Laurent
Looking at the Programmer's Guide, unfortunately there isn't a direct way of establishing the channel on which a trigger occurred due to the way the FPGA handles the trigger.
If you are able to provide any information on how you wish to process the data, we could look at finding a way around this as you can obtain the number of the sample at which the trigger occurred from the callback function.
Can you clarify "the Number of the Sample" from your post please?
Essentially I have 2 inputs connected to the digitizer. The signal comes alternatively from either A or B, and I want to make sure that when a trigger occurs from signal A (B) , it is actually the case so that I can pull the data from A (B). All my signals coming from A are averaged together, and I don't want to mix them with B signals. Same idea from B signals being averaged together.
Maybe I could just re-arm the digitizer and force it to trigger on A only, then later on B only... But I wanted to have better sense of what the logical triggering could do
Thx
L.
void PREF4 CallBackStreaming( short handle, long noOfSamples, unsigned long startIndex,
short overflow, unsigned long triggerAt, short triggered,
short autoStop, void *pParameter)
{
// used for streaming
g_sampleCount = noOfSamples;
g_startIndex = startIndex;
g_autoStopped = autoStop;
// flag to say done reading data
g_ready = TRUE;
// flags to show if & where a trigger has occurred
g_trig = triggered;
g_trigAt = triggerAt;
}
void StreamDataHandler(UNIT * unit, unsigned long preTrigger)
{
long i, j;
unsigned long sampleCount= BUFFER_SIZE * 10; /* *10 is to make sure buffer large enough */
FILE * fp = NULL;
short * buffers[PS3000A_MAX_CHANNEL_BUFFERS];
PICO_STATUS status;
unsigned long sampleInterval = 1;
int index = 0;
int totalSamples;
unsigned long triggeredAt = 0;
for (i = 0; i < unit->channelCount; i++) // create data buffers
{
buffers[i * 2] = (short*) malloc(sampleCount * sizeof(short));
buffers[i * 2 + 1] = (short*)malloc(sampleCount * sizeof(short));
status = ps3000aSetDataBuffers( unit->handle,
i,
buffers[i * 2],
buffers[i * 2 + 1],
sampleCount,
0,
PS3000A_RATIO_MODE_NONE);
}
printf("Waiting for trigger...Press a key to abort\n");
g_autoStopped = FALSE;
status = ps3000aRunStreaming(unit->handle,
&sampleInterval,
PS3000A_US,
preTrigger,
1000000 - preTrigger,
//FALSE,
TRUE,
1000,
PS3000A_RATIO_MODE_AGGREGATE,
sampleCount);
totalSamples = 0;
while (!_kbhit() && !g_autoStopped)
{
/* Poll until data is received. Until then, GetStreamingLatestValues wont call the callback */
Sleep(100);
g_ready = FALSE;
status = ps3000aGetStreamingLatestValues(unit->handle, CallBackStreaming, NULL);
index ++;
if (g_ready && g_sampleCount > 0) /* can be ready and have no data, if autoStop has fired */
{
if (g_trig)
triggeredAt = totalSamples += g_trigAt;
totalSamples += g_sampleCount;
printf("\nCollected %li samples, index = %lu, Total: %d samples ", g_sampleCount, g_startIndex, totalSamples);
if (g_trig)
printf("Trig. at index %lu", triggeredAt);
// File processing
ps3000aStop(unit->handle);
if (!g_autoStopped)
{
printf("\ndata collection aborted\n");
_getch();
}
for (i = 0; i < unit->channelCount * 2; i++)
{
free(buffers[i]);
}
While data is being collected, the code finds the position in the buffer of the data values where the trigger occurred and adds it to the total number of samples collected so far to determine the sample since the start of capture at which the trigger occurred.
If your signals are repetitve, then the option you suggested of alternating trigger would be an option. It may be that you have to examine the data to determine on which channel the trigger occurred.
Is the 4227 the PicoScope you are referring to in your other post concerning conformal coating?
With the call to the ps4000RunBlock() command, the callback function will not provide an indication of the trigger point. There is the pParameter which can be used to send any data such as a status flag back to the application.