STM32 软件触发ADC采集
0.91寸OLED屏幕大小的音频频谱,炫酷!
STM32另一个很少人知道的的功能——时钟监测
晶振与软件的关系(深度理解)
STM32单片机一种另类的IO初始化方法
ADC是一个十分重要的功能,几乎任何一款单片机都会包含这个功能(当然除了部分IO型芯片)。本文就通过stm32f103c8t6来学习一下ADC的操作流程,以最基本的软件触发ADC模式。
首先找到手册中ADC模块部分,如下图,就是ADC模块的相关框图,可以看到十分繁杂。
那么对于软件触发ADC方式如何操作呢。
如下图,就是最基本的ADC采样方式,不经过外部触发,采样转换完成不触发中断。
接下来一次介绍ADC的操作步骤。以ADC1的通道0为例。
有两个模块必不可少,一个是时钟,一个是GPIO。时钟存在于RCC模块中。
stm32系列ADC的时钟来源于APB2时钟分频。先把APB2时钟分频到36M,然后将ADC时钟分频到12M,这样ADC时钟就配置好了。
随后是GPIO的初始化,要实现ADC采集功能,将对应的GPIO设置成模拟输入模式。
void gpio_init()
{
RCC->APB2ENR|=(1<<2)|(1<<9);//GPIOA时钟使能
GPIOA->CRL&=~(0X0F<<0);//PA0 模拟输入模式
}
接下来就是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采集的过程。
unsigned int start_adc()
{
ADC1->CR2|=(1<<22);//开始转换
while(!(ADC1->SR&(1<<1)));
return(ADC1->DR);
}
之前介绍过关于OLED的显示功能,那么我们就通过OLED将ADC采集到的值显示到OLED上。如下就是实际效果
STM32 软件触发ADC采集
数字电子技术电门电路之万物皆可与非门(掌握数字电路核心基础)
模拟信号和数字信号区别——其实数字信号是不存在的
0.96寸OLED屏幕控制器SSD1306详解
0.96寸OLED控制器SSD1306其他两种显示模式
STM32 | 精确控制PWM脉冲个数
炫彩LED
微距下的蓝牙耳机
频率与周期的精密控制——用SPI输出PWM脉冲