[活动专区]

【AT-START-F425测评】9、adc采样(参考电压、VSSA、外部输入)

[复制链接]
682|0
手机看帖
扫描二维码
随时随地手机跟帖
freeelectron|  楼主 | 2022-3-17 10:15 | 显示全部楼层 |阅读模式
1、ADC与ADC通道
18625623296eb0e63d.png
可以看出本次评测的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、现象
5180262329902a730a.png

611186232995ce504b.png
外部通道1的实际输入电压是1.61v,与采样出来的误差不大。





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

65

主题

786

帖子

10

粉丝