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);
}
实验结果
通过扭动开发板上的滑动变阻器,能够实时采样到改变的电压值,实验通过。
踩雷笔记
STM32F10X中文常考手册中对于ADC校准的说明
手册提到,校准前ADC必须处于关电状态,这里存在错误,根据英文手册:
应该为在ADON开启并稳定后再进行adc的校准。校准的值将储存在DR寄存器中。如果没有进行校准,采样的ADC将存在误差。
STM32中断函数名是有固定命名的,只有设置正确的中断函数名,程序才可以正常进入中断执行程序中,具体中断函数名列表在STM32F10X.H中查阅。文章来源:https://www.toymoban.com/news/detail-614974.html
配置转换通道及开启转换需要在ADON启动并稳定后进行。文章来源地址https://www.toymoban.com/news/detail-614974.html
到了这里,关于STM32-ADC电压采样实验(寄存器版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!