/** * \brief Configure the ADC for DAC calibration */ static void configure_adc(void) { struct adc_config adc_conf; struct adc_channel_config adcch_conf; adc_read_configuration(&CALIBRATION_ADC, &adc_conf); adcch_read_configuration(&CALIBRATION_ADC, ADC_CH_TO_DAC_CH0, &adcch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_VCC); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 2, 0); adc_set_clock_rate(&adc_conf, 62500UL); adcch_set_input(&adcch_conf, ADCCH_POS_PIN1, ADCCH_NEG_PIN1, 1); adc_write_configuration(&CALIBRATION_ADC, &adc_conf); adcch_write_configuration(&CALIBRATION_ADC, ADC_CH_TO_DAC_CH0, &adcch_conf); /* Find the offset of the ADC */ adc_enable(&CALIBRATION_ADC); adc_offset = adc_get_sample_avg(ADC_CH_TO_DAC_CH0, 128); adc_disable(&CALIBRATION_ADC); /* Switch input to the DAC output pin PB3, i.e. ADC pin 11 */ adcch_set_input(&adcch_conf, ADCCH_POS_PIN10, ADCCH_NEG_PAD_GND, 1); adcch_write_configuration(&CALIBRATION_ADC, ADC_CH_TO_DAC_CH0, &adcch_conf); adcch_set_input(&adcch_conf, ADCCH_POS_PIN11, ADCCH_NEG_PAD_GND, 1); adcch_write_configuration(&CALIBRATION_ADC, ADC_CH_TO_DAC_CH1, &adcch_conf); adc_enable(&CALIBRATION_ADC); }
void adcInit() { struct adc_config adc_conf; struct adc_channel_config adc_ch_conf; /* Clear the ADC configuration structs */ adc_read_configuration(&ADCA, &adc_conf); adcch_read_configuration(&ADCA, ADC_CH0, &adc_ch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_VCC); adc_set_clock_rate(&adc_conf, 100000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 0, 0); adc_write_configuration(&ADCA, &adc_conf); //adc_set_callback(&ADCA, &adc_handler); adcch_set_input(&adc_ch_conf, ADCCH_POS_PIN0, ADCCH_NEG_PIN5, 1); //adcch_set_interrupt_mode(&adc_ch_conf, ADCCH_MODE_COMPLETE); //adcch_enable_interrupt(&adc_ch_conf); adcch_write_configuration(&ADCA, ADC_CH1, &adc_ch_conf); adcch_set_input(&adc_ch_conf, ADCCH_POS_PIN0, ADCCH_NEG_PIN6, 1); adcch_write_configuration(&ADCA, ADC_CH0, &adc_ch_conf); adc_enable(&ADCA); }
/** * \brief Initialize ADC * * Here the averaging feature is disabled. */ static void main_adc_init(void) { /* ADC module configuration structure */ struct adc_config adc_conf; /* ADC channel configuration structure */ struct adc_channel_config adcch_conf; /* Configure the ADC module: * - unsigned, more than 12-bit results * - VCC /2 voltage reference * - 200 kHz maximum clock rate * - freerun conversion triggering * - enabled internal temperature sensor */ adc_read_configuration(&ADCA, &adc_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_VCCDIV2); adc_set_clock_rate(&adc_conf, 200000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_FREERUN, 1, 0); adc_enable_internal_input(&adc_conf, ADC_INT_TEMPSENSE); adc_write_configuration(&ADCA, &adc_conf); /* Configure ADC channel 0: * - single-ended measurement from temperature sensor * - interrupt flag set on completed conversion */ adcch_read_configuration(&ADCA, ADC_CH0, &adcch_conf); adcch_set_input(&adcch_conf, ADCCH_POS_TEMPSENSE, ADCCH_NEG_NONE, 1); adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_disable_interrupt(&adcch_conf); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); /* Enable ADC which starts the freerun conversion.*/ adc_enable(&ADCA); }
/** * \brief Callback function for ADC interrupts * * \param adc Pointer to ADC module. * \param channel ADC channel number. * \param result Conversion result from ADC channel. */ static void adc_handler(ADC_t *adc, uint8_t channel, adc_result_t result) { switch (adc_conv[adc_mux_index].in) { case EXT_VIN_ADC_INPUT: ext_voltage=result; adc_mux_index++; //start new measurement adc_disable(&EXT_VIN_ADC_MODULE); adc_set_conversion_parameters(&adc_conf ,ADC_SIGN_OFF ,ADC_RES_12 ,adc_conv[adc_mux_index].ref); adc_write_configuration( &POTENTIOMETER_ADC_MODULE , &adc_conf); adc_enable(&POTENTIOMETER_ADC_MODULE); adcch_set_input(&adcch_conf ,adc_conv[adc_mux_index].in ,ADCCH_NEG_NONE,1); adcch_write_configuration( &POTENTIOMETER_ADC_MODULE , ADC_CH0, &adcch_conf); adc_start_conversion(&POTENTIOMETER_ADC_MODULE , ADC_CH0); break; case POTENTIOMETER_ADC_INPUT: potentiometer=result; break; default: break; } }
/** * \brief Initialize ADC and DAC used to simulate a temperature sensor * * DACB is used by the simulation plant to output a temperature reading of the * oven plate. It is set up to output a voltage on pin B2 which is marked as * ADC2 on header J2. * * ADCA is used in the control step and graphical interface to show the current * temperature of the oven plate. It is set up to read a voltage on pin A4 which * is marked as ADC4 on header J2. * * ADC2 and ADC4 should be connected together, so that the ADC samples the DAC * directly. */ void main_init_adc_dac(void) { struct adc_config adc_conf; struct adc_channel_config adcch_conf; struct dac_config dac_conf; /* Set up the DAC for the simulation to output "real" temperature */ dac_read_configuration(&DACB, &dac_conf); dac_set_conversion_parameters(&dac_conf, DAC_REF_BANDGAP, DAC_ADJ_RIGHT); dac_set_active_channel(&dac_conf, DAC_CH0, 0); dac_write_configuration(&DACB, &dac_conf); dac_enable(&DACB); /* Set up the ADC for the controller to read "real" temperature */ adc_read_configuration(&ADCA, &adc_conf); adcch_read_configuration(&ADCA, ADC_CH0, &adcch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_BANDGAP); adc_set_clock_rate(&adc_conf, 20000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_write_configuration(&ADCA, &adc_conf); adcch_set_input(&adcch_conf, ADCCH_POS_PIN4, ADCCH_NEG_NONE, 1); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); adc_enable(&ADCA); adc_start_conversion(&ADCA, ADC_CH0); /* Enable pull-down, so an open circuit can be detected */ ioport_set_pin_dir(J2_PIN4, IOPORT_DIR_INPUT); ioport_set_pin_mode(J2_PIN4, IOPORT_MODE_PULLDOWN); }
int adc_init(void) { /* Offset Measurement*/ /* struct adc_config adc_conf; struct adc_channel_config adcch_conf; adc_read_configuration(&MY_ADC, &adc_conf); adcch_read_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_AREFA); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_set_clock_rate(&adc_conf, 62500UL); adcch_set_input(&adcch_conf, ADCCH_POS_PIN4, ADCCH_NEG_PIN4, 1); adc_write_configuration(&MY_ADC, &adc_conf); adcch_write_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf); adc_enable(&MY_ADC); */ /* Normal Measurement*/ struct adc_config adc_conf; struct adc_channel_config adcch_conf; adc_read_configuration(&MY_ADC, &adc_conf); adcch_read_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_AREFA); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_set_clock_rate(&adc_conf, 62500UL); adcch_set_input(&adcch_conf, ADCCH_POS_PIN4, ADCCH_NEG_NONE, 1); //PAD_GND adc_write_configuration(&MY_ADC, &adc_conf); adcch_write_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf); adc_enable(&MY_ADC); return 0; }
/** * \brief Start the next convertion according to \ref adc_mux_index index */ static void app_sampling_start_next_conversion(void) { /* Setup ADC to start next one */ adcch_set_input(&adcch_conf, adc_conv[adc_mux_index], ADCCH_NEG_INTERNAL_GND, 0); adcch_write_configuration(&LIGHT_SENSOR_ADC_MODULE, ADC_CH0, &adcch_conf); adc_start_conversion(&LIGHT_SENSOR_ADC_MODULE, ADC_CH0); }
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(); gfx_mono_init(); // Enable back light of display ioport_set_pin_high(LCD_BACKLIGHT_ENABLE_PIN); // 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 * - VCC voltage reference * - 200 kHz maximum clock rate * - manual conversion triggering * - temperature sensor enabled * - callback function */ adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_VCC); 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_PIN1, 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); // 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); }
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); }
/** * \brief Timer Counter Overflow interrupt callback function * * This function is called when an overflow interrupt has occurred on * TCC0. */ static void tcc0_ovf_interrupt_callback(void) { adc_mux_index=0; adc_disable(&EXT_VIN_ADC_MODULE); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12 ,adc_conv[adc_mux_index].ref); adc_write_configuration(&EXT_VIN_ADC_MODULE, &adc_conf); adc_enable(&EXT_VIN_ADC_MODULE); adcch_set_input(&adcch_conf, adc_conv[adc_mux_index].in , ADCCH_NEG_NONE,1); adcch_write_configuration(&EXT_VIN_ADC_MODULE, ADC_CH0, &adcch_conf); adc_start_conversion(&EXT_VIN_ADC_MODULE, ADC_CH0); }
void ADC_init_funct(void) { struct adc_config adc_conf; struct adc_channel_config adcch_conf; adc_read_configuration(&MY_ADC, &adc_conf); adcch_read_configuration(&MY_ADC, CAP_ADC, &adcch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12,ADC_REF_VCC); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_set_clock_rate(&adc_conf, 100000); adcch_set_input(&adcch_conf, ADCCH_POS_PIN3, ADCCH_NEG_NONE, 1); adc_write_configuration(&MY_ADC, &adc_conf); adcch_write_configuration(&MY_ADC, CAP_ADC, &adcch_conf); adc_enable (&MY_ADC); }
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); }
static void adc_init(void) { struct adc_config adc_conf; struct adc_channel_config adcch_conf; adc_read_configuration(&MY_ADC, &adc_conf); adcch_read_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_AREFA); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_set_clock_rate(&adc_conf, 200000UL); adcch_set_input(&adcch_conf, ADCCH_POS_PIN1, ADCCH_NEG_NONE, 1); adc_write_configuration(&MY_ADC, &adc_conf); adcch_write_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf); adc_enable(&MY_ADC); adc_start_conversion(&MY_ADC, MY_ADC_CH); }
/** * \brief Initialize ADC */ static void main_adc_init(void) { /* ADC module configuration structure */ struct adc_config adc_conf; /* ADC channel configuration structure */ struct adc_channel_config adcch_conf; /* Configure the ADC module: * - signed, 12-bit results * - voltage reference = VCC / 1.6 = 3.3V / 1.6 * - 200 kHz maximum clock rate * - manual conversion triggering */ adc_read_configuration(&ADCA, &adc_conf); /* Initialize structures. */ adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_VCC); adc_set_clock_rate(&adc_conf, 200000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_write_configuration(&ADCA, &adc_conf); /* Configure ADC channel: * - differential measurement mode * - Input voltage V+ is ADC2 pin (PA2 pin) * - Input voltage V- is ADC3 pin (PA3 pin) * - 1x gain * - interrupt flag set on completed conversion */ adcch_read_configuration(&ADCA, ADC_CH0, &adcch_conf); adcch_set_input(&adcch_conf, ADCCH_POS_PIN2, ADCCH_NEG_PIN3, 1); adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_disable_interrupt(&adcch_conf); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); /* Enable ADC */ adc_enable(&ADCA); /* Do useful conversion */ adc_start_conversion(&ADCA, ADC_CH0); adc_wait_for_interrupt_flag(&ADCA, ADC_CH0); }
/** * \internal * \brief Measure differential input MUX combinations on channel * * Measures a set of input MUX combinations on a single channel, using averaging * of the number of samples specified with \ref NUM_AVERAGE_SAMPLES. * * \pre This function does not configure the ADC, only the ADC channel, and * therefore the specified ADC needs to be configured before this function * is run. * * \param adc Pointer to ADC to measure with. * \param ch_mask Mask for channel to measure with. * \param mux_pos_inputs Pointer to array of positive input MUX settings. * \param mux_neg_inputs Pointer to array of negative input MUX settings. * \param num_inputs Number of input MUX setting pairs. * \param results Pointer to array to store results in. * \param gain Gain to use for all measurements. * * \note The array which \e results points to must have at least \e num_inputs * elements. */ static void differential_signed_average(ADC_t *adc, uint8_t ch_mask, const uint8_t *mux_pos_inputs, const uint8_t *mux_neg_inputs, uint8_t num_inputs, int16_t *results, uint8_t gain) { struct adc_channel_config adcch_conf; uint8_t input; uint8_t i; int32_t sum; memset(&adcch_conf, 0, sizeof(struct adc_channel_config)); // Common configuration adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_disable_interrupt(&adcch_conf); for (input = 0; input < num_inputs; input++) { adcch_set_input(&adcch_conf, mux_pos_inputs[input], mux_neg_inputs[input], gain); adcch_write_configuration(adc, ch_mask, &adcch_conf); // Enable and do dummy conversion adc_enable(adc); adc_start_conversion(adc, ch_mask); adc_wait_for_interrupt_flag(adc, ch_mask); // Read an average sum = 0; for (i = 0; i < NUM_AVERAGE_SAMPLES; i++) { adc_start_conversion(adc, ch_mask); adc_wait_for_interrupt_flag(adc, ch_mask); sum += (int16_t)adc_get_result(adc, ch_mask); } adc_disable(adc); results[input] = sum / NUM_AVERAGE_SAMPLES; } }
void app_sampling_init(void) { /* QDec configuration */ qdec_get_config_defaults(&qdec_config); qdec_config_phase_pins(&qdec_config, &PORTA, 6, false, 500); qdec_config_enable_rotary(&qdec_config); qdec_config_tc(&qdec_config, &TCC5); qdec_config_revolution(&qdec_config, 40); qdec_enabled(&qdec_config); /* ! ADC module configuration */ struct adc_config adc_conf; /* Configure the ADC module: * - signed, 12-bit results * - VCC reference * - 200 kHz maximum clock rate * - manual conversion triggering * - callback function */ adc_read_configuration(&LIGHT_SENSOR_ADC_MODULE, &adc_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_VCC); adc_set_clock_rate(&adc_conf, 200000); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_write_configuration(&LIGHT_SENSOR_ADC_MODULE, &adc_conf); adc_set_callback(&LIGHT_SENSOR_ADC_MODULE, &app_sampling_handler); adc_enable(&LIGHT_SENSOR_ADC_MODULE); /* Configure ADC A channel 0 for light and NTC sensors. * - differantial measurement (V- linked on internal GND) * - gain x0.5 * - interrupt flag set on completed conversion * - interrupts enabled */ adcch_read_configuration(&LIGHT_SENSOR_ADC_MODULE, ADC_CH0, &adcch_conf); adcch_set_input(&adcch_conf, LIGHT_SENSOR_ADC_INPUT, ADCCH_NEG_INTERNAL_GND, 0); adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_enable_interrupt(&adcch_conf); adcch_write_configuration(&LIGHT_SENSOR_ADC_MODULE, ADC_CH0, &adcch_conf); fifo_init(&app_sampling_fifo_desc, app_sampling_fifo_buffer, APP_SAMPLING_FIFO_SIZE); rtc_set_callback(&app_sampling_start); /* Display background */ gfx_mono_draw_line(DISPLAY_SAMPLING_TEXT_POS_X - 3, 0, DISPLAY_SAMPLING_TEXT_POS_X - 3, 32, GFX_PIXEL_SET); app_sampling_display_rate(); gfx_mono_draw_string(DISPLAY_LIGHT_TEXT, DISPLAY_LIGHT_TEXT_POS_X, DISPLAY_LIGHT_TEXT_POS_Y, &sysfont); gfx_mono_draw_filled_rect( DISPLAY_LIGHT_PROBAR_START_POS_X, DISPLAY_LIGHT_PROBAR_START_POS_Y, DISPLAY_LIGHT_PROBAR_START_SIZE_X, DISPLAY_LIGHT_PROBAR_START_SIZE_Y, GFX_PIXEL_SET); gfx_mono_draw_filled_rect( DISPLAY_LIGHT_PROBAR_STOP_POS_X, DISPLAY_LIGHT_PROBAR_STOP_POS_Y, DISPLAY_LIGHT_PROBAR_STOP_SIZE_X, DISPLAY_LIGHT_PROBAR_STOP_SIZE_Y, GFX_PIXEL_SET); /* Start a RTC alarm immediatly */ rtc_set_alarm_relative(0); }
void alphasense_adc_getValue( void ) { //ALPHASENSE_STATS * const ps = &g_internal; struct adc_config adc_conf; struct adc_channel_config adcch_conf; uint8_t inputgain = 1;//, elements = 20; //char szBUF[64]; // DISABLE jtag - it locks the upper 4 pins of PORT B CCP = CCP_IOREG_gc; // Secret handshake MCU.MCUCR = 0b00000001; PORTB.PIN0CTRL = PORT_OPC_TOTEM_gc; // Auxiliary Electrode PORTB.PIN2CTRL = PORT_OPC_TOTEM_gc; // Working Electrode PORTB.PIN6CTRL = PORT_OPC_TOTEM_gc; // GND x offset adc_read_configuration(&ALPHASENSE_ADC, &adc_conf); adcch_read_configuration(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH, &adcch_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_VCC); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_set_clock_rate(&adc_conf, 200000UL); adc_write_configuration(&ALPHASENSE_ADC, &adc_conf); adcch_set_input(&adcch_conf, ADCCH_POS_PIN6, ADCCH_NEG_NONE, inputgain); adcch_write_configuration(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH, &adcch_conf); adc_enable(&ALPHASENSE_ADC); adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); const int16_t off = adc_get_result(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_disable(&ALPHASENSE_ADC); //sprintf_P(szBUF,PSTR("Offset: %u\t"),off); //debug_string(NORMAL,szBUF,false); //adcch_set_input(&adcch_conf, ADCCH_POS_BANDGAP, ADCCH_NEG_NONE, inputgain); //adcch_write_configuration(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH, &adcch_conf); //adc_enable(&ALPHASENSE_ADC); //adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); //adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); //const uint16_t gain = adc_get_result(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); //adc_disable(&ALPHASENSE_ADC); ////sprintf_P(szBUF,PSTR("gain: %u\t"),gain); ////debug_string(NORMAL,szBUF,false); adcch_set_input(&adcch_conf, ADCCH_POS_PIN0, ADCCH_NEG_NONE, inputgain); adcch_write_configuration(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH, &adcch_conf); adc_enable(&ALPHASENSE_ADC); adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); const int16_t adc_w = adc_get_result(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH)-off; adc_disable(&ALPHASENSE_ADC); //sprintf_P(szBUF,PSTR("ADC_WORK: %u\t"),adc_w); //debug_string(NORMAL,szBUF,false); adcch_set_input(&adcch_conf, ADCCH_POS_PIN2, ADCCH_NEG_NONE, inputgain); adcch_write_configuration(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH, &adcch_conf); adc_enable(&ALPHASENSE_ADC); adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); const int16_t adc_a = adc_get_result(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH)-off; adc_disable(&ALPHASENSE_ADC); //sprintf_P(szBUF,PSTR("ADC_AUX: %u\r\n"),adc_a); //debug_string(NORMAL,szBUF,false); //adc_enable(&ALPHASENSE_ADC); // //for (int i=0;i<elements;i++) //{ //adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); //adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); //adc_start_conversion(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); //adc_wait_for_interrupt_flag(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); //result[i]=adc_get_result(&ALPHASENSE_ADC, ALPHASENSE_ADC_CH); // //} //adc_disable(&ALPHASENSE_ADC); PORTB.PIN0CTRL = PORT_OPC_PULLUP_gc; PORTB.PIN2CTRL = PORT_OPC_PULLUP_gc; PORTB.PIN6CTRL = PORT_OPC_PULLUP_gc; g_recordingData_Alphasense = true; g_partialSumWork+=(int32_t)adc_w; g_partialSumAux+=(int32_t)adc_a; g_partialCount_Alphasense++; g_recordingData_Alphasense = false; //sprintf_P(szBUF,PSTR("Sample: %u\tPartialSumWork: %lu\tPartialSumAux: %lu\r\n"),g_partialCount, g_partialSumWork,g_partialSumAux); //debug_string(NORMAL,szBUF,false); //ps->working = adc_w; //ps->aux = adc_a; }
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); }
/** * \brief This function initialize the ADCB,gets ADCB-CH0 offset and configure * ADCB-CH0 for oversampling * - ADCB-CH0 is configured in 12bit, signed differential mode without gain * - To read ADC offset, ADCB-Pin3(PB3) used as both +ve and -ve input * - After reading ADC offset,to start oversampling,ADCB +ve and -ve input * are configured */ void init_adc(void) { /* Initialize configuration structures */ adc_read_configuration(&ADCB, &adc_conf); adcch_read_configuration(&ADCB, ADC_CH0, &adc_ch_conf); /* Configure the ADCB module: * - Signed, 12-bit resolution * - External reference on AREFB pin. * - 250 KSPS ADC clock rate * - Manual conversion triggering * - Callback function */ adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_12, ADC_REF_AREFB); adc_set_clock_rate(&adc_conf, 250000UL); adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0); adc_write_configuration(&ADCB, &adc_conf); adc_set_callback(&ADCB, &adc_handler); /* Configure ADC B channel 0 for offset calculation * - Differential mode without gain * - Selected Pin3 (PB3) as +ve and -ve input for offset calculation */ adcch_set_input(&adc_ch_conf, ADCCH_POS_PIN3, ADCCH_NEG_PIN3, 1); adcch_write_configuration(&ADCB, ADC_CH0, &adc_ch_conf); /* Enable ADCB */ adc_enable(&ADCB); /* Get ADC offset in to ADC_Offset variable and disable ADC */ adc_offset_one_sample = adc_offset_get_signed(); /* Find ADC_Offset for for total number of samples */ adc_offset = adc_offset_one_sample * ADC_OVER_SAMPLED_NUMBER; /* Disable ADC to configure for oversampling */ adc_disable(&ADCB); /* Configure the ADCB module for oversampling: * - Signed, 12-bit resolution * - External reference on AREFB pin. * - 250 KSPS ADC clock rate * - Free running mode on Channel0 ( First Channel) */ adc_set_conversion_trigger(&adc_conf, ADC_TRIG_FREERUN_SWEEP, 1, 0); adc_write_configuration(&ADCB, &adc_conf); /* Configure ADC B channel 0 for oversampling input * - Differential mode without gain * - Selected Pin1 (PB1) as +ve and Pin2 (PB2) as-ve input * - Conversion complete interrupt */ adcch_set_input(&adc_ch_conf, ADC_OVER_SAMP_POSTIVE_PIN, ADC_OVER_SAMP_NEGATIVE_PIN, 1); adcch_set_interrupt_mode(&adc_ch_conf, ADCCH_MODE_COMPLETE); adcch_enable_interrupt(&adc_ch_conf); adcch_write_configuration(&ADCB, ADC_CH0, &adc_ch_conf); /* Enable ADCB */ adc_enable(&ADCB); }
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 */ 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_write_configuration(&ADCA, &adc_conf); /* Configure ADC channel 0: * - single-ended measurement from configured input pin * - interrupt flag set on completed conversion */ adcch_set_input(&adcch_conf, INPUT_PIN, ADCCH_NEG_NONE, 1); adcch_set_interrupt_mode(&adcch_conf, ADCCH_MODE_COMPLETE); adcch_disable_interrupt(&adcch_conf); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); // Enable the ADC and do one dummy conversion. adc_enable(&ADCA); adc_start_conversion(&ADCA, ADC_CH0); adc_wait_for_interrupt_flag(&ADCA, ADC_CH0); // Light up LED 1, wait for button press. ioport_set_pin_low(LED1_PIN); wait_for_button(); // Perform oversampling of offset. cal_data.offset = get_mean_sample_value(); // Light up LED 2, wait for button press. ioport_set_pin_low(LED2_PIN); wait_for_button(); // Perform oversampling of 0.9 V for gain calibration. cal_data.gain = get_mean_sample_value() - cal_data.offset; // Turn off LEDs. ioport_set_pin_high(LED1_PIN); ioport_set_pin_high(LED2_PIN); // Enable interrupts on ADC channel, then trigger first conversion. adcch_enable_interrupt(&adcch_conf); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); adc_start_conversion(&ADCA, ADC_CH0); do { // Sleep until ADC interrupt triggers. sleepmgr_enter_sleep(); } while (1); }
void ADC_set_input_config(enum adcch_positive_input pos) { struct adc_channel_config adcch_conf; adcch_read_configuration(&MY_ADC, CAP_ADC, &adcch_conf); adcch_set_input(&adcch_conf, pos, ADCCH_NEG_PAD_GND, 1); adcch_write_configuration(&MY_ADC, CAP_ADC, &adcch_conf); }