STM32F1模拟信号转数字信号---ADC

顾名思义,本章内容主要讲的就是模数转换。模拟信号是连续性变化的信号,ADC就是把连续型信号通过线性变换,转换成相应的数字信号保存在寄存器里,MCU直接读取即可。(传感器一般是线性的数据变换)
ADC往简单了讲就是模拟信号转化数字信号,但是其中的门路还有很多的。涉及到的寄存器也比较多。主要含义就是讲模拟的连续信号转变为离散的数字信号的器件。
ADC首先要讲的是ADC的时钟,ADC的时钟首先不可超过14Mhz的,超过之后精确度就会下降。ADC的时钟与它所在的总线有关,一般为72M或者36M,不过可经过分频器之后得到ADCCLK。
ADC的主要特征
1.12位的分辨率
2.单次/连续转换模式
3.通道0-N的扫描
4.自校准(复位校准和AD校准)
5.带内嵌数据一致性的数据对齐
6.采样间隔可按通道分编程
7.外部触发
8.间断模式
9.双重模式
10.供电要求:2.4v-3.6V
11.输入范围:Vref-<=Vin<=Vref+

讲一下单次、连继、扫描模式
ADC单通道:
要求进行一次ADC转换:配置为单次模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,就停止转换。
要求进行连续ADC转换:配置为连续模式使能,扫描模式失能。这样ADC的这个通道,转换一次后,接着进行下一次转换,不断连续。
ADC多通道:必须是扫描模式
要求进行一次ADC转换:配置为单次模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。
要求进行连续ADC转换:配置为连续模式使能,扫描模式使能。这样ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。
因此,得出结论:扫描模式只在多通道的条件下有效,来使得各个通道按照配置循序依次转换。而单次模式无论在单通道还是多通道下只对这些或者这个通道进行一次转换,连续模式无论是在单通道还是多通道下都对这些或者这个通道不断进行连续的转换。

ADC时钟
ADC时钟是由ADCCLK时钟和PCLK2同步,RCC为ADC时钟提供了一个专用的可编程分频器。
ADC通道
ADC通道可达18路(内部两路)。规则通道和转换顺序在ADC_SQRx寄存器中选择(注入通道的则在ADC_JSQRx中),规则通道的总数目在ADC_SQR1中的L【3,0】位中(注入通道在ADC_JSQR1【1,0】)。
寄存器方面解释单次、连续、扫描
ADC_CR2寄存器中的ADON位代表给ADC上电,相当于使能ADC,CONT位则代表的是单次模式还是连续模式,CONT置位则代表的是连续模式。扫描的话,则是由ADC_CR2寄存器中的SCAN位控制。
STM32F1模拟信号转数字信号---ADC_第1张图片
这是间断模式的规则。
数据对齐
数据对其就好解释,因为我们一般用到的ADC都是12位的嘛,但是ADC的数据寄存器DR是32位(双通道各占16位),所以可以选择左右对齐,也就是高12位或者低12位。
采样时间
采样时间是由ADC_SMPR1和ADC_SMPR2两个寄存器控制。转换时间
T转换时间=采样时间=12.5周期(读取时间)
外部触发事件
由ADC_CR2中的EXTSEL位控制
STM32F1模拟信号转数字信号---ADC_第2张图片
寄存器表格
STM32F1模拟信号转数字信号---ADC_第3张图片
STM32F1模拟信号转数字信号---ADC_第4张图片
STM32F1模拟信号转数字信号---ADC_第5张图片
STM32F1模拟信号转数字信号---ADC_第6张图片
STM32F1模拟信号转数字信号---ADC_第7张图片
STM32F1模拟信号转数字信号---ADC_第8张图片

STM32F1模拟信号转数字信号---ADC_第9张图片
STM32F1模拟信号转数字信号---ADC_第10张图片

#include "my_adc.h"
#include "delay.h"
//adc初始化
void MY_ADC_Init(void)
{
	RCC->APB2ENR|=1<<2;//GPIOA时钟初始化
	
	RCC->APB2ENR|=1<<9;//ADC时钟初始化
	RCC->APB2RSTR|=1<<9;//ADC时钟复位
	RCC->APB2RSTR&=~(1<<9);//ADC时钟复位结束
	
	RCC->CFGR&=~(11<<14);//清空时钟分频器
	RCC->CFGR|=10<<14;//6分频
	
	GPIOA->CRL&=0xffffff0f;//复位GPIOA1 其他位保持不变
	/*可不写
		GPIOA->CRL|=0x00000000;//模拟输入PA0
	*/
	
	ADC1->CR1&=0XF0FFFF; //工作模式清零
	ADC1->CR1|=0x0000<<16;//独立模式
	
	ADC1->CR1&=~(1<<8);//不使用扫描模式
	ADC1->CR2&=~(1<<1);//单次转换模式
	
	ADC1->CR2&=~(7<<17);
	ADC1->CR2|=7<<17;//外部软件触发
	ADC1->CR2|=1<<20;//外部触发事件
	
	ADC1->CR2&=~(1<<11);//右对齐
	
	ADC1->SQR1&=~(15<<20);//清除转化数
	ADC1->SQR1|=0<<20;//1个转换
	
	ADC1->SMPR2&=~(7<<3);//采样时间清零/通道1
	ADC1->SMPR2|=7<<3;//设置采样周期239.5周期/通道1
	
	ADC1->CR2|=1<<0;//ADC转化器开启 即使能ADC
	
	ADC1->CR2|=1<<3;//复位校准
	while(ADC1->CR2&1<<3);//复位校准结束
	 //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。 	
	
	ADC1->CR2|=1<<2;//AD校准
	while(ADC1->CR2&1<<2);//AD校准结束
	 //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。 	
}
//得到ADC的值
u16 Get_ADC_Value(u8 ch)
{
	ADC1->SQR3&=0xffffffe0;//第一个转化
	ADC1->SQR3|=ch;
	
	ADC1->CR2|=1<<22;//开始规则转换
	while(!(ADC1->SR&1<<1));//规则转换结束
	
	return ADC1->DR;
}
u16 Get_ADC_AVERAGE_Value(u8 ch,u8 time)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<time;t++)
	{
		temp_val+=Get_ADC_Value(ch);
		delay_ms(5);
	}
	return temp_val/time;
}

如果对您的问题有帮助的话可以帮忙点个赞,谢谢~QQ群:540093471 有问题大家可以一起交流沟通!

你可能感兴趣的:(STM32学习,嵌入式,stm32,arm)