STM32的ADC采样(翻看网上内容总结)
难点:如何确定采样周期?如何配置相关寄存器?转换时间里的12.5是怎么来的?
一、基本概念:ADC转换就是输入模拟的信号量,单片机转换成数字量。读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期。采样周期一般来说=转换时间+读取时间。而转换时间=采样时间+12.5个时钟周期。采样时间是你通过寄存器告诉stm32采样模拟量的时间,设置越长越精确。
STM32的ADC模块各个通道对应的IO
(注意:STM32F103系列最少都拥有2个ADC,STM32F103ZET6包含有3个ADC,STM32F103ZET6内部集成了12位的逐次逼近型模拟数字转换器,它有多大18个通道,可测量16个外部和2个内部信号源。)
二、规则组和注入组
STM32的ADC通道分为规则组和注入组。因为ADC转换模块只有一个ADC功能核心,它能够支持这么多通道的数据转换,用的是分时复用的方法。分组的目的是为了赋予特定的ADC通道优先权。
比如,ADCx_IN2被分配到规则组,ADCx_IN3被分配到注入组,在IN2通道进行数据转换的过程中,外部信号触发了IN3通道的转换,则ADC功能核心将暂停IN2的转换,转去执行IN3的转换,完成转换后在回来执行IN2的转换。由此可知,注入组的通道具有优先转换权,可以打断规则组通道正在进行的转换。
三、STM32 ADC 采样 频率的确定
①、可编程的通道采样时间
ADC 使用若干个ADC_CLK 周期对输入电压采样,采样周期数目可以通过
ADC_SMPR1 和ADC_SMPR2 寄存器中的SMP[2:0]位而更改。每个通道可以以
不同的时间采样。
总转换时间如下 计算:
TCONV = 采样时间+ 12.5 个周期
例如:
当ADCCLK=14MHz 和1.5 周期的采样时间
TCONV = 1.5 + 12.5 = 14 周期 = 1μs
转换时间里的12.5是怎么来的?
原子哥告诉我,ST固定死了的,咱们不用关心。
②、具体分析如下:
(1)我们的输入信号是50Hz (周期为20ms),初步定为1周期200个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个采样点间隔为 20ms /200 = 100 us
ADC可编程的通道采样时间我们选最小的 1.5 周期,则 ADC采样周期一周期大小为
100us /1.5=66us 。 ADC 时钟频率为 1/66us =15 KHz。
ADC可编程的通道采样时间我们选71.5 周期,则 ADC采样周期一周期大小为
(100us /71.5) 。 ADC 时钟频率为 7.15MHz。
(2)接下来我们要确定系统时钟:我们 用的是 8M Hz 的外部晶振做时钟源(HSE),估计得 经过  LL倍频  LL 倍频系数分别为2的整数倍,最大72 MHz。为了 提高数据计算效率,我们把系统时钟定为72MHz,(PLL 9倍 频)。则PCLK2=72MHz,PCLK1=36MHz;
我们通过设置时钟配置寄存器(RCC_CFGR) 中 有 为ADC 时钟提供一个专用的可编程预分器,将PCLK2 8 分频后作为ADC 的时钟,则可 知ADC 时钟频率为 9MHz
从手册可知: ADC 转换时间:
STM32F103xx 增强型产品:ADC 时钟为56MHz 时为1μs(ADC 时钟为72MHz 为1.17μs)
(3)由以上分析可知:不太对应,我们重新对以上内容调整,提出如下两套方案:
方案一:我们的输入信号是50Hz (周期为20ms),初步定为1周期2500个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个采样点间隔为 20ms /2500 = 8 us
ADC可编程的通道采样时间我们选71.5 周期,则 ADC采样周期一周期大小为
8us /71.5 。 ADC 时钟频率约为 9 MHz。
将PCLK2 8 分频后作为ADC 的时钟,则可知ADC 时钟频率为 9MHz
方案二:我们的输入信号是50Hz (周期为20ms),初步定为1周期1000个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个采样点间隔为 20ms /1000= 20 us
ADC可编程的通道采样时间我们选239.5周期,则 ADC采样周期一周期大小为
20us /239.5 。 ADC 时钟频率约为 12 MHz。
|