/** * \brief Write configuration to ADC module * * Disables the ADC and flushes its pipeline before writing the specified * configuration and factory calibration value to it. If the ADC was enabled * upon entry of the function, it is enabled upon function return. * * \param adc Pointer to ADC module. * \param conf Pointer to ADC module configuration. */ void adc_write_configuration(ADC_t *adc, const struct adc_config *conf) { uint16_t cal; uint8_t enable; irqflags_t flags; #ifdef ADCA if ((uintptr_t)adc == (uintptr_t)&ADCA) { cal = adc_get_calibration_data(ADC_CAL_ADCA); } else #endif { Assert(0); return; } flags = cpu_irq_save(); adc_enable_clock(adc); enable = adc->CTRLA & ADC_ENABLE_bm; adc->CTRLA = ADC_FLUSH_bm; adc->CAL = cal; adc->CMP = conf->cmp; adc->REFCTRL = conf->refctrl; adc->PRESCALER = conf->prescaler; adc->EVCTRL = conf->evctrl; adc->CTRLB = conf->ctrlb; adc->SAMPCTRL = conf->sampctrl; adc->CTRLA = enable; adc_disable_clock(adc); cpu_irq_restore(flags); }
int main(void) { struct adc_config adc_conf; struct adc_channel_config adcch_conf; board_init(); sysclk_init(); sleepmgr_init(); irq_initialize_vectors(); cpu_irq_enable(); // Initialize configuration structures. adc_read_configuration(&ADCA, &adc_conf); adcch_read_configuration(&ADCA, ADC_CH0, &adcch_conf); /* Configure the ADC module: * - unsigned, 12-bit results * - bandgap (1 V) voltage reference * - 200 kHz maximum clock rate * - manual conversion triggering * - temperature sensor enabled * - callback function */ adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_BANDGAP); adc_set_clock_rate(&adc_conf, 200000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_enable_internal_input(&adc_conf, ADC_INT_TEMPSENSE); adc_write_configuration(&ADCA, &adc_conf); adc_set_callback(&ADCA, &adc_handler); /* Configure ADC channel 0: * - single-ended measurement from temperature sensor * - interrupt flag set on completed conversion * - interrupts disabled */ adcch_set_input(&adcch_conf, ADCCH_POS_TEMPSENSE, ADCCH_NEG_NONE, 1); adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_enable_interrupt(&adcch_conf); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); // Get measurement for 85 degrees C (358 kelvin) from calibration data. tempsense = adc_get_calibration_data(ADC_CAL_TEMPSENSE); // Enable the ADC and start the first conversion. adc_enable(&ADCA); adc_start_conversion(&ADCA, ADC_CH0); do { // Sleep until ADC interrupt triggers. sleepmgr_enter_sleep(); } while (1); }
void owltemp_init() { struct adc_config adc_conf; struct adc_channel_config adcch_conf; // Clear the configuration structures. memset(&adc_conf, 0, sizeof(struct adc_config)); memset(&adcch_conf, 0, sizeof(struct adc_channel_config)); /* Configure the ADC module: * - unsigned, 12-bit results * - bandgap (1 V) voltage reference * - 200 kHz maximum clock rate * - manual conversion triggering * - temperature sensor enabled * - callback function */ adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_BANDGAP); adc_set_clock_rate(&adc_conf, 200000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 0, 0); adc_enable_internal_input(&adc_conf, ADC_INT_TEMPSENSE); adc_write_configuration(&ADCA, &adc_conf); adc_set_callback(&ADCA, &adc_handler); /* Configure ADC channel 0: * - single-ended measurement from temperature sensor * - interrupt flag set on completed conversion * - interrupts disabled */ adcch_set_input(&adcch_conf, ADCCH_POS_TEMPSENSE, ADCCH_NEG_NONE, 1); adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_enable_interrupt(&adcch_conf); adcch_write_configuration(&ADCA, 0, &adcch_conf); // Get measurement for 85 degrees C (358 kelvin) from calibration data. tempsense = adc_get_calibration_data(ADC_CAL_TEMPSENSE); // Enable the ADC and start the first conversion. adc_enable(&ADCA); adc_start_conversion(&ADCA, ADC_CH0); }
void ADCA_init(void) { struct adc_config adca_conf; struct adc_channel_config adca_ch_conf; // //// Initialize configuration structures. //adc_read_configuration(&ADCB, &adcb_conf); // ///* Configure the ADC module: //* - unsigned, 12-bit results //* - AREFA voltage reference //* - 8000 kHz clock rate //* - FreeRun Mode //*/ adc_get_calibration_data(ADC_CAL_ADCA); adc_set_conversion_parameters(&adca_conf,ADC_SIGN_OFF,ADC_RES_12,ADC_REF_AREFA); adc_set_clock_rate(&adca_conf,125000UL); adc_set_conversion_trigger(&adca_conf,ADC_TRIG_FREERUN_SWEEP,1,0); // adc_set_config_compare_value(adcb_conf,KCK_MAX_CHARGE_AMP); adc_write_configuration(&ADCA,&adca_conf); // ///* Configure ADC channel 0: //* - Input: ADCB4 //* - interrupts disable //*/ adcch_read_configuration(&ADCA,1, &adca_ch_conf); adcch_set_input(&adca_ch_conf,ADCCH_POS_PIN3,ADCCH_NEG_NONE,ADC_CH_GAIN_1X_gc); adcch_write_configuration(&ADCA,1,&adca_ch_conf); ///* Configure ADC channel 1: darim az channel 0 estefade mikonim ehtemalan! //* - Input: ADCB5 //* - Set Interrupt Mode: Below the threshold //* - interrupts disable ////*/ //adcch_read_configuration(&ADCA,1, &adca_ch_conf); //adcch_set_input(&adcb_ch_conf,ADCCH_POS_PIN5,ADCCH_NEG_NONE,ADC_CH_GAIN_1X_gc); ////adcch_set_interrupt_mode(&adcb_ch_conf,ADCCH_MODE_ABOVE); ////adcch_enable_interrupt(&adcb_ch_conf); //adcch_write_configuration(&ADCA,1,&adca_ch_conf); // ///* Configure ADC channel 2: //* - Input: ADCB6 //* - interrupts disable //*/ //adcch_read_configuration(&ADCB,2, &adcb_ch_conf); //adcch_set_input(&adcb_ch_conf,ADCCH_POS_PIN6,ADCCH_NEG_NONE,ADC_CH_GAIN_1X_gc); ////adcch_disable_interrupt(&adcb_ch_conf); //adcch_write_configuration(&ADCB,2,&adcb_ch_conf); //// ///* Configure ADC channel 3: //* - Input: ADCB7 //* - interrupts disable //*/ //adcch_read_configuration(&ADCB,3, &adcb_ch_conf); //adcch_set_input(&adcb_ch_conf,ADCCH_POS_PIN7,ADCCH_NEG_NONE,ADC_CH_GAIN_1X_gc); //adcch_set_interrupt_mode(&adcb_ch_conf,ADCCH_MODE_ABOVE); //adcch_enable_interrupt(&adcb_ch_conf); //adcch_write_configuration(&ADCB,3,&adcb_ch_conf); // adc_enable(&ADCA); adc_start_conversion(&ADCA,ADC_CH0); //adc_start_conversion(&ADCB,ADC_CH1); //adc_start_conversion(&ADCB,ADC_CH2); ////adc_start_conversion(&ADCB,ADC_CH3); }