OSStatus platform_adc_init( const platform_adc_t* adc, uint32_t sample_cycle ) { OSStatus err = kNoErr; struct adc_config adc_cfg; UNUSED_PARAMETER(sample_cycle); platform_mcu_powersave_disable(); require_action_quiet( adc != NULL, exit, err = kParamErr); if( initialized != true ) { adc_enable(); adc_select_clock_source_mck(ADC); adc_get_config_defaults(&adc_cfg); adc_init(ADC, &adc_cfg); adc_set_trigger(ADC, ADC_TRIG_SW); adc_set_resolution(ADC, adc->resolution); initialized = true; } exit: platform_mcu_powersave_enable(); return err; }
/** * \brief Application entry point. * * \return Unused (ANSI-C compatibility). */ int main(void) { int32_t ul_vol; int32_t ul_temp; /* Initialize the SAM system. */ sysclk_init(); board_init(); configure_console(); /* Output example information. */ puts(STRING_HEADER); adc_enable(); struct adc_config adc_cfg; adc_get_config_defaults(&adc_cfg); adc_init(ADC, &adc_cfg); adc_channel_enable(ADC,ADC_TEMPERATURE_SENSOR); adc_set_trigger(ADC, ADC_TRIG_SW); struct adc_temp_sensor_config adc_temp_sensor_cfg; adc_temp_sensor_get_config_defaults(&adc_temp_sensor_cfg); adc_temp_sensor_set_config(ADC, &adc_temp_sensor_cfg); adc_set_callback(ADC, ADC_INTERRUPT_EOC_16, adc_temp_sensor_end_conversion, 1); adc_start_software_conversion(ADC); while (1) { if (is_conversion_done == true) { is_conversion_done = false; ul_vol = g_ul_value * VOLT_REF / MAX_DIGITAL; /* * According to datasheet, The output voltage VT = 1.44V at 27C * and the temperature slope dVT/dT = 4.7 mV/C */ ul_temp = (ul_vol - 1440) * 100 / 470 + 27; printf("-- Temperature is: %4d\r\n", (int)ul_temp); delay_ms(1000); adc_start_software_conversion(ADC); } } }
/** * \brief Configure the ADC for the light sensor. */ static void configure_adc(void) { struct adc_config adc_cfg; /* Configure ADC pin for light sensor. */ gpio_configure_pin(LIGHT_SENSOR_GPIO, LIGHT_SENSOR_FLAGS); /* Enable ADC clock. */ pmc_enable_periph_clk(ID_ADC); /* Configure ADC. */ adc_enable(); adc_get_config_defaults(&adc_cfg); adc_init(ADC, &adc_cfg); adc_channel_enable(ADC, ADC_CHANNEL_0); adc_set_trigger(ADC, ADC_TRIG_SW); }
/** * \brief Application entry point. * * \return Unused (ANSI-C compatibility). */ int main(void) { int32_t ul_vol; /* Initialize the SAM system. */ sysclk_init(); board_init(); configure_console(); /* Output example information. */ puts(STRING_HEADER); adc_enable(); struct adc_config adc_cfg; adc_get_config_defaults(&adc_cfg); adc_init(ADC, &adc_cfg); adc_channel_enable(ADC, ADC_CHANNEL_11); adc_set_trigger(ADC, ADC_TRIG_TIO_CH_0); adc_set_callback(ADC, ADC_INTERRUPT_EOC_11, adc_end_conversion, 1); set_adc_resolution(); adc_start_calibration(ADC); /* Configure TC */ configure_tc_trigger(); while (1) { /* Check if ADC sample is done. */ if (is_conversion_done == true) { ul_vol = g_ul_value * VOLT_REF / g_max_digital; printf("-- Voltage is: %4dmv\r\n", (int)ul_vol); is_conversion_done = false; } } }
/** * \brief (Re)Sart ADC sample. * Initialize ADC, set clock and timing, set ADC to given mode. */ static void _configure_adc(void) { uint8_t i = 0; /* Check if sequence mode is necessary */ _test_mode.sequence_enabled = 0; for(i = 0; i < NUM_CHANNELS; i++) { if(i != adc_channel_used[i]) { _test_mode.sequence_enabled = 1; break; } } /* Update channel number */ for (i = 0; i < NUM_CHANNELS; i++) { _data.channel[i] = adc_channel_used[i]; } /* Enable/disable sequencer */ if (_test_mode.sequence_enabled) { /* Set user defined channel sequence */ adc_set_sequence_by_list(adc_channel_used, NUM_CHANNELS); /* Enable sequencer */ adc_set_sequence_mode(true); } else { /* Disable sequencer */ adc_set_sequence_mode(false); } /* Enable channels, gain, single mode */ for (i = 0; i < NUM_CHANNELS; i++) { adc_enable_channel(_data.channel[i]); } /* Set power save */ if (_test_mode.power_save_enabled) { adc_set_sleep_mode(true); } else { adc_set_sleep_mode(false); } /* Transfer with/without DMA */ /* Initialize XDMA driver instance with polling mode */ /* Enable Data ready interrupt */ uint32_t ier_mask = 0; for (i = 0; i < NUM_CHANNELS; i++) { ier_mask |= 0x1u << _data.channel[i]; } adc_enable_it(ier_mask) ; /* Set ADC irq handler */ aic_set_source_vector(ID_ADC, adc_irq_handler); /* Configure trigger mode and start convention */ switch (_test_mode.trigger_mode) { case TRIGGER_MODE_SOFTWARE: /* Disable hardware trigger */ adc_set_trigger(0); /* No trigger, only software trigger can start conversions */ adc_set_trigger_mode(ADC_TRGR_TRGMOD_NO_TRIGGER); aic_enable(ID_ADC); break; case TRIGGER_MODE_ADTRG: pio_configure(pin_adtrg, ARRAY_SIZE(pin_adtrg)); break; case TRIGGER_MODE_TIMER : /* Enable hardware trigger */ adc_set_trigger(ADC_MR_TRGSEL_ADC_TRIG1); /* Trigger timer*/ adc_set_trigger_mode(ADC_TRGR_TRGMOD_PERIOD_TRIG); adc_set_trigger_period(250); aic_enable(ID_TC0); break; default : break; } }