コード例 #1
0
ファイル: adc_int.c プロジェクト: JohsBL/MobRob
///< 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;
}
コード例 #2
0
ファイル: adcifa_example.c プロジェクト: kerichsen/asf
/**
 * 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);
	}
}
コード例 #3
0
ファイル: adc_int.c プロジェクト: JohsBL/MobRob
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;
		}
	}
}