STM32F103RCT 包含有 3 个 ADC。STM32 的 ADC 最大的转换速率为 1Mhz,也就是转换时间为 1us(在 ADCCLK=14M,采样周期为 1.5 个 ADC 时钟下得到),不要让 ADC 的时钟超过 14M,否则将导致结果准确度下降。STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
● 12-位分辨率
● 转换结束,注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道 0 到通道 n 的自动扫描模式
● 自校准
● 带内嵌数据一致的数据对齐
● 通道之间采样间隔可编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带 2 个 ADC 的器件)
● ADC 供电要求:2.4V 到 3.6V
● ADC 输入范围:V REF- ≤ V IN ≤ V REF+
● 规则通道转换期间有 DMA 请求产生。
stm32把ADC转换分成2个通道组:规则通道组相当于正常运行的程序;注入通道组相当于中断。程序初始化阶段设置好不同的转换组,系统运行中不用变更循环转换的配置,从而达到任务互不干扰和快速切换。
● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。 规则组中转换的总数应写入ADC_SQR1寄存器的L[3:0]位中。
● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。 注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中。如果ADC_SQRx或ADC_JSQR寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉冲将发送到ADC以转换新选择的组。
CONT=0,SCAN=0 单次转换模式(Single conversion mode)单次扫描1通道
CONT=1,SCAN=0 连续转换模式(Continuous conversion mode) 连续扫描1通道
CONT=0,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。(单次扫描组)
CONT=1,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。连续扫描一组
ADC在采用规则通道组采集的时候必须启用扫描模式,并且启用DMA传输支持。
寄存器介绍:
ADC_CR1 的 SCAN 位,该位用于设置扫描模式,由软件设置和清除,如果设置为 1,则使用扫描模式,如果为 0,则关闭扫描模式。在扫描模式下,由 ADC_SQRx 或 ADC_JSQRx 寄存器选中的通道被转换。如果设置了 EOCIE 或 JEOCIE,只在最后一个通道转换完毕后才会产生 EOC 或 JEOC 中断。
ADC_CR1[19:16]用于设置 ADC 的操作模式,详细的对应关系如图
ADON 位用于开关 AD 转换器。而 CONT 位用于设置是否进行连续转换,我们使用单次转换,所以 CONT 位必须为 0。CAL 和 RSTCAL 用于AD 校准。ALIGN 用于设置数据对齐,我们使用右对齐,该位设置为 0。
这里使用的是软件触发(SWSTART),所以设置这 3 个位为 111。ADC_CR2 的SWSTART 位用于开始规则通道的转换,我们每次转换(单次转换模式下)都需要向该位写 1。AWDEN 为用于使能温度传感器和 Vrefint。
对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低 ADC 的转换速率。ADC 的转换时间可以由以下公式计算:
Tcovn=采样时间+12.5 个周期
其中:Tcovn 为总转换时间,采样时间是根据每个通道的 SMP 位的设置来决定的。例如,当 ADCCLK=14Mhz 的时候,并设置 1.5 个周期的采样时间,则得到:Tcovn=1.5+12.5=14 个周
期=1us。
ADC 规则序列寄存器(ADC_SQR1~3),该寄存器总共有 3 个。
L[3:0]用于存储规则序列的长度,我们这里只用了 1 个,所以设置这几个位的值为 0。其他的 SQ13~16 则存储了规则序列中第 13~16 通道的编号(编号范围:0~17)。另外两个规则序列寄存器同 ADC_SQR1 大同小异。选择的是单次转换,所以只有一个通道在规则序列里面,这个序列就是 SQ1,通过 ADC_SQR3 的最低 5位(也就是 SQ1)设置。
ADC 规则数据寄存器(ADC_DR)。规则序列中的 AD 转化结果都将被存在这个寄存器里面,而注入通道的转换结果被保存在 ADC_JDRx 里面。
步骤:
1 ) 开启 PA 口时钟,设置 PA1 为模拟输入。
STM32F103RCT6 的 ADC 通道 1 在 PA1 上,所以,我们先要使能 PORTA 的时钟,然后设置 PA1 为模拟输入。
2 ) 使能 ADC1 时钟,并设置分频因子。
要使用 ADC1,第一步就是要使能 ADC1 的时钟,在使能完时钟之后,进行一次 ADC1 的复位。接着我们就可以通过 RCC_CFGR 设置 ADC1 的分频因子。分频因子要确保 ADC1 的时钟(ADCCLK)不要超过 14Mhz。
3 ) 设置 ADC1 的工作模式。
在设置完分频因子之后,我们就可以开始 ADC1 的模式配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。
4 ) 设置 ADC1 规则序列的相关信息。
接下来我们要设置规则序列的相关信息,我们这里只有一个通道,并且是单次转换的,所以设置规则序列中通道数为 1(ADC_SQR1[23:20]=0000),然后设置通道 1 的采样周期(通过ADC_SMPR2[5:3]置)。
5 ) 开启 AD 转换器,并校准。
在设置完了以上信息后,我们就开启 AD 转换器,执行复位校准和 AD 校准,注意这两步是必须的!不校准将导致结果很不准确。
6 ) 读取 ADC 值。
在上面的校准完成之后,ADC 就算准备好了。接下来我们要做的就是设置规则序列 1 里面的通道(通过 ADC_SQR3[4:0]设置),然后启动 ADC 转换。在转换结束后,读取 ADC1_DR 里面的值就是了。