/** * \internal * \brief Test averaging conversion in 12-bit mode using the DAC * * These values are then measured using the ADC on the pins that are connected * to the DAC channel, and the results are compared and checked to see if they * are within the acceptable average of values that passes the test. * * \param test Current test case. */ static void run_averaging_conversion_test( const struct test_case *test) { int16_t volt_output; int16_t volt_min, volt_max, volt_input; /* ADC module configuration structure */ struct adc_config adc_conf; /* ADC channel configuration structure */ struct adc_channel_config adcch_conf; adc_disable(&ADCA); /* Change resolution parameter to accept averaging */ adc_read_configuration(&ADCA, &adc_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_MT12, ADC_REF_VCC); adc_write_configuration(&ADCA, &adc_conf); /* Enable averaging */ adcch_read_configuration(&ADCA, ADC_CH0, &adcch_conf); adcch_enable_averaging(&adcch_conf, ADC_SAMPNUM_1024X); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); adc_enable(&ADCA); adc_wait_for_interrupt_flag(&ADCA, ADC_CH0); /* Check values */ for (volt_output = -CONV_MAX_VOLTAGE; volt_output <= CONV_MAX_VOLTAGE; volt_output += CONV_VOLTAGE_STEP) { main_dac_output(volt_output); /* first capture */ volt_input = main_adc_input(); volt_min = volt_max = volt_input; /* several capture */ for (uint8_t i = 0; i < 5; i++) { volt_input = main_adc_input(); if (volt_min > volt_input) { volt_min = volt_input; } if (volt_max < volt_input) { volt_max = volt_input; } } test_assert_true(test, (volt_max - volt_min) < CONF_TEST_ACCEPT_DELTA_AVERAGING, "ADC result is not in acceptable stable range (Min %dmV, Max %dmV)", volt_min, volt_max); } }
/** * \brief Enables averaging */ static void main_adc_averaging_start(void) { /* ADC module configuration structure */ struct adc_config adc_conf; /* ADC channel configuration structure */ struct adc_channel_config adcch_conf; adc_disable(&ADCA); /* Change resolution parameter to accept averaging */ adc_read_configuration(&ADCA, &adc_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_MT12, ADC_REF_VCCDIV2); adc_write_configuration(&ADCA, &adc_conf); /* Enable averaging */ adcch_read_configuration(&ADCA, ADC_CH0, &adcch_conf); adcch_enable_averaging(&adcch_conf, ADC_SAMPNUM_1024X); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); adc_enable(&ADCA); printf("\n\r* ADC averaging enabled\n\r"); }
/** * \brief Enables averaging */ static void main_adc_averaging(void) { /* ADC module configuration structure */ struct adc_config adc_conf; /* ADC channel configuration structure */ struct adc_channel_config adcch_conf; adc_disable(&ADCA); /* Change resolution parameter to accept averaging */ adc_read_configuration(&ADCA, &adc_conf); adc_set_conversion_parameters(&adc_conf, ADC_SIGN_ON, ADC_RES_MT12, ADC_REF_VCC); adc_write_configuration(&ADCA, &adc_conf); /* Enable averaging */ adcch_read_configuration(&ADCA, ADC_CH0, &adcch_conf); adcch_enable_averaging(&adcch_conf, ADC_SAMPNUM_1024X); adcch_write_configuration(&ADCA, ADC_CH0, &adcch_conf); adc_enable(&ADCA); adc_wait_for_interrupt_flag(&ADCA, ADC_CH0); }