【STM32】 ADC模数转换

ADC简介

ADC:模拟数字转换器,是指将连续变量的模拟信号(高低电平)转换位离散的数字信号(0和1)的器件,AD转换就是模数转换,也可以是整流.顾名思义 ,就是把模拟信号转换为数字信号.

那么模拟量可以是什么?总结如下:模拟量可以是电压、电流等电信号,还可以是压力 温度 湿度 位移、声音等非电信号等等。


ADC采集的要求

输入到A/D转换器中的输入信号必须经过各种传感器将各类的物理量转换为电压。因此ADC要求的进度也要很高,A/D转化输出的电压可以有8位(分辨率:256)、10位(分辨率:1024)、12位(分辨率:4096)、16位(分辨率:65536)等等。

转换步骤

取样 、保持、量化、编码  

前两个步骤再取样,保持电路中完成;后两个步骤在ADC中完成。

ADC常用类型:

积分型

并行比较型/串并型

电容阵列逐次比较型及压频 变换型

逐次逼近型

ADC主要特征

  • 12位分辨率;
  • 转换结束,注入转换结束和发生模拟看门狗事件时产生中断;
  • 单次和连续转换模式;
  • 通过通道0到通道N的自动扫描模式;
  • 自校验;
  • 带内嵌数据一致性的数据对齐(左对齐或者右对齐);
  • 采样间隔可以按通道分别编程;
  • 规则转换和注入转换均有外部触发选项;
  • 间断模式;
  • 双重模式;
  • ADC转换时间:
  • ADC供电要求:2.4V到3.6V;
  • 规则通道转换期间有DMA请求产生;

对于ADC的时钟我们只能采取72/6=12Mhz的ADC 时钟频率 并且只能是6/8分频 不可以用2/4分频 因为已经超过了ADC的最大时钟晶振

注入通道和规则通道:

注入通道:类似单片机的中断事件  同一个ADC只能选择4个注入通道

注入通道转换完成  JEOC标志会置1

规则通道----类似main函数中while(1)里面的程序事件

同一个ADC可以选择16个规则通道

规则通道数据转换完成之后 EOC标志位会置1

 

单次转换的好处:按照个人需求随意启动;

单次转换的坏处:不能连续的采集数据;

什么是单次转换模式:

多次转换的好处:ADC启动一次后,就可以一直转换;

多次转换的坏处:消耗的资源过大;

什么是多次转换模式:

扫描模式

扫描模式可以干什么?

扫描所有选中的通道进行

注意:1、建议在每次上电后执行一次校验;

           2、启动校验前,ADC必须处于关电状态。

数据对齐:

可编程的通道采样时间:

ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以采用不同的采样时间。

外部触发转换:

转换武以由外部事件触发(例如定时器捕获,EXT线)。如果设置了EXTTRIG控制位,则外部事件就能骜他发转奖。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中的某一个,可义触发规则和注入组的采样。

 代码如下(示例):

#include "adc.h"

void ADC1_Init(void)
{
	//配置IO
  GPIO_InitTypeDef  GPIO_InitStruct;
	ADC_InitTypeDef   ADC_InitStruct ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_3;        //引脚1
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;  //输出速度为10MHz
	GPIO_InitStruct.GPIO_Mode  =  GPIO_Mode_AIN; 		//浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStruct);	 //初始化
	
	//配置ADC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent ;
	ADC_InitStruct.ADC_NbrOfChannel = 1;
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//配置为单通道
	
	ADC_Init(ADC1,&ADC_InitStruct); //ADC初始化
	ADC_Cmd(ADC1,ENABLE);//使能ADC上电工作
	
	//启动前进行校准
	//复位校准
	ADC_ResetCalibration(ADC1);//复位ADC校准器
	while(ADC_GetCalibrationStatus(ADC1));//等待校准器为零  说明完成校准
	//复位完开始启动   开启ADC进行校准
	ADC_StartCalibration(ADC1);//开启ADC校准
	while(ADC_GetCalibrationStatus(ADC1));//获取校准状态
	
}
//获取光照传感器的值
//返回adc采集到光照强度的值
//取值范围  0--4095
u16 Get_Gz_Data(void)
{
  //选择规则通道  ADC1的通道3   转换到通道1   通道转换时间为239
	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5);
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待数据装换完成  获取规则通道EOC标志
	return ADC_GetConversionValue(ADC1);//返回转换结果
}

u16 Get_GZ_data(void)
{
	//选择规则通道,ADC1的通道3(IN3),转换通道为1个,通道采集时间为239
	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5); 
	ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件启动规则通道开始转换
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));  //等待数据转换完成,获取规则通道EOC标志位
	return ADC_GetConversionValue(ADC1);  //返回转换结果
}

猜你喜欢

转载自blog.csdn.net/Lushengshi/article/details/125988696