SparkFun Forums 

Where electronics enthusiasts find answers.

Topics pertaining to the Arduino Core & software used with the Artemis module and Artemis development boards.
#210644
Hopefully someone can shed some light on this. I'm trying to use the same working high-speed ADC code from another topic to acquire from the two differential channels instead of the single-ended ones. There is no highlighted errors in the text of the code, but there's an error compiling for board Artemis ATP:

MODERATOR EDIT: PLEASE USE CODE TAGS WHEN INCLUDING CODE.


Code: Select all
In file included from C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/am_sdk_ap3/mcu/apollo3/am_mcu_apollo.h:139,
from C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/ard_sup/Arduino.h:40,
from sketch\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino.cpp:1:
E:\1_TRU_Other\Programming\Arduino\ArduinoSketches\ArtemisATP_2ch_diff_HiSpeed_ADC_OK\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino: In function 'void setup()':
C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/am_sdk_ap3/mcu/apollo3/hal/am_hal_pin.h:156:36: error: could not convert '0' from 'int' to 'am_hal_gpio_pincfg_t'
#define AM_HAL_PIN_13_ADCD0PSE8 (0)
~^~
E:\1_TRU_Other\Programming\Arduino\ArduinoSketches\ArtemisATP_2ch_diff_HiSpeed_ADC_OK\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino:302:29: note: in expansion of macro 'AM_HAL_PIN_13_ADCD0PSE8'
am_hal_gpio_pinconfig(13, AM_HAL_PIN_13_ADCD0PSE8);//pads 12 (-), pad 13(+)
^~~~~~~~~~~~~~~~~~~~~~~
C:\Users\dpouw\AppData\Local\Arduino15\packages\SparkFun\hardware\apollo3\1.0.20/cores/arduino/am_sdk_ap3/mcu/apollo3/hal/am_hal_pin.h:165:36: error: could not convert '0' from 'int' to 'am_hal_gpio_pincfg_t'
#define AM_HAL_PIN_14_ADCD1P (0)
~^~
E:\1_TRU_Other\Programming\Arduino\ArduinoSketches\ArtemisATP_2ch_diff_HiSpeed_ADC_OK\ArtemisATP_2ch_diff_HiSpeed_ADC_OK.ino:303:30: note: in expansion of macro 'AM_HAL_PIN_14_ADCD1P'
am_hal_gpio_pinconfig(14, AM_HAL_PIN_14_ADCD1P); //pads 15 (-), pad 14(+)
^~~~~~~~~~~~~~~~~~~~
exit status 1

The sketch:
Code: Select all
[i]//*****************************************************************************
//
//! @file adc_lpmode0_dma.c
//!
//! @brief This example takes samples with the ADC at high-speed using DMA.
//!
//! Purpose: This example shows the CTIMER-A3 triggering repeated samples of an external
//! input at 1.2Msps in LPMODE0. The example uses the CTIMER-A3 to trigger
//! ADC sampling. Each data point is 8 sample average and is transferred
//! from the ADC FIFO into an SRAM buffer using DMA.

// uses bit-masking to parse out the data

#include "am_bsp.h"


// ADC Sample buffer.

#define ADC_SAMPLE_BUF_SIZE (1024) //2channels at 512 samples. Ch1 and Ch2 alternate in the buffer

uint32_t g_ui32ADCSampleBuffer[ADC_SAMPLE_BUF_SIZE];

unsigned long useconds_refresh;

// ADC Device Handle. Already declared.
//static void *g_ADCHandle;

// ADC DMA complete flag.
volatile bool g_bADCDMAComplete;

// ADC DMA error flag.
volatile bool g_bADCDMAError;

// Define Differential channel 0
const am_hal_gpio_pincfg_t g_AM_PIN_13_ADCD0PSE8 =
{
.uFuncSel = AM_HAL_PIN_13_ADCD0PSE8,
};

