一.ADC功能框图分析

1.①电压输入范围
ADC输入范围为VREF- ≤ VIN ≤ VREF+ ,由VREF-、VREF+、VDDA、VSSA四个外部引脚决定。
在设计原理图时一般把VSSA、VREF-接地,VDDA、VREF+接3V3,得到ADC的输入电压范围为0~3.3V。
如果想要让输入的电压范围变宽,可以测试负电压或更高的正电压,需要在外部添加一个电压调理电路,把需要转换的电压抬升或降压到0~3.3V就可以用ADC测量了。
2.②输入通道
STM32的ADC多达18个通道, 外部16个通道就是框图中的ADCx_IN0、ADCx_IN1…ADCx_IN5。分别对应着不同的IO口。
ADC1/2/3还有内部通道: 通道ADC1_IN16连接到芯片内部的温度传感器, 通道ADC1_IN17连接到内部参考电压VREFINT。
外部16个通道在转换的时候又分为规则通道和注入通道。其中规则通道最多16路,注入通道最多4路。平时一般使用的就是规则通道,注入通道则是在规则通道转换的时候强行插入的一种通道。在规则通道转换过程中有注入通道插队就要先转换完注入通道,等注入通道转换完成后再回到规则通道的转换流程。
3.③转换顺序
(1)规则序列
规则序列寄存器有3个,分别为SQR3、SQR2、SQR1。

SQR3控制着规则序列中的第一个到第六个转换,对应的位为:SQ1[4:0]~SQ6[4:0],如果通道16想第一次转换,那么在SQ1[4:0]写通道16即可。SQR1的位L[3:0]决定使用多少个通道,最多16个通道。
(2)注入序列
注入序列寄存器JSQR只有一个,最多支持4个通道,具体多少个由JSQR的JL[2:0]决定。如果JL的值小于4的话,则JSQR跟SQR决定转换顺序的设置不一样,第一次转换的不是JSQR1[4:0],而是JCQRx[4:0] ,x = (4-JL),跟SQR刚好相反。如果JL=00(1个转换),那么转换的顺序是从JSQR4[4:0]开始,而不是从JSQR1[4:0]开始。当JL等于4时,跟SQR一样。

