1、ADC与ADC通道
可以看出本次评测的mcu有1路ADC,16个外部通道,依次是ADC_IN0-ADC_IN15。
2、两个内部通道
除了16个外部通道外,其实还有两个内部通道,一个连接到VSSA,是ADC_IN16,一个连接到内部参考电压,ADC_IN17。
3、代码实现
void AdcGpioInit(void)
{
/* enable the clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_init_type gpio_init_struct;
/* set default parameter */
gpio_default_para_init(&gpio_init_struct);
/* configure the led gpio */
gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
gpio_init_struct.gpio_pins = GPIO_PINS_1 ;
gpio_init(GPIOA, &gpio_init_struct);
}
void AdcConfig(void)
{
adc_base_config_type adc_base_struct;
crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
crm_adc_clock_div_set(CRM_ADC_DIV_6);
adc_base_default_para_init(&adc_base_struct);
adc_base_struct.sequence_mode = FALSE;
adc_base_struct.repeat_mode = FALSE;
adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
adc_base_struct.ordinary_channel_length = 1;
adc_base_config(ADC1, &adc_base_struct);
adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
adc_tempersensor_vintrv_enable(TRUE);
adc_enable(ADC1, TRUE);
adc_calibration_init(ADC1);
while(adc_calibration_init_status_get(ADC1));
adc_calibration_start(ADC1);
while(adc_calibration_status_get(ADC1));
}
uint16_t AdcSample(uint8_t channel)
{
adc_ordinary_channel_set(ADC1, (adc_channel_select_type)channel, 1, ADC_SAMPLETIME_239_5);
adc_ordinary_software_trigger_enable(ADC1,TRUE);
while(!adc_flag_get(ADC1, ADC_CCE_FLAG));
adc_flag_clear(ADC1, ADC_CCE_FLAG);
return adc_ordinary_conversion_data_get(ADC1);
}
void AdcInit(void)
{
AdcGpioInit();
AdcConfig();
}
void AdcPolling(void)
{
static uint32_t tick=0;
float temperature=0;
uint16_t ref=0;
float Vdd=0;
if(SystemGetTick()-tick>1000)
{
ref=AdcSample(ADC_CHANNEL_17);
Vdd=1.2/(float)ref*4095;
printf("\r\nVdd=%.3f V\r\n",Vdd);
printf("Channel 1=%.3fV\r\n",AdcSample(ADC_CHANNEL_1)*Vdd / 4095);
printf("Channel 16=%.3fV\r\n",AdcSample(ADC_CHANNEL_16)*Vdd / 4095);
tick =SystemGetTick();
}
}
代码实现中,使用内部参考电压校准,计算出VDD的值,通道1为外部输入。
4、现象
外部通道1的实际输入电压是1.61v,与采样出来的误差不大。
|