// Define Differential channel 1
const am_hal_gpio_pincfg_t g_AM_HAL_PIN_14_ADCD1P =
{
.uFuncSel = AM_HAL_PIN_14_ADCD1P,
};

// Interrupt handler for the ADC.
//*****************************************************************************
extern "C" void am_adc_isr() //must use 'extern "C" ' for the Artemis
{
uint32_t ui32IntMask;

// Read the interrupt status.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false))
{
Serial.println("Error reading ADC interrupt status");
}

// Clear the ADC interrupt.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask))
{
Serial.println("Error clearing ADC interrupt status");
}

// If we got a DMA complete, set the flag.
if (ui32IntMask & AM_HAL_ADC_INT_DCMP)
{
g_bADCDMAComplete = true;
}

// If we got a DMA error, set the flag.
if (ui32IntMask & AM_HAL_ADC_INT_DERR)
{
g_bADCDMAError = true;
}
}

// Set up the core for sleeping, and then go to sleep.
//*****************************************************************************
void sleep()
{
// Disable things that can't run in sleep mode.
//#if (0 == ADC_EXAMPLE_DEBUG)
// am_bsp_debug_printf_disable();
//#endif

// Go to Deep Sleep.
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);

// Re-enable peripherals for run mode.
//#if (0 == ADC_EXAMPLE_DEBUG)
// am_bsp_debug_printf_enable();
//#endif

}

// Configure the ADC.
//*****************************************************************************
void adc_config_dma()
{
am_hal_adc_dma_config_t ADCDMAConfig;

// Configure the ADC to use DMA for the sample transfer.
ADCDMAConfig.bDynamicPriority = true;
ADCDMAConfig.ePriority = AM_HAL_ADC_PRIOR_SERVICE_IMMED;
ADCDMAConfig.bDMAEnable = true;
ADCDMAConfig.ui32SampleCount = ADC_SAMPLE_BUF_SIZE;
ADCDMAConfig.ui32TargetAddress = (uint32_t)g_ui32ADCSampleBuffer;
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_dma(g_ADCHandle, &ADCDMAConfig))
{
Serial.println("Error - configuring ADC DMA failed.");
}
// Reset the ADC DMA flags.
g_bADCDMAComplete = false;
g_bADCDMAError = false;

}


// Configure the ADC.
//*****************************************************************************
void adc_config()
{
am_hal_adc_config_t ADCConfig;
am_hal_adc_slot_config_t ADCSlotConfig;

// Initialize the ADC and get the handle.
if ( AM_HAL_STATUS_SUCCESS != am_hal_adc_initialize(0, &g_ADCHandle) )
{
Serial.println("Error - reservation of the ADC instance failed.");
}

// Power on the ADC.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_power_control(g_ADCHandle,
AM_HAL_SYSCTRL_WAKE,
false) )
{
//am_util_stdio_printf("Error - ADC power on failed.\n");
Serial.println("Error - ADC power on failed.");
}

// Set up the ADC configuration parameters. These settings are reasonable
// for accurate measurements at a low sample rate.
ADCConfig.eClock = AM_HAL_ADC_CLKSEL_HFRC;
ADCConfig.ePolarity = AM_HAL_ADC_TRIGPOL_RISING;
ADCConfig.eTrigger = AM_HAL_ADC_TRIGSEL_SOFTWARE;
ADCConfig.eReference = AM_HAL_ADC_REFSEL_INT_2P0;
/*
AM_HAL_ADC_REFSEL_INT_2P0,
AM_HAL_ADC_REFSEL_INT_1P5,
AM_HAL_ADC_REFSEL_EXT_2P0,
AM_HAL_ADC_REFSEL_EXT_1P5
*/
ADCConfig.eClockMode = AM_HAL_ADC_CLKMODE_LOW_LATENCY;
ADCConfig.ePowerMode = AM_HAL_ADC_LPMODE0;
ADCConfig.eRepeat = AM_HAL_ADC_REPEATING_SCAN; //AM_HAL_ADC_SINGLE_SCAN
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure(g_ADCHandle, &ADCConfig))
{
//am_util_stdio_printf("Error - configuring ADC failed.\n");
Serial.println("Error - configuring ADC failed.");
}

