Adc

Source code can be downloaded from source:/Examples/Adc

Description
This demo shows using of ADC module in ADC extension board.

From the main.c source file:

Init ADC0: 200 kHz sampling rate, 10 bits:

ADC_Init(LPC_ADC0, 200000, 10);

Getting ADC result on channel 3 using polling:

// Enable channel 3
ADC_ChannelCmd(LPC_ADC0, ADC_CHANNEL_3, ENABLE);
// Start single conversion
ADC_StartCmd(LPC_ADC0, ADC_START_NOW);
// Wait for DONE bit set
while (ADC_ChannelGetStatus(LPC_ADC0, ADC_CHANNEL_3, ADC_DATA_DONE) != SET);
// Read result
adcResults[3] = ADC_ChannelGetData(LPC_ADC0, ADC_CHANNEL_3);
// Disable channel
ADC_ChannelCmd(LPC_ADC0, ADC_CHANNEL_3, DISABLE);

Getting ADC result on channel 4 using interrupt:

// Enable channel 4
ADC_ChannelCmd(LPC_ADC0, ADC_CHANNEL_4, ENABLE);
// Enable interrupt for channel 1
ADC_IntConfig(LPC_ADC0, ADC_ADINTEN4, ENABLE);
// Start single conversion
ADC_StartCmd(LPC_ADC0, ADC_START_NOW);
// Wait for result to be read in interrupt
while (adcResults[4] == (uint16_t)~0);
// Disable channel
ADC_ChannelCmd(LPC_ADC0, ADC_CHANNEL_4, DISABLE);

Get ADC result on channels 0 and 1 using burst:

// Enable channel 0
ADC_ChannelCmd(LPC_ADC0, ADC_CHANNEL_0, ENABLE);
// Enable channel 1
ADC_ChannelCmd(LPC_ADC0, ADC_CHANNEL_1, ENABLE);
// Enable burst
ADC_StartCmd(LPC_ADC0, ADC_START_CONTINUOUS);   // start must be = 0 when enabling burst
ADC_BurstCmd(LPC_ADC0, ENABLE);

Data read can be done using ADC_ChannelGetStatus() and ADC_ChannelGetData(), but this functions read data register for 2 times:

while (1)
{
   uint32_t dr;

   // Data read can be done using ADC_ChannelGetStatus() and ADC_ChannelGetData(),
   // but this functions reads data register 2 times
   // Read channel 0 result
   dr = LPC_ADC0->DR[0];
   if (dr & ADC_DR_DONE_FLAG)
   {
      adcResults[0] = ADC_DR_RESULT(dr);
   }
   // Read channel 1 result
   dr = LPC_ADC0->DR[1];
   if (dr & ADC_DR_DONE_FLAG)
   {
      adcResults[1] = ADC_DR_RESULT(dr);
   }
}

 

Английский