4.④触发源
ADC转换可以由ADC控制寄存器2: ADC_CR2的ADON这个位来控制, 写1的时候开始转换,写0的时候停止转换。
ADC还支持外部事件触发转换,包括内部定时器触发和外部IO触发。具体选择哪一种触发源,由ADC控制寄存器2:ADC_CR2的EXTSEL[2:0]和JEXTSEL[2:0]位来控制。EXTSEL[2:0]用于选择规则通道的触发源,JEXTSEL[2:0]用于选择注入通道的触发源。选定的触发源是否要激活,则由ADC控制寄存器2:ADC_CR2的EXTTRIG和JEXTTRIG这两位来控制。
如果使能了外部触发事件还可以通过设置ADC控制寄存器2:ADC_CR2的EXTEN[1:0]和JEXTEN[1:0]来控制触发极性,有4种状态,分别是:禁止触发检测、上升沿检测、下降沿检测以及上升沿和下降沿均检测。
5.⑤转换时间
(1)ADC时钟
ADC输入时钟ADC_CLK由PCLK2经过分频产生,最大值是36MHz,典型值为30MHz,分频因子由ADC通用控制寄存器ADC_CCR的ADCPRE[1:0]设置, 可设置的分频系数有2、4、6和8,注意这里没有1分频。对于STM32F407ZGT6一般设置PCLK2=HCLK/2=84MHz。 所以程序一般使用4分频(21MHz)或者6分频(16MHz)。
(2)采样时间
ADC需要若干个ADC_CLK周期完成对输入的电压进行采样,采样的周期数可通过ADC采样时间寄存器ADC_SMPR1和ADC_SMPR2的SMP[2:0]位设置,ADC_SMPR2控制的是通道0~9, ADC_SMPR1控制的是通道10~17。每个通道可以分别用不同的时间采样。其中采样周期最小是3个,即如果要达到最快的采样,那么应该设置采样周期为3个周期,这里说的周期就是1/ADC_CLK。
ADC的总转换时间跟ADC的输入时钟和采样时间有关:
Tconv = 采样时间 + 12个周期
当ADCCLK = 30MHz,即PCLK2为60MHz,ADC时钟为2分频,采样时间设置为3个周期,那么总的转换时间为:Tconv = 3 + 12 = 15个周期 =0.5us。(取ADC输入时钟典型值)
一般设置PCLK2=84MHz,经过ADC预分频器能分频到最大的时钟只能是21M,采样周期设置为3个周期,算出最短的转换时间为0.7142us。
6.⑥数据寄存器
ADC转换后的数据,规则组的数据放在ADC_DR寄存器,注入组的数据放在ADC_JDRx寄存器。如果是使用双重或者三重模式,规矩组的数据是存放在通用规矩寄存器ADC_CDR内的。
(1)规则数据寄存器ADC_DR
ADC规则组数据寄存器ADC_DR只有一个,是32位寄存器仅低16位有效,只用于独立模式存放转换完成的数据。
ADC最大精度是12位,ADC_DR是16位有效,ADC存放数据时可以选择左对齐或右对齐,由ADC_CR2的11位ALIGN设置。
如果多通道转换,前一个时间点转换的通道数据会被下一个时间点的另外一个通道转换的数据覆盖掉。所以在通道转换完成后应该把数据及时取走,或者使用DMA模式把数据传输到存储器中。如果没有使用DMA传输一般需要使用ADC状态寄存器ADC_SR获取当前ADC转换的进度状态,从而进行程序控制。
(2)注入数据寄存器ADC_JDRx
ADC注入组最多有4个通道,注入数据寄存器也有4个,每个通道对应一个寄存器,不存在类似规则寄存器数据覆盖的问题。ADC_JDRx也是32位寄存器低16位有效,数据存放同样分为左对齐和右对齐,由ADC_CR2的11位ALIGN设置。
(3)通用规则数据寄存器ADC_CDR
规则数据寄存器ADC_DR仅适用于独立模式,通用数据寄存器ADC_CDR适用于双重、三重模式。独立模式就是仅适用于三个ADC使用其中一个,双重模式是同时使用ADC1和ADC2,三重模式是三个ADC同时使用。双重、三重模式一般需要配合DMA数据传输使用。
7.⑦中断
(1)转换结束中断
数据转换结束后,可以产生中断,中断分为四种:规则通道转换结束中断,注入转换通道转换结束中断,模拟看门狗中断和溢出中断。其中转换结束中断很好理解,有相应的中断标志位和中断使能位,可以根据中断类型写相应配套的中断服务程序。
(2)模拟看门狗中断
当被ADC转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是开启了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR和ADC_HTR设置。例如设置高阈值是2.5V,那么模拟电压超过2.5V的时候,就会产生模拟看门狗中断,反之低阈值也一样。
(3)DMA溢出中断
如果发生DMA传输数据丢失,会置位ADC状态寄存器ADC_SR的OVR位,如果同时使能了溢出中断,在转换结束后会产生一个溢出中断。
(4)DMA请求
规则和注入通道转换结束后,除了产生中断外,还可以产生DMA请求,把转换好的数据直接存储在内存里面。要注意的是只有ADC1和ADC3可以产生DMA请求。
8.⑧电压转换
模拟电压经过ADC转换后,是一个12位的数字值,通过串口以16进制打印出来的话,可读性较差,需要把数字电压转换成模拟电压。
在设计原理图的时候会把ADC的输入电压范围设定在:0~3.3v,因为ADC是12位的,那么12位满量程对应的就是3.3V,12位满量程对应的数字值是:212。数值0对应的就是0V。如果转换后的数值为X ,X对应的模拟电压为Y,那么会有这么一个等式成立: 212 / 3.3 = X / Y,则 Y = (3.3 * X ) / 2^12。
二.ADC初始化结构体
1.ADC_HandleTypeDef结构体
typedef struct {
ADC_TypeDef *Instance; /*寄存器基地址指针*/
ADC_InitTypeDef Init; /*ADC初始化参数结构体*/
__IO uint32_t NbrOfCurrentConversionRank;//正在转换序列的ADC数目
DMA_HandleTypeDef *DMA_Handle; /* DMA处理程序指针 */
HAL_LockTypeDef Lock; /*ADC锁定对象 */
__IO uint32_t State; /*ADC通信状态*/
__IO uint32_t ErrorCode; /*ADC错误码 */
} ADC_HandleTypeDef;
2.ADC_InitTypeDef结构体
ADC_InitTypeDef初始化结构体被ADC_HandleTypeDef结构体引用。
typedef struct {
uint32_t ClockPrescaler; /*ADC时钟分频系数 */
uint32_t Resolution; /*ADC分辨率选择 */
uint32_t DataAlign; /*输出数据对齐方式 */
uint32_t ScanConvMode; /*扫描转换模式 */
uint32_t EOCSelection; /*转换结束标志使用轮询或者中断*/
uint32_t ContinuousConvMode; /*连续转换模式 */
uint32_t NbrOfConversion; /*规格转换序列数目 */
uint32_t DiscontinuousConvMode; /*不连续采样模式 */
uint32_t NbrOfDiscConversion; /*不连续采样通道 */
uint32_t ExternalTrigConv; /*外部事件触发选择 */
uint32_t ExternalTrigConvEdge; /*外部事件触发极性 */
uint32_t DMAContinuousRequests; /*DMA连续请求转换 */
} ADC_InitTypeDef;
(1)ADC_DataAlign
转换结果数据对齐模式,可选右对齐ADC_DataAlign_Right或者左对齐ADC_DataAlign_Left。一般选择右对齐模式。
(2)ScanConvMode
可选参数为ENABLE和DISABLE,配置是否使用扫描。如果是单通道AD转换使用DISABLE,如果是多通道AD转换使用ENABLE。
STM32 ADC深入解析:功能框图、初始化与实战应用

本文详细介绍了STM32 ADC的工作原理,包括电压输入范围、输入通道配置、转换顺序控制、触发源、转换时间和数据寄存器。还展示了ADC初始化结构体,以及针对独立模式下单通道和多通道采集的程序实现,涉及GPIO配置、模式设置、中断配置和DMA应用。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