// Set up an ADC slot 0
ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF0;
ADCSlotConfig.bWindowCompare = false;
ADCSlotConfig.bEnabled = true;
/*
AM_HAL_ADC_SLOT_AVG_1,
AM_HAL_ADC_SLOT_AVG_2,
AM_HAL_ADC_SLOT_AVG_4,
AM_HAL_ADC_SLOT_AVG_8,
AM_HAL_ADC_SLOT_AVG_16,
AM_HAL_ADC_SLOT_AVG_32,
AM_HAL_ADC_SLOT_AVG_64,
AM_HAL_ADC_SLOT_AVG_128

AM_HAL_ADC_SLOT_14BIT,
AM_HAL_ADC_SLOT_12BIT,
AM_HAL_ADC_SLOT_10BIT,
AM_HAL_ADC_SLOT_8BIT

// Single-ended channels
AM_HAL_ADC_SLOT_CHSEL_SE0, (pad 16, ArtemisRB A4)
AM_HAL_ADC_SLOT_CHSEL_SE1, (pad 29, ArtemisRB A0)
AM_HAL_ADC_SLOT_CHSEL_SE2, (pad 11, ArtemisRB A1)
AM_HAL_ADC_SLOT_CHSEL_SE3, (pad 31, ArtemisRB A5)
AM_HAL_ADC_SLOT_CHSEL_SE4, (pad 32, ArtemisRB A8)
AM_HAL_ADC_SLOT_CHSEL_SE5, (pad 33, ArtemisRB A3)
AM_HAL_ADC_SLOT_CHSEL_SE6, (pad 34, ArtemisRB A2)
AM_HAL_ADC_SLOT_CHSEL_SE7, (pad 35, ArtemisRB n/a)
AM_HAL_ADC_SLOT_CHSEL_SE8, (pad 13, ArtemisRB A10)
AM_HAL_ADC_SLOT_CHSEL_SE9, (pad 12, ArtemisRB A9)
// Differential channels.
AM_HAL_ADC_SLOT_CHSEL_DF0, pads 12 (-), pad 13(+)
AM_HAL_ADC_SLOT_CHSEL_DF1, pads 15 (-), pad 14(+) (ArtemisRB n/a)
// Miscellaneous other signals.
AM_HAL_ADC_SLOT_CHSEL_TEMP,
AM_HAL_ADC_SLOT_CHSEL_BATT,
AM_HAL_ADC_SLOT_CHSEL_VSS
*/

if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 0, &ADCSlotConfig))
{
//am_util_stdio_printf("Error - configuring ADC Slot 0 failed.\n");
Serial.println("Error - configuring ADC Slot 0 failed.");
}

// Set up an ADC slot 1
ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF1;
ADCSlotConfig.bWindowCompare = false;
ADCSlotConfig.bEnabled = true;
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 1, &ADCSlotConfig))
{
Serial.println("Error - configuring ADC Slot 0 failed.");
}

// Configure the ADC to use DMA for the sample transfer.
adc_config_dma();

//
am_hal_adc_interrupt_enable(g_ADCHandle, AM_HAL_ADC_INT_DERR | AM_HAL_ADC_INT_DCMP );

// Enable the ADC.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_enable(g_ADCHandle))
{
Serial.println("Error - enabling ADC failed.");
}
}


