使用STM32寄存器进行ADC电压采样实验

STM32F10X系列支持三路ADC,其ADC通道及对应IO口如下表所示:

其能接受的电压输入范围一般为0-3.3V(VREF- ≤ VIN ≤ VREF+),因此,如果需要测量超出0-3.3v量程范围的电压数据,需要在外围硬件增加分压电阻,将电路转换到0-3.3V量程范围内再进行采集。

引脚配置

这里用于做ADC采集的引脚使用单片机的PC1,将引脚配置为模拟输入模式。

void ADC_GPIO_INIT(void)
{
    SET_BIT(RCC->APB2ENR,RCC_APB2ENR_IOPCEN);//开GPIOC端口时钟
    GPIOC->CRL &= ~(0xf<<4);//模拟输入模式 PC1
}

ADC采样与中断配置

本次实验使用中断进行对ADC的连续采样操作,采样使用规则通道。配置ADC CR2寄存器的EOCIE位,在转换完成后产生中断。(在实际运用场景中,为了避免频繁产生中断影响程序其他功能运行,通常采用定时器+DMA传输方式进行,为了简洁实验,这里使用中断进行采集电压数据)

具体配置代码如下:

CR1初始化时,直接将所有位清0,因此在配置时可以忽略部分功能的配置,减少了代码量。具体寄存器对应位参考stm32f10x手册。

static void ADCx_Mode_Config(void)
{
SET_BIT(RCC->APB2ENR,RCC_APB2ENR_ADC1EN);//开ADC1外设时钟
SET_BIT(RCC->CFGR,RCC_CFGR_ADCPRE_DIV6);//设置ADC分频因子,6分频,72/6=12MHZ

ADC1->CR1=0;//初始化

SET_BIT(ADC1->CR2,ADC_CR2_CONT);//配置连续转换模式
SET_BIT(ADC1->CR1,ADC_CR1_EOCIE);//开EOC中断
    
ADC1->CR2|=7<<17; //软件控制转换
ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)

ADC1->CR2&=~(1<<11); //右对齐

ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20; //1 个转换
//设置通道 11 的采样时间
ADC1->SMPR1&=~(3*1); //通道 11 采样时间清空
ADC1->SMPR1|=7<<(3*1); //通道 11 239.5 周期,提高采样时间可以提高精确度

ADC1->CR2|=1<<0; //开启 AD 转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
ADC1->CR2|=1<<2; //开启 AD 校准
while(ADC1->CR2&1<<2); //等待校准结束

ADC1->SQR3&=0XFFFFFFE0;//初始化ADC转换通道
ADC1->SQR3|=ADC_Channel_11;//配置通道为11
ADC1->CR2|=1<<22; //开启转换

NVIC_SetPriority(ADC1_2_IRQn, 1);//配置中断优先级
NVIC_EnableIRQ(ADC1_2_IRQn);//开中断
}

中断执行函数

由于状态寄存器SR中的EOC标志位规定,在读取DR寄存器的值后,EOC中断将自动清除,因此这里不需要手动清除标志位

void ADC1_2_IRQHandler(void)
{   
    if (READ_BIT(ADC1->SR, ADC_SR_EOC)) 
    {
        ADC_ConvertedValue = ADC1->DR;
    }

主循环

每一次ADC转换完成后,将产生中断,在中断中读取DR的值,由计算公式计算出实际电压值

计算公式参考野火:

    while (1)
    {
        ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; 
    
        printf("\r\n The current AD value = 0x%04X \r\n", 
               ADC_ConvertedValue); 
        printf("\r\n The current AD value = %f V \r\n",
               ADC_ConvertedValueLocal); 
        printf("\r\n\r\n");
        Delay(0xffffee);  
    }

实验结果

通过扭动开发板上的滑动变阻器,能够实时采样到改变的电压值,实验通过。

踩雷笔记

  1. STM32F10X中文常考手册中对于ADC校准的说明

手册提到,校准前ADC必须处于关电状态,这里存在错误,根据英文手册:

应该为在ADON开启并稳定后再进行adc的校准。校准的值将储存在DR寄存器中。如果没有进行校准,采样的ADC将存在误差。

  1. STM32中断函数名是有固定命名的,只有设置正确的中断函数名,程序才可以正常进入中断执行程序中,具体中断函数名列表在STM32F10X.H中查阅。

  1. 配置转换通道及开启转换需要在ADON启动并稳定后进行。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32寄存器进行ADC电压采样实验

发表评论