Interface: tos.chips.atm128.adc.Atm128AdcMultiple

interface Atm128AdcMultiple

Hardware Abstraction Layer interface of Atmega128 for acquiring data from multiple channels using the ATmega128's free-running mode.

Because of the possibility that samples may be imprecise after switching channels and/or reference voltages, and because there is a one sample delay on swithcing channels and reference voltages, Atm128ADCMultiple is complex. Two straightforward uses are:

  1. Acquire N samples from channel C:
    1. call getData to start sampling on channel C at the desired rate (note that the choice of prescalers is very limited, so you don't have many choices for sampling rate)
    2. ignore the first dataReady event
    3. use the results of the next N dataReady() events, return FALSE on the last one
  2. Acquire one sample each from channels C1, ..., Cn (this pseudocode assumes that none of these channels are differential)
    1. call getData to start sampling on channel C1
    2. on the ith dataReady event switch to channel Ci+1 by changing *newChannel
    3. the data passed to the ith dataReady event is for channel Ci-1 (the data from the first dataReady event is ignored)

Author:
Hu Siquan <husq@xbow.com>
David Gay

Commands
command bool getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler) Initiates free-running ADC conversions, with the ability to switch channels and reference-voltage with a one sample delay.

Events
event bool dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage) Returns the next sample in a free-running conversion.

Commands - Details

getData

command bool getData(uint8_t channel, uint8_t refVoltage, bool leftJustify, uint8_t prescaler)

Initiates free-running ADC conversions, with the ability to switch channels and reference-voltage with a one sample delay.

Parameters:
channel - Initial A/D conversion channel. The channel can be changed in the dataReady event, though these changes happen with a one-sample delay (this is a hardware restriction).
refVoltage - Initial A/D reference voltage. See the ATM128_ADC_VREF_xxx constants in Atm128ADC.h. Like the channel, the reference voltage can be changed in the dataReady event with a one-sample delay.
leftJustify - TRUE to place A/D result in high-order bits (i.e., shifted left by 6 bits), low to place it in the low-order bits
prescaler - Prescaler value for the A/D conversion clock. If you specify ATM128_ADC_PRESCALE, a prescaler will be chosen that guarantees full precision. Other prescalers can be used to get faster conversions. See the ATmega128 manual for details.
Returns:
TRUE if the conversion will be precise, FALSE if it will be imprecise (due to a change in reference voltage, or switching to a differential input channel)

Events - Details

dataReady

event bool dataReady(uint16_t data, bool precise, uint8_t channel, uint8_t *newChannel, uint8_t *newRefVoltage)

Returns the next sample in a free-running conversion. Allow the user to switch channels and/or reference voltages with a one sample delay.

Parameters:
data - a 2 byte unsigned data value sampled by the ADC.
precise - if this conversion was precise, FALSE if it wasn't (we assume that the second conversion after a change of reference voltage or after switching to a differential channel is precise)
channel - Channel this sample was from.
newChannel - Change this parameter to switch to a new channel for the second next sample.
newRefVoltage - Change this parameter to change the reference voltage for the second next sample.
Returns:
TRUE to continue sampling, FALSE to stop.