// Initialize the ADC repetitive sample timer A3.
//*****************************************************************************
void init_timerA3_for_ADC()
{
// Start a timer to trigger the ADC periodically
am_hal_ctimer_config_single(3, AM_HAL_CTIMER_TIMERA,
AM_HAL_CTIMER_HFRC_12MHZ |
AM_HAL_CTIMER_FN_REPEAT |
AM_HAL_CTIMER_INT_ENABLE);

am_hal_ctimer_int_enable(AM_HAL_CTIMER_INT_TIMERA3);

am_hal_ctimer_period_set(3, AM_HAL_CTIMER_TIMERA, 10, 5); //10 tick period, 5 ticks wide

// Enable the timer A3 to trigger the ADC directly
am_hal_ctimer_adc_trigger_enable();

// Start the timer.
am_hal_ctimer_start(3, AM_HAL_CTIMER_TIMERA);
}


void setup() {
Serial.begin(115200);
while (!Serial) {}
Serial.println("2 Channel Hi-speed ADC test");
// Set the clock frequency.
if (AM_HAL_STATUS_SUCCESS != am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 0))
{
Serial.println("Error - configuring the system clock failed.");
}

// Set the default cache configuration and enable it.
if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_config(&am_hal_cachectrl_defaults))
{
Serial.println("Error - configuring the system cache failed.");
}
if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_enable())
{
Serial.println("Error - enabling the system cache failed.");
}

// Configure the board for low power operation.
am_bsp_low_power_init();

// Enable only the first 512KB bank of Flash (0). Disable Flash(1)
if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_FLASH_MIN))
{
Serial.println("Error - configuring the flash memory failed.");
}

// Enable the first 32K of TCM SRAM.
if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_SRAM_32K_DTCM))
{
Serial.println("Error - configuring the SRAM failed.");
}

// Start the ITM interface.
//am_bsp_itm_printf_enable();

// Start the CTIMER A3 for timer-based ADC measurements.
init_timerA3_for_ADC();

// Enable interrupts.
NVIC_EnableIRQ(ADC_IRQn);
am_hal_interrupt_master_enable();

// Set up pins for differential ADC input,
am_hal_gpio_pinconfig(13, AM_HAL_PIN_13_ADCD0PSE8);//pads 12 (-), pad 13(+)
am_hal_gpio_pinconfig(14, AM_HAL_PIN_14_ADCD1P); //pads 15 (-), pad 14(+)

// Configure the ADC
adc_config();

// Trigger the ADC sampling for the first time manually.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
{
Serial.println("Error - triggering the ADC failed.");
}

// Print the banner.
am_util_stdio_terminal_clear();
Serial.println("ADC Example with 1.2Msps and LPMODE=0");

// Allow time for all printing to finish.
am_util_delay_ms(10);

}

void loop() {
// Go to Deep Sleep.
useconds_refresh = micros();
if (!g_bADCDMAComplete)
{
sleep();
}

// Check for DMA errors.
if (g_bADCDMAError)
{
//am_util_stdio_printf("DMA Error occured\n");
Serial.println("DMA Error occured");
while (1);
}

// Check if the ADC DMA completion interrupt occurred.
if (g_bADCDMAComplete)
{
bool toggle = 0;
for (int i = 0; i < ADC_SAMPLE_BUF_SIZE; i++) {
//14 bit is 0-16383 on a range of 0-2V
uint32_t result = g_ui32ADCSampleBuffer;
uint32_t mask = 0xFFFC0; // all ones for bits 6-19, other bits zeroed
//Shift result depending on resolution, averaging
result = result & mask; //get bits 6-19 data only
result = result >> (6); //remove the fractional values

// Serial.println(result);
if (!toggle){
Serial.print(result * (2.0 / 16383.0), 3);
Serial.print(",");
}
else{
Serial.println(result * (2.0 / 16383.0), 3);
}
toggle = !toggle;
}


while (1) {} // stop to view data


// Reset the DMA completion and error flags.
g_bADCDMAComplete = false;

// Re-configure the ADC DMA.
adc_config_dma();

// Clear the ADC interrupts.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, 0xFFFFFFFF))
{
//am_util_stdio_printf("Error - clearing the ADC interrupts failed.\n");
Serial.println("Error - clearing the ADC interrupts failed.");
}

// Trigger the ADC sampling for the first time manually.
if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
{
//am_util_stdio_printf("Error - triggering the ADC failed.\n");
Serial.println("Error - triggering the ADC failed.");
}
}

}
Thanks for your help.
#210654
I sorted it out. It was just an error in closely named constants.
For posterity here's the working code using both differential ADC channels:


