3.3 Interrupt-Based AD Sample or Scan

Description

Interrupt-based analog input operations are necessary when conversions must be performed at high sampling rates. They differ in operation from standard A/D samples and scans in that they perform a preset number of conversions per function call, rather than taking a single sample or scan. There are a number of different options that can be set for interrupt-based operations; these are explained in the interrupt-based operations chapter. The Universal Driver functions for A/D sample and scan operations are dscADSampleInt and dscADScanInt.

Step-By-Step Instructions

Create and initialize an A/D settings structure (DSCADSETTINGS).

Call dscADSetSettings and pass it a pointer to this structure in order to setup the driver for A/D operations.

Create and initialize an analog I/O interrupts structure (DSCAIOINT).

Initialize the sample_values buffer in the DSCAIOINT structure by allocating sufficient memory to store the results of the interrupt operations. The memory required is:

Memory = sizeof(WORD) * num_conversions

Call dscADSampleInt or dscADScanInt and pass it a pointer to the above-mentioned DSCAIOINT structure to begin interrupt operation. The interrupt operations will now run in a separate system thread until either they reach the maximum number of conversions specified (one-shot mode only) or they are cancelled by a call to dscCancelOp.

Example of Usage for Interrupt-Based A/D Sample or Scan

... 

DSCB dscb; 
DSCADSETTINGS dscadsettings; 
DSCAIOINT dscaioint; 

... 

/* Step 1 */ 

// These are example values; your application will vary. 
// See DSCADSETTINGS struct and hardware manuals for details. 

dscadsettings.current_channel = 0; 
dscadsettings.gain = GAIN_1; 
dscadsettings.range = RANGE_5; 
dscadsettings.polarity = UNIPOLAR; 
dscadsettings.load_cal = 0; 

/* Step 2 */ 

if ((result = dscADSetSettings(dscb, &dscadsettings)) != DE_NONE) 
    return result; 

/* Step 3 */ 

dscaioint.num_conversions = 1024;
dscaioint.conversion_rate = 10000; 
dscaioint.cycle = FALSE; 
dscaioint.internal_clock = TRUE; 
dscaioint.low_channel = 0; 
dscaioint.high_channel = 3; 
dscaioint.external_gate_enable = FALSE; 
dscaioint.internal_clock_gate = FALSE; 
dscaioint.fifo_enab = TRUE; 
dscaioint.fifo_depth = 256; 
dscaioint.dump_threshold = 512; 

/* Step 4 */ 

dscaioint.sample_values = (WORD*) malloc(sizeof(WORD) * dscaioint.num_conversions); 
memset(dscaioint.sample_values, 0, sizeof(WORD) * dscaioint.num_conversions); 

/* Step 5 */ 

if ((result = dscADScanInt(dscb, &dscaioint)) != DE_NONE) 
    return result; 

...

NOTE: Boards can only achieve interrupt rates that divide evenly into their onboard counters, so the driver will attempt to find the rate closest to that which you specified.

Last updated