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,与采样出来的误差不大。
|