ADC -模数转换

ADC     -模数转换      - 将模拟信号转换为数字信号

目录

ADC     -模数转换      - 将模拟信号转换为数字信号

STM32方面使用的AD转化方式是逐次逼近法

ADC

什么叫单次,连续,扫描,中断?

应用:运用STM32中ADC转换器采集光照

编写代码

初始化

5、获取光照的值


  • 这一节我们来讲adc类设备

设备怎么区分呢?
串口类设备与单片机通信有串口
io类设备与单片机通信用io ADC类设备和单片机通信接口用adc

  • 什么叫ADC类设备?通信接口为ADC的设备,输出的数据量为模拟量的设备。

  • 什么叫数字量,什么叫模拟量?

单片机能直接识别的:数字量 不能直接识别的:模拟量
假如一个传感器向外输出 3.3V 的电压,一般情况下,单片机识别为逻辑 1.

  • 单片机能识别的电平是ttl电平

TTL 电平的标准如下:
• 输出高电平:大于 2.4V,典型值为 3.5V。
• 输出低电平:小于 0.4V,典型值为 0.2V。
• 输入高电平:大于 2.0V。
• 输入低电平:小于 0.8V.


  • ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,所以如果想读取电压值,就需要借助ADC模数转换器来实现,ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,再把这个数据读取到变量中,就可以进行显示、判断、记录等等操作.

ADC可以将模拟信号转换为数字信号,是模拟电路到数字电路的桥梁


  • 两个重要参数:

分辨率:一般用多少位来表示,12位AD值,它的表示范围就是0 - (2^12-1),量化结果的范围是0~4095,位数越高,量化结果越精细,对应分辨率越高;
转换时间 :1us表示从AD转换开始到产生结果,需要花1us的时间,对应AD转换的频率就是1MHZ,1MHZ为STM32 ADC的最快转换频率

  • 数字量传感器:都有自己通信方式(DHT11 KQM6600)
  • 模拟量传感器:电压值 ADC (ADC对应的IO口要设置成模拟输入)

STM32方面使用的AD转化方式是逐次逼近法

  • 这是stm32上的adc使用的方法,在其他单片机上使用的就不一定是这个方法了

  • AD 转换方式:逐次逼近法

1.ADC 的转换精度:adc 能识别电压的最小值 0 1 2 3…
12 位/16 位 如12位adc的精度为(1/2^12) *参考电压最大值 V,最终得到的电压是adc能够识别的最小电压。 假如参考电压最大值为5v,那么最小电压为0.0012V
2.ADC 的参考电压:ADC 转换电压的范围
参考电压最小值<= 输入电压 <= 参考电压最大值

alt text

如adc能识别的最小电压为0.1v,那么2.2v的电压会被转换为22, 就是看2.2v有几个0.1v,如果精度数0.1v,那么每加一个0.1v都会加一,如果精度是1v,那么2.2v上涨0.1v ,与2.2v没区别

  • tip:电压是相对的 

    alt text

ADC

  • 首先翻出中文参考手册,翻到ADC部分

alt text

-- 12位就是转换精度,ADC只是一个模拟数字转换器,模拟量是从转换通道上读取的。

-- 什么叫左对齐右对齐?

alt text

-- 注意ADC的输入时钟不得超过14MHz,他是由PCLK2分频得到的。

  • 下面看ADC的工作结构图

alt text

-- 如果两个通道都有数据要来转换的话,暂停规则通道的转换,先转换注入通道。(注入通道就相当于vip通道,而规则通道就相当于普通通道,优先转换vip通道)一般用的就是规则通道。

-- ADC只是一个转换器,那么转换的数据从哪来呢,是从数据通道(输入通道)来的。

alt text

 -- 方框就是单片机上的引脚

-- 规则通道最多可转换16组数据,因为有16个通道,那么转换的顺序是什么呢,其实是我们可以控制的,将他写成序号1,那他就是第一个转换,写成序号2,就是第二个转换的。(是人为规定的),最后转换的结果保存在规则通道数据寄存器中。

什么叫单次,连续,扫描,中断?

12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。
各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。