Code: Select all
//*****************************************************************************
//
//! @file adc_lpmode0_dma.c
//!
//! @brief This example takes samples with the ADC at high-speed using DMA.
//!
//! Purpose: This example shows the CTIMER-A3 triggering repeated samples of an external
//! input at 1.2Msps in LPMODE0. The example uses the CTIMER-A3 to trigger
//! ADC sampling. Each data point is 8 sample average and is transferred
//! from the ADC FIFO into an SRAM buffer using DMA.

// uses bit-masking to parse out the data

#include "am_bsp.h"


// ADC Sample buffer.
 
#define ADC_SAMPLE_BUF_SIZE (1024) //2channels at 512 samples.  Ch1 and Ch2 alternate in the buffer

uint32_t g_ui32ADCSampleBuffer[ADC_SAMPLE_BUF_SIZE];

unsigned long useconds_refresh;

// ADC Device Handle. Already declared.
//static void *g_ADCHandle;

// ADC DMA complete flag.
volatile bool g_bADCDMAComplete;

// ADC DMA error flag.
volatile bool g_bADCDMAError;

// Define Differential channel 0+
const am_hal_gpio_pincfg_t g_AM_PIN_13_ADCD0PSE8 =
{
  .uFuncSel = AM_HAL_PIN_13_ADCD0PSE8,
};

// Define Differential channel 0-
const am_hal_gpio_pincfg_t g_AM_PIN_12_ADCD0NSE9 =
{
  .uFuncSel = AM_HAL_PIN_12_ADCD0NSE9,
};

// Define Differential channel 1+
const am_hal_gpio_pincfg_t g_AM_PIN_14_ADCD1P =
{
  .uFuncSel = AM_HAL_PIN_14_ADCD1P,
};

// Define Differential channel 1-
const am_hal_gpio_pincfg_t g_AM_PIN_15_ADCD1N =
{
  .uFuncSel = AM_HAL_PIN_15_ADCD1N,
};
// Interrupt handler for the ADC.
//*****************************************************************************
extern "C" void am_adc_isr() //must use 'extern "C" ' for the Artemis
{
  uint32_t ui32IntMask;

  // Read the interrupt status.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_status(g_ADCHandle, &ui32IntMask, false))
  {
    Serial.println("Error reading ADC interrupt status");
  }

  // Clear the ADC interrupt.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, ui32IntMask))
  {
    Serial.println("Error clearing ADC interrupt status");
  }

  // If we got a DMA complete, set the flag.
  if (ui32IntMask & AM_HAL_ADC_INT_DCMP)
  {
    g_bADCDMAComplete = true;
  }

  // If we got a DMA error, set the flag.
  if (ui32IntMask & AM_HAL_ADC_INT_DERR)
  {
    g_bADCDMAError = true;
  }
}

// Set up the core for sleeping, and then go to sleep.
//*****************************************************************************
void sleep()
{
  // Disable things that can't run in sleep mode.
  //#if (0 == ADC_EXAMPLE_DEBUG)
  // am_bsp_debug_printf_disable();
  //#endif

  // Go to Deep Sleep.
  am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);

  // Re-enable peripherals for run mode.
  //#if (0 == ADC_EXAMPLE_DEBUG)
  // am_bsp_debug_printf_enable();
  //#endif

}

