///< Initializes ADC (configures Pins, starts Clock, sets defaults) void adc_int_init(uint32_t adc_frequency, uint8_t reference_source) { ///< Assign and enable GPIO pins to the ADC function. gpio_enable_module(ADCIFA_GPIO_MAP, sizeof(ADCIFA_GPIO_MAP) / sizeof(ADCIFA_GPIO_MAP[0])); adc_config_options.frequency=adc_frequency; adc_config_options.reference_source=reference_source; ////</ Get ADCIFA Factory Configuration adcifa_get_calibration_data(adcifa, (adcifa_opt_t *)&adc_config_options); if ((uint16_t)adc_config_options.offset_calibration_value == 0xFFFF) { ///< Set default calibration if Engineering samples and part is not programmed adc_config_options.offset_calibration_value = 0x3B; adc_config_options.gain_calibration_value = 0x4210; adc_config_options.sh0_calibration_value = 0x210; adc_config_options.sh1_calibration_value = 0x210; } adc_config_options.offset_calibration_value = 0x3B; ///< offset correction ///< Configure ADCIFA core adcifa_configure(adcifa, (adcifa_opt_t *)&adc_config_options, sysclk_get_peripheral_bus_hz((const volatile void *)AVR32_ADCIFA_ADDRESS)); adc_int_clear_sequencer(); continuous_mode=false; ///< Configure ADCIFA sequencer 1 //adcifa_configure_sequencer(adcifa, 1, &adcifa_sequence_opt, adcifa_sequencer1_conversion_opt); adcifa_disable_interrupt(adcifa, 0xffffffff); INTC_register_interrupt( (__int_handler) &process_data, AVR32_ADCIFA_SEQUENCER0_IRQ, AVR32_INTC_INT1); //INTC_register_interrupt( (__int_handler) &process_data, AVR32_ADCIFA_SEQUENCER1_IRQ, AVR32_INTC_INT1); //int32_t period_us=1000000 / samplingrate; }
/** * This ISR is executed if the window 1 or window 2 or both of the window * conditions are reached. */ ISR(ADCIFA_interrupt_handler, AVR32_ADCIFA_IRQ_GROUP, ADC_INTERRUPT_PRIORITY) { /* Window Monitor 0 */ if(ADCIFA_is_window_0_set()) { window1 = true; /* Acknowledge the Interrupt */ ADCIFA_clear_window_0(); /* Disable the Interrupt */ adcifa_disable_interrupt(&AVR32_ADCIFA,AVR32_ADCIFA_IDR_WM0_MASK); } /* Window Monitor 1 */ if(ADCIFA_is_window_1_set()) { window2 = true; /* Acknowledge the Interrupt */ ADCIFA_clear_window_1(); /* Disable the Interrupt */ adcifa_disable_interrupt(&AVR32_ADCIFA,AVR32_ADCIFA_IDR_WM1_MASK); } }
static void process_data(void) { int32_t ch; volatile int16_t value; if (sample_counter>=number_of_samples) { if (continuous_mode) { sample_counter=0; oversampling_counter=0; } else { adcifa_disable_interrupt(adcifa, ADC_INT_SEOS0); //adcifa_disable_interrupt(adcifa, ADC_INT_SEOS1); adcifa_stop_itimer(adcifa); } } else { if ((adcifa->sr&ADC_INT_SEOS0) ==0) {} //|| ((adcifa->sr&ADC_INT_SEOS1) ==0) ) {} else { adc_int_period=(time_keeper_get_time_ticks() - last_adc_int_time); last_adc_int_time=time_keeper_get_time_ticks(); if (sample_counter>=0) { if (oversampling_counter<=0) { for (ch=0; ch<sequencer_item_count; ch++) { value=adcifa->resx[ch]; internal_buffer[ch]= value ; } } else { for (ch=0; ch<sequencer_item_count; ch++) { value=adcifa->resx[ch]; internal_buffer[ch]+= value ; //adci_buffer[ch][even_odd][sample_counter]+=value; } } } else { sample_counter++; return; } //if (function_generator!= NULL) { // dac_dma_set_value((*function_generator)(sample_counter)); //} oversampling_counter++; if (oversampling_counter >= oversampling) { oversampling_counter=0; for (ch=0; ch<channel_count; ch++) { int16_t *buffer = adci_buffer[ch]; buffer[sample_counter] = internal_buffer[ch] / oversampling_divider; } sample_counter++; } //dac_dma_set_value(even_odd * 400); ///< acknowledge processing finished adcifa->scr=ADC_INT_SEOS0 | ADC_INT_SEOS1; } } }