ADC要配置成单次转换模式,每次转换的通道不一样,下面的配置代码和每次获取转换结果是否有问题?
其中 ADC_Configuration这个是配置,在初始化调用, ADC_Get_Result这个是获取转换结果,在main函数的主循环中调用,每次将需要转换的通道ch传进来,然后返回通道ch的转换结果。
uint16_t ADC_Get_Result(uint8_t ch)
{
uint8_t i;
uint16_t ADResult;
/* ADC regular channel config */
adc_regular_channel_config(0, ch, ADC_SAMPLETIME_55POINT5);
ADResult = 0x0000;
for(i = 0; i < 5; i++)
{
adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
while(!adc_flag_get(ADC_FLAG_EOC))
{
;
}
ADResult += ADC_RDATA;
adc_flag_clear(ADC_FLAG_EOC);
}
return ADResult /5; // 返回ADC结果
} /**
* @brief Configure ADC.
* @param None
* @retval None
*/
void ADC_Configuration(void)
{
/* enable ADC1 clock */
rcu_periph_clock_enable(ADC_RCC);
/* config ADC clock */
rcu_adc_clock_config(RCU_ADCCK_APB2_DIV4);
/* ADC contineous function enable */
adc_special_function_config(ADC_CONTINUOUS_MODE, DISABLE);
/* ADC trigger config */
adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_SWRCST);
/* ADC data alignment config */
adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
/* ADC channel length config */
adc_channel_length_config(ADC_REGULAR_CHANNEL, 1);
/* ADC regular channel config */
adc_regular_channel_config(0, ADC_V_CHANL, ADC_SAMPLETIME_55POINT5);
/* ADC external trigger enable */
adc_external_trigger_config(ADC_REGULAR_CHANNEL,ENABLE);
/* 16 times sample, 4 bits shift */ // 使用过采样,硬件求平均值,GD32F130系列不支持
//adc_oversample_mode_config(ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_4B, ADC_OVERSAMPLING_RATIO_MUL16);
//adc_oversample_mode_enable(); /* ADC resolusion 6B */
//adc_resolution_config(ADC_RESOLUTION_12B); // GD32F130系列不支持
adc_enable(); delay_1ms();
adc_calibration_enable();
}
|