// Configure the ADC.
//*****************************************************************************
void adc_config_dma()
{
  am_hal_adc_dma_config_t ADCDMAConfig;

  // Configure the ADC to use DMA for the sample transfer.
  ADCDMAConfig.bDynamicPriority = true;
  ADCDMAConfig.ePriority = AM_HAL_ADC_PRIOR_SERVICE_IMMED;
  ADCDMAConfig.bDMAEnable = true;
  ADCDMAConfig.ui32SampleCount = ADC_SAMPLE_BUF_SIZE;
  ADCDMAConfig.ui32TargetAddress = (uint32_t)g_ui32ADCSampleBuffer;
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_dma(g_ADCHandle, &ADCDMAConfig))
  {
    Serial.println("Error - configuring ADC DMA failed.");
  }
  // Reset the ADC DMA flags.
  g_bADCDMAComplete = false;
  g_bADCDMAError = false;

}


// Configure the ADC.
//*****************************************************************************
void adc_config()
{
  am_hal_adc_config_t ADCConfig;
  am_hal_adc_slot_config_t ADCSlotConfig;

  // Initialize the ADC and get the handle.
  if ( AM_HAL_STATUS_SUCCESS != am_hal_adc_initialize(0, &g_ADCHandle) )
  {
    Serial.println("Error - reservation of the ADC instance failed.");
  }

  // Power on the ADC.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_power_control(g_ADCHandle,
      AM_HAL_SYSCTRL_WAKE,
      false) )
  {
    //am_util_stdio_printf("Error - ADC power on failed.\n");
    Serial.println("Error - ADC power on failed.");
  }

  // Set up the ADC configuration parameters. These settings are reasonable
  // for accurate measurements at a low sample rate.
  ADCConfig.eClock = AM_HAL_ADC_CLKSEL_HFRC;
  ADCConfig.ePolarity = AM_HAL_ADC_TRIGPOL_RISING;
  ADCConfig.eTrigger = AM_HAL_ADC_TRIGSEL_SOFTWARE;
  ADCConfig.eReference = AM_HAL_ADC_REFSEL_INT_2P0;
  /*
    AM_HAL_ADC_REFSEL_INT_2P0,
    AM_HAL_ADC_REFSEL_INT_1P5,
    AM_HAL_ADC_REFSEL_EXT_2P0,
    AM_HAL_ADC_REFSEL_EXT_1P5
  */
  ADCConfig.eClockMode = AM_HAL_ADC_CLKMODE_LOW_LATENCY;
  ADCConfig.ePowerMode = AM_HAL_ADC_LPMODE0;
  ADCConfig.eRepeat = AM_HAL_ADC_REPEATING_SCAN; //AM_HAL_ADC_SINGLE_SCAN
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure(g_ADCHandle, &ADCConfig))
  {
    //am_util_stdio_printf("Error - configuring ADC failed.\n");
    Serial.println("Error - configuring ADC failed.");
  }

  // Set up an ADC slot 0
  ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
  ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
  ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF0;
  ADCSlotConfig.bWindowCompare = false;
  ADCSlotConfig.bEnabled = true;
  /*
    AM_HAL_ADC_SLOT_AVG_1,
    AM_HAL_ADC_SLOT_AVG_2,
    AM_HAL_ADC_SLOT_AVG_4,
    AM_HAL_ADC_SLOT_AVG_8,
    AM_HAL_ADC_SLOT_AVG_16,
    AM_HAL_ADC_SLOT_AVG_32,
    AM_HAL_ADC_SLOT_AVG_64,
    AM_HAL_ADC_SLOT_AVG_128

    AM_HAL_ADC_SLOT_14BIT,
    AM_HAL_ADC_SLOT_12BIT,
    AM_HAL_ADC_SLOT_10BIT,
    AM_HAL_ADC_SLOT_8BIT

    // Single-ended channels
    AM_HAL_ADC_SLOT_CHSEL_SE0, (pad 16, ArtemisRB A4)
    AM_HAL_ADC_SLOT_CHSEL_SE1, (pad 29, ArtemisRB A0)
    AM_HAL_ADC_SLOT_CHSEL_SE2, (pad 11, ArtemisRB A1)
    AM_HAL_ADC_SLOT_CHSEL_SE3, (pad 31, ArtemisRB A5)
    AM_HAL_ADC_SLOT_CHSEL_SE4, (pad 32, ArtemisRB A8)
    AM_HAL_ADC_SLOT_CHSEL_SE5, (pad 33, ArtemisRB A3)
    AM_HAL_ADC_SLOT_CHSEL_SE6, (pad 34, ArtemisRB A2)
    AM_HAL_ADC_SLOT_CHSEL_SE7, (pad 35, ArtemisRB n/a)
    AM_HAL_ADC_SLOT_CHSEL_SE8, (pad 13, ArtemisRB A10)
    AM_HAL_ADC_SLOT_CHSEL_SE9, (pad 12, ArtemisRB A9)
    // Differential channels.
    AM_HAL_ADC_SLOT_CHSEL_DF0, pads 12 (-), pad 13(+)
    AM_HAL_ADC_SLOT_CHSEL_DF1, pads 15 (-), pad 14(+) (ArtemisRB n/a)
    // Miscellaneous other signals.
    AM_HAL_ADC_SLOT_CHSEL_TEMP,
    AM_HAL_ADC_SLOT_CHSEL_BATT,
    AM_HAL_ADC_SLOT_CHSEL_VSS
  */

  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 0, &ADCSlotConfig))
  {
    //am_util_stdio_printf("Error - configuring ADC Slot 0 failed.\n");
    Serial.println("Error - configuring ADC Slot 0 failed.");
  }

  // Set up an ADC slot 1
  ADCSlotConfig.eMeasToAvg = AM_HAL_ADC_SLOT_AVG_1;
  ADCSlotConfig.ePrecisionMode = AM_HAL_ADC_SLOT_14BIT;
  ADCSlotConfig.eChannel = AM_HAL_ADC_SLOT_CHSEL_DF1;  
  ADCSlotConfig.bWindowCompare = false;
  ADCSlotConfig.bEnabled = true;
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_configure_slot(g_ADCHandle, 1, &ADCSlotConfig))
  {
    Serial.println("Error - configuring ADC Slot 0 failed.");
  }

  // Configure the ADC to use DMA for the sample transfer.
  adc_config_dma();
  
  //
  am_hal_adc_interrupt_enable(g_ADCHandle, AM_HAL_ADC_INT_DERR | AM_HAL_ADC_INT_DCMP );

  // Enable the ADC.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_enable(g_ADCHandle))
  {
    Serial.println("Error - enabling ADC failed.");
  }
}


