问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32 软件触发ADC采集详解

创作时间:
作者:
@小白创作中心

STM32 软件触发ADC采集详解

引用
CSDN
1.
https://blog.csdn.net/longgyue/article/details/142448117

STM32的ADC(模数转换器)功能是单片机开发中非常重要的一个模块,广泛应用于各种传感器数据采集场景。本文将通过STM32F103C8T6为例,详细介绍如何通过软件触发方式实现ADC数据采集。


0.91寸OLED屏幕大小的音频频谱,炫酷!

STM32的ADC模块功能强大,但相应的配置也较为复杂。对于软件触发ADC方式,其基本流程如下图所示:


最基本的ADC采样方式,不经过外部触发,采样转换完成不触发中断。

接下来,我们将详细讲解ADC的操作步骤,以ADC1的通道0为例。

时钟配置

STM32系列ADC的时钟来源于APB2时钟分频。首先需要将APB2时钟分频到36M,然后将ADC时钟分频到12M。具体配置如下:

void clock_config()
{
  RCC->CFGR&=~(1<<14);
  RCC->CFGR|=(1<<14);
  while(!(RCC->CFGR&(1<<14)));
  RCC->CR|=1;
  while(!(RCC->CR&1));
  RCC->CFGR&=~(1<<14);
}

GPIO初始化

要实现ADC采集功能,需要将对应的GPIO设置成模拟输入模式。这里以PA0为例:

void gpio_init()
{
  RCC->APB2ENR|=(1<<2)|(1<<9);//GPIOA时钟使能
  GPIOA->CRL&=~(0X0F<<0);//PA0 模拟输入模式
}

ADC模块初始化

ADC模块的初始化相对复杂,需要配置多种寄存器参数。以下是具体的初始化代码:

void adc_init()
{
  ADC1->CR2|=(1<<0);
  ADC1->CR1&=~(0X0F<<16);//independent mode
  //ADC1->CR1&=~(7<<13);//1个通道
  //ADC1->CR1|=(1<<11);
  ADC1->CR1&=~(1<<8);//扫描模式关闭
  ADC1->CR2|=(1<<20);
  ADC1->CR2|=(7<<17);
  ADC1->CR2&=~(1<<11);//right align
  ADC1->CR2|=(1<<3);
  while(ADC1->CR2&(1<<3));
  ADC1->CR2|=(1<<2);
  while(ADC1->CR2&(1<<2));
  ADC1->CR2&=~(1<<1);
  ADC1->SMPR2&=~(7<<0);
  ADC1->SQR3&=~(0X1F<<0);
}

控制ADC采集

最后是控制ADC采集的过程,通过软件触发方式启动ADC转换:

unsigned int start_adc()
{
  ADC1->CR2|=(1<<22);//开始转换
  while(!(ADC1->SR&(1<<1)));
  return(ADC1->DR);
}

显示ADC采集结果

之前介绍过关于OLED的显示功能,这里我们通过OLED将ADC采集到的值显示出来。实际效果如下:


STM32 软件触发ADC采集的实际效果

通过以上步骤,我们就可以实现STM32单片机的软件触发ADC数据采集功能。这个功能在各种传感器数据采集场景中都有广泛的应用,希望本文能帮助读者更好地理解和掌握这一重要功能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号