ADC介绍
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阈值。ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。
ADC概念
ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。然而,有一些模拟数字转换器并非纯的电子设备,例如旋转编码器,也可以被视为模拟数字转换器。
ADC 背景发展
随着CMOS制作工艺的迅速发展,越来越多的信号被移到数字领域来处理,从而达到降低成本,降低功耗,提高速度的目的。
这就使我们迫切需要一种低功耗、低电压且能够用标准深亚微米技术实现的ADC。
ADC主要特征
- 12位分辨率
- 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
- 单次和连续转换模式
- 从通道0到通道n的自动扫描模式
- 间断模式执行
- 自校准
- 带内嵌数据一致性的数据对齐
- 采样间隔可以按通道分别编程
- 规则转换和注入转换均有外部触发选项(外部中断,定时器)
- 双重模式(带2个或以上ADC的器件同时工作)
- ADC最大输入时钟不得超过14MHZ
- ADC供电要求:2.4v到3.6v
- ADC输入范围:VREF-<=VIN<=VREF+
- 规则通道转换期间有DMA请求产生。
ADC的基本框架
前置滤波器——采样/保持——量化器——数字处理器
ADC的性能参数
ADC的性能参数主要有:
- 分辨率:ADC的分辨率是指转换器所能分辨的最小量化信号的能力。对于一个二进制N位分辨率的ADC,假设满摆幅的输入范围位Vref,所能分辨的最小电平则为LSB=Vref/2^n同时,分辨率通常随着噪音和非线性的增加而下降,因此,描述ADC真正的分辨率还应包括噪音和非线性
- 微分非线性(DNL)
- 积分非线性(INL)
- 失调误差:零输入时A/D转换器输入——输出特性曲线的偏移
- 增益误差:满量程输出时,实际的模拟输入信号和理想的模拟输入信号间的差异。增益误差使传输特性曲线绕坐标原点相对于理想特性曲线发生了一定角度的偏移。
- 信噪比:信噪比指ADC输出信号功耗和噪声功耗间的比值,用dB表示SNR=10logPsignal/Pnoise。其中,信号是指频谱中基波分量的有效值,噪声=总能量-信号能量和谐波的能量。理想的ADC噪声主要来自量化噪声。对于正弦输入信号,信噪比的理论最大值为:SNR=(6.02N+1.76)dB。其中,N是ADC的位数。
- 信噪失真比:基本的信号功耗与所有谐波失真,混叠谐波以及所有的噪声功耗之和的比值。它是衡量模数转换器最重要的指标。与输入信号频率、幅度等因素有关
- 无杂散动态范围
- 总谐波失真:整个频带中各次谐波的功率之和。
- 转换速度:转换速度是指ADC每秒将输入的模拟信号转换成数字信号的次数,其单位为ksps。
ADC引脚
VREF+(输入,模拟参考正极,ADC使用的高端/正极参考电压2.4<= VREF+<=VDDC
查找开发板上的ADC
VDDA(输入,模拟电源,等效于VDD的模拟电源且:2.4V<=VDDA<=VDD(3.6v)
VREF-输入模拟参考负极,ADC使用的低端/负极参考电压,VREF-=VSSA
VSSA输入模拟电源地,等效于VSS的模拟电源地
ADCx_IN[15:0]:模拟输入信号,16个模拟输入通道
通道0——通道15:外部输入,测量外部
通道16:温度传感器,测量芯片内部温度,不能测量外部温度,可用于测量相对温度,
通道17:内部参考电压
通道选择
有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行得一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。
- 规则组由多达16个转换组成。规则通道和它们得转换顺序在ADC_SQRx寄存器中选择。规则组中转换得总数应写入ADC_SQR1寄存器的L[3:0]位中。
- 注入组由多达4个转换组成。注入通道和它们得转换顺序在ADC_JSQR寄存器中选择。规则组中转换得总数应写入ADC_JSQR寄存器得L[1:0]位中。
- 如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前得转换被清除,一个新得启动脉冲将发生到ADC以转换新得选择组。
- 温度传感器和通道ADC1_IN16相连接,内部参考电压AREFINT和ADC1_IN17相连接。可以按注入或规则通道对这两个内部通道进行转换。
- 注意温度传感器和AREFINT只能出现在主ADC1中。
单次转换模式
单次转换模式下,ADC执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0.
一旦选择通道的转换完成:
- 如果一个规则通道被转换:
——转换数据被储存在16位ADC_DR寄存器中
——EOC(转换结果)标志被设置
——如果设置了EOCIE,则产生中断。 - 如果一个注入通道被转换:
——转换数据被存储在16位的ADC_DRJ1寄存器中
——JEOC(注入转换结束)标志被设置
——如果设置了JEOCIE位,则产生中断。然后ADC停止
连续转换模式
在连续转换模式中,当面前ADC转换一结束就马上启动另一次转换。此模式可通过外部触发启动或通过设置ADC_CR2寄存器上ADON位启动,此时CONT位是1.
每转换后:
- 如果一个规则通道被转换:
——转换数据被储存在16位的ADC_DRJ1寄存器中
——EOC(转换结束)标志被设置
——如果设置了EOCIE,则产生中断。
- 如果一个注入通道被转换:
——转换数据被储存在16位的ADC_DRJ1寄存器中
——JEOC(注入转换结束)标志被设置
——如果设置了JEOCIE位,则产生中断。
扫描模式
此模式用来扫描一组模拟通道。
- 扫描模式可通过设置ADC_CR1寄存器的SCAN位来选择。一旦这个位被设置,ADC扫描所有被ADC_SQRX寄存器(对规则通道)或ADC_JSQR(对注入通道)选中的所有通道。在每个组的每个通道上执行单次转换。在每个转换结束时,通一组的下一个通道被自动转换。如果再次从选择的第一个通道继续被转换。
- 如果设置了DAM位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。而注入通道转换的数据总是存储在ADC_JDRx寄存器中。
间断模式
规则组
- 此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以执行一个短序列的n次转换(n<=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值n由ADC_CR1寄存器的DISCNUM[2:0]位给出。
- 一个外部触发信号可以启动ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转换完成为止。总的序列长度由ADC_SQRI寄存器的L[3:0]定义。
注意:当以间断模式转换一个规则组时,转换序列结束后不自动从头开始。
当所有子组被转换完成,下一次触发启动第一个子组的转换。
注入组
- 此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件,该模式按通道顺序逐个转换ADC_JSQR寄存器中选择的序列。
- 一个外部触发信号可以启动ADC_JSQR寄存器中选择下一个通道序列的转换,直到序列中所有的转换完成为之。总的序列长度由ADC_JSQR寄存器的JL[1:0]位定义。
注意:
1.当完成所有注入通道转换,下一个触发启动第1个注入通道的转换。
2.不能同时使用自动注入和间断模式
3.必须避免同时为规则和注入设置间断模式。间断模式只能作用于一组转换。
ADC的采样时间
可编程的通道采样时间
ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改。每个通道可以分别用不同的时间采样。
总转换时间如下计算:
TCONV=采样时间+12.5个周期
常见的周期有:1.5周期、7.5周期、28.5周期、41.5周期、55.5周期、71.5周期、239.5周期。
数据对齐
- ADC_CR2寄存器中的ALIGN位选择转换后数据储存的对齐方式。数据可以左对齐或右对齐。
- 注入组通道转换的数据值已经减去了在ADC_JOFRx寄存器中定义的偏移量,因此结果可以是一个负值。SEXT位是扩展的符号值。
- 对于规则组通道,不需减去偏移量,因此只有12个位有效。
校准
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的精准度误差。在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。
通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正确转换。建议在上电时执行一次ADC校准。校准阶段结束后,校准码储存在ADC_DR中。
注意
1.建议在每次上电执行一次校准。
2.启动校准前,ADC必须处于关电状态(ADON=“0”)超过至少两个ADC时钟周期。
代码编写说明
1、模数转换分辨率为12位
2、ADC采样方式:DMA
3、打印采样值,最大值为2^12=4096,
4、打印换算电压,换算成电压为=采样值3.3/4096
调用函数:
1、HAL_ADC_Start_DMA(ADC_HandleTypeDef hadc, uint32_t* pData, uint32_t Length);//DMA读取 ADC值
2、void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);//ADC回调函数
3、HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//在回调函数中运行LED
4、void HAL_Delay(uint32_t Delay);//延时打印转换值
5、printf();//打印数据到串口函数 需要重新定义函数fputc();才能正常使用printf();
配置引脚
代码展示
参考链接
https://www.dianyuan.com/class/video_1560.html
来源:CSDN
作者:quanqueen
链接:https://blog.csdn.net/quanqueen/article/details/104234262