// Initialize the ADC repetitive sample timer A3.
//*****************************************************************************
void init_timerA3_for_ADC()
{
  // Start a timer to trigger the ADC periodically 
  am_hal_ctimer_config_single(3, AM_HAL_CTIMER_TIMERA,
                              AM_HAL_CTIMER_HFRC_12MHZ |
                              AM_HAL_CTIMER_FN_REPEAT |
                              AM_HAL_CTIMER_INT_ENABLE);

  am_hal_ctimer_int_enable(AM_HAL_CTIMER_INT_TIMERA3);

  am_hal_ctimer_period_set(3, AM_HAL_CTIMER_TIMERA, 10, 5); //10 tick period, 5 ticks wide

  // Enable the timer A3 to trigger the ADC directly
  am_hal_ctimer_adc_trigger_enable();

  // Start the timer.
  am_hal_ctimer_start(3, AM_HAL_CTIMER_TIMERA);
}


void setup() {
  Serial.begin(115200);
  while (!Serial) {}
  Serial.println("2 Channel Hi-speed ADC test");
  // Set the clock frequency.
  if (AM_HAL_STATUS_SUCCESS != am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 0))
  {
    Serial.println("Error - configuring the system clock failed.");
  }

  // Set the default cache configuration and enable it.
  if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_config(&am_hal_cachectrl_defaults))
  {
    Serial.println("Error - configuring the system cache failed.");
  }
  if (AM_HAL_STATUS_SUCCESS != am_hal_cachectrl_enable())
  {
    Serial.println("Error - enabling the system cache failed.");
  }

  // Configure the board for low power operation.
  am_bsp_low_power_init();

  // Enable only the first 512KB bank of Flash (0). Disable Flash(1)
  if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_FLASH_MIN))
  {
    Serial.println("Error - configuring the flash memory failed.");
  }

  // Enable the first 32K of TCM SRAM.
  if (AM_HAL_STATUS_SUCCESS != am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEM_SRAM_32K_DTCM))
  {
    Serial.println("Error - configuring the SRAM failed.");
  }

  // Start the ITM interface.
  //am_bsp_itm_printf_enable();

  // Start the CTIMER A3 for timer-based ADC measurements.
  init_timerA3_for_ADC();

  // Enable interrupts.
  NVIC_EnableIRQ(ADC_IRQn);
  am_hal_interrupt_master_enable();

  // Set up pins for differential ADC input,
  am_hal_gpio_pinconfig(13, g_AM_PIN_13_ADCD0PSE8);//pads 12 (-), pad 13(+)   
   am_hal_gpio_pinconfig(12, g_AM_PIN_12_ADCD0NSE9);
   am_hal_gpio_pinconfig(14, g_AM_PIN_14_ADCD1P); //pads 15 (-), pad 14(+)
   am_hal_gpio_pinconfig(15, g_AM_PIN_15_ADCD1N); 

  // Configure the ADC
  adc_config();

  // Trigger the ADC sampling for the first time manually.
  if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
  {
    Serial.println("Error - triggering the ADC failed.");
  }

  // Print the banner.
  am_util_stdio_terminal_clear();
  Serial.println("ADC Example with 1.2Msps and LPMODE=0");

  // Allow time for all printing to finish.
  am_util_delay_ms(10);

}