--(单次和连续是一个参数控制的,只能存在一个,而扫描和中断是分别控制的)

  • 单次:只进行一次转换(只转换一次序号为1通道采样到的数据,尽管后面有其他通道在排队)
  • 连续:进行多次转换 (只连续转换序号为1通道采样到的数据,尽管后面有其他通道在排队),如果序号1没有采样到数据,也只会等待序号1的通道,不会转换其他通道。
  • 扫描:(一般与单次和连续一起使用,要么是单次扫描,要么是来连续扫描)开/关 ,普通的单次和连续是在扫描关闭的时候,如果扫描开启,单次扫描将变成会把规则通道里面所有的输入通道都进行一次转换。直到最后排队的输入通道转换完成。
    tip:如果一开始排队的输入通道有3个,开始adc转换后,又排队进来输入通道,将不会进入转换。也就是只要adc转换开始,排队的输入通道固定为3个。
    扫描开启后,连续扫描将变成会把规则通道里面所有的输入通道一直转换。最后一个输入通道转换完后,又继续转换第一个输入通道。
  • 间断:(很少用到) 1 2 3 5 6 7 8 10 12 假如每次转换 2 个通道: 1 2 3 5 6 7 8 10 12,那么就分了5次转换

应用:运用STM32中ADC转换器采集光照

  • 光敏电阻

alt text

 -- 首先查看原理图,可知光敏电阻测的是那个点的电压,通过adc转换成一个值,那么这个值是什么意思呢?我们还要将这个值转换为(我们能看懂的)数据量,怎么转换,就要看光敏电阻的官方手册。知道他的转换公式。

-- 每一个传感器的公式都是不一样的,在公司里可以采用标定的方式。

编写代码

初始化
  • 1、首先配置时钟(IO和外设的时钟),根据原理图采用PA5,adc用adc1
    //时钟 A adc1
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);																		//三个adc共用16个通道
  • 2、配置IO口,PA5设置成模拟输入模式
    //IO  
	GPIO_InitTypeDef GPIO_InitStructure = {0};						//定义结构体变量,并且将结构体变量赋初值
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 						//引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//速度
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;				//模拟输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);
  • 3、配置外设adc

-- adc的时钟不能超过14MHz,采用时钟分频

    //外设
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);																						//adc的时钟不能超过14Mhz,6分频,把72Mhz的频率进行6分频,最终为14mhz

-- 配置外设初始化

    ADC_InitTypeDef ADC_InitStructure = {0};                                                                            
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//独立工作模式												//adc的工作模式 单独工作模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;				//关闭扫描											//是否要工作在扫描模式下,采集一个数据不用开,采集多个数据可以开扫描
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//关闭连续												//连续模式还是单次模式,disable是单次模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//软件触发		//触发模式,,,软件模式
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//数据右对齐													//对齐模式  右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//通道个数																				//规定了顺序进行规则转换的通道数目
	ADC_Init(ADC1,&ADC_InitStructure);                     
	
	ADC_Cmd(ADC1,ENABLE);//使能adc1
  • 4、其他
    //其它 
	//要对adc进行校准,这4句话是固定搭配,不用纠结是什么意思,注意一定要写到adc使能的后面
		
	//----------------------------------------------
	// 初始化ADC 校准寄存器
    ADC_ResetCalibration(ADC1);
    // 等待校准寄存器初始化完成
    while (ADC_GetResetCalibrationStatus(ADC1));

    // ADC开始校准
    ADC_StartCalibration(ADC1);
    // 等待校准完成
    while (ADC_GetCalibrationStatus(ADC1));
	//--------------------------------------------------
	
    //规定通道转换顺序
    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1,ADC_SampleTime_239Cycles5);		//为什么是通道5,看原理图,对应的IO引脚后面就有adc的通道几						//1就是转换顺序第一个,如果要用两个通道的话,拎一个就要写2//最后一个参数是采样时间,采样时间越长,结果越标准
    //ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2,ADC_SampleTime_55Cycles5);//通道11是烟雾传感器


    //需要启动转换才能转换//将下面这行代码加到初始化里,就是单次转换,只有一个数据
    //1.启动adc转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
5、获取光照的值
//应用函数   //改变比较值

void get_illu_val(void)
{
    //1.启动adc转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
    //2.等待转换完成
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    //3.获取数据
    uint16_t illuval =  ADC_GetConversionValue(ADC1);
	
    printf("光照:%d   电压:%.1fV\r\n",illuval,(3.3/4096)*illuval);//得到的是电压值转化成的数据量,现在我们要推电压值
}
  • 从结果来看,光照越强,阻值越小,转换成的数字量就越小         

    alt text

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值