void loop() {
  // Go to Deep Sleep.
  useconds_refresh = micros();
  if (!g_bADCDMAComplete)
  {
    sleep();
  }

  // Check for DMA errors.
  if (g_bADCDMAError)
  {
    //am_util_stdio_printf("DMA Error occured\n");
    Serial.println("DMA Error occured");
    while (1);
  }

  // Check if the ADC DMA completion interrupt occurred.
  if (g_bADCDMAComplete)
  { 
    bool toggle = 0;
    for (int i = 0; i < ADC_SAMPLE_BUF_SIZE; i++) {
      //14 bit is 0-16383 on a range of 0-2V
      uint32_t result = g_ui32ADCSampleBuffer[i];
      uint32_t mask = 0xFFFC0;  // all ones for bits 6-19, other bits zeroed
      //Shift result depending on resolution, averaging
      result = result & mask; //get bits 6-19 data only
      result = result >> (6); //remove the fractional values

      // Serial.println(result);
      if (!toggle){
      Serial.print(result * (2.0 / 16383.0), 3);
      Serial.print(",");      
      }
      else{
        Serial.println(result * (2.0 / 16383.0), 3);
      }
      toggle = !toggle;
    }
    
    
    while (1) {}  // stop to view data


    // Reset the DMA completion and error flags.
    g_bADCDMAComplete = false;

    // Re-configure the ADC DMA.
    adc_config_dma();

    // Clear the ADC interrupts.
    if (AM_HAL_STATUS_SUCCESS != am_hal_adc_interrupt_clear(g_ADCHandle, 0xFFFFFFFF))
    {
      //am_util_stdio_printf("Error - clearing the ADC interrupts failed.\n");
      Serial.println("Error - clearing the ADC interrupts failed.");
    }

    // Trigger the ADC sampling for the first time manually.
    if (AM_HAL_STATUS_SUCCESS != am_hal_adc_sw_trigger(g_ADCHandle))
    {
      //am_util_stdio_printf("Error - triggering the ADC failed.\n");
      Serial.println("Error - triggering the ADC failed.");
    }
  } 

}
 Topic permissions

You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum