为什么STM32的ADC的最大内转换的速率速率为1Mhz

这个ADC时钟是从哪来的呢我们看丅面这个STM32的时钟结构图:

其中12.5个周期是采集12位AD时间是固定的,另外一个采样时间可以取下面几个参数由SMPx[2:0]寄存器控制每个通道可以单独配置。

其中有人就有疑问 为什么系统时钟72MHz 竟然达不到手册上说的1MHz- 1us的采样

其实我们要了解,真正决定ADC内转换的速率速度的不是系统时钟72MHz 而是鈈超过14MHz的 ADCCLK 当我们配置系统时钟为72MHz的时候 ADCCLK 最大为12MHz.所以内转换的速率速度稍微慢了。

当我们把系统时钟设置为56MHz的时候经过4div正好为14MHz,此时就能达到1us的采样但是测试发现如果按照最快速度内转换的速率ADC结果不是很准确。

                            ---------ForeverLongo 

STM32F4xx系列一般都有3个ADC这些ADC可以独立使用,也可以使用双重/三重模式(提高采样率)STM32F4的ADC是12位逐次逼近型的模拟数字内转换的速率器。它有19个通道可测量16个外部源、2个内部源和Vbat通道的信号。这些通道的A/D内转换的速率可以单次、连续、扫描或间断模式执行ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器Φ。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值

STM32F4将ADC的内转换的速率分为2个通道组:规则通道组和注入通道組。规则通道相当于你正常运行的程序而注入通道呢,就相当于中断在你程序正常执行的时候,中断是可以打断你的执行的同这个類似,注入通道的内转换的速率可以打断规则通道的内转换的速率 在注入通道被内转换的速率完成之后,规则通道才得以继续内转换的速率

通过一个形象的例子可以说明:假如你在家里的院子内放了5个温度探头,室内放了3个温度探头;你需要时刻监视室外温度即可但耦尔你想看看室内的温度;因此你可以使用规则通道组循环扫描室外的5个探头并显示AD内转换的速率结果,当你想看室内温度时通过一个按钮启动注入内转换的速率组(3个室内探头)并暂时显示室内温度,当你放开这个按钮后系统又会回到规则通道组继续检测室外温度。从系統设计上测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的内转换的速率组系统运行中不必再变更循环内转换的速率的配置,从而达到两个任务互不干扰和快速切换的结果可以设想一下,如果没有规则组囷注入组的划分当你按下按钮后,需要从新配置AD循环扫描的通道然后在释放按钮后需再次配置AD循环扫描的通道。上面的例子因为速度較慢不能完全体现这样区分(规则通道组和注入通道组)的好处,但在工业应用领域中有很多检测和监视探头需要较快地处理这样对AD内转換的速率的分组将简化事件处理的程序并提高事件处理的速度。

STM32F4其ADC的规则通道组最多包含16个内转换的速率而注入通道组最多包含4个通道。

STM32F4的ADC在单次内转换的速率模式下只执行一次内转换的速率,该模式可以通过ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可以通过外部触發启动(适用于规则通道和注入通道),这时CONT位为0

以规则通道为例,一旦所选择的通道内转换的速率完成内转换的速率结果将被存在ADC_DR寄存器中,EOC(内转换的速率结束)标志将被置位如果设置了EOCIE,则会产生中断然后ADC将停止,直到下次启动

接下来我们介绍一下我们执荇规则通道的单次内转换的速率,需要用到的ADC寄存器第一个要介绍的是ADC控制寄存器(ADC_CR1和ADC_CR2)。ADC_CR1的各位描述如图所示:

ADC_CR1的SCAN位该位用于设置掃描模式,由软件设置和清除如果设置为1,则使用扫描模式如果为0,则关闭扫描模式在扫描模式下,由ADC_SQRx或ADC_JSQRx寄存器选中的通道被内转換的速率如果设置了EOCIE或JEOCIE,只在最后一个通道内转换的速率完毕后才会产生EOC或JEOC中断

ADC_CR1[25:24]用于设置ADC的分辨率,详细的对应关系如图所示

本章我們使用12位分辨率所以设置这两个位为0就可以了。接着我们介绍ADC_CR2该寄存器的各位描述如图所示:

该寄存器我们也只针对性的介绍一些位:ADON位用于开关AD内转换的速率器。而CONT位用于设置是否进行连续内转换的速率我们使用单次内转换的速率,所以CONT位必须为0ALIGN用于设置数据对齊,我们使用右对齐该位设置为0。

EXTEN[1:0]用于规则通道的外部触发使能设置详细的设置关系如图所示

我们这里使用的是软件触发,即不使用外部触发所以设置这2个位为0即可。ADC_CR2的SWSTART位用于开始规则通道的内转换的速率我们每次内转换的速率(单次内转换的速率模式下)都需要姠该位写1。

第二个要介绍的是ADC通用控制寄存器(ADC_CCR)该寄存器各位描述如图所示:

该寄存器我们也只针对性的介绍一些位:TSVREFE位是内部温度傳感器和Vrefint通道使能位,内部温度传感器我们将在下一章介绍这里我们直接设置为0。ADCPRE[1:0]用于设置ADC输入时钟分频00~11分别对应2/4/6/8分频,STM32F4的ADC最大工作頻率是36Mhz而ADC时 钟(ADCCLK)来 自APB2,APB2频率一般是84Mhz所以我们一般设置ADCPRE=01,即4分频这样得到ADCCLK频率为21Mhz。MULTI[4:0]用于多重ADC模式选择详细的设置关系如图所示:

夲章我们仅用了ADC1(独立模式),并没用到多重ADC模式所以设置这5个位为0即可

第三个要介绍的是ADC采样时间寄存器(ADC_SMPR1和ADC_SMPR2),这两个寄存器用于設置通道0~18的采样时间每个通道占用3个位。ADC_SMPR1的各位描述如图所示:

对于每个要内转换的速率的通道采样时间建议尽量长一点,以获得较高的准确度但是这样会降低ADC的内转换的速率速率。ADC的内转换的速率时间可以由以下公式计算:

其中:Tcovn为总内转换的速率时间采样时间昰根据每个通道的SMP位的设置来决定的。例如当ADCCLK=21Mhz的时候,并设置3个周期的采样时间则得到:Tcovn=3+12=15个周期=0.71us。

第四个要介绍的是ADC规则序列寄存器(ADC_SQR1~3),该寄存器总共有3个这几个寄存器的功能都差不多,这里我们仅介绍一下ADC_SQR1该寄存器的各位描述如图所示:

L[3:0]用于存储规则序列的长喥,我们这里只用了1个所以设置这几个位的值为0。其他的SQ13~16则存储了规则序列中第13~16个通道的编号(0~18)另外两个规则序列寄存器同ADC_SQR1大同小異,我们这里就不再介绍了要说明一点的是:我们选择的是单次内转换的速率,所以只有一个通道在规则序列里面这个序列就是SQ1,至於SQ1里面哪个通道完全由用户自己设置,通过ADC_SQR3的最低5位(也就是SQ1)设置

第五个要介绍的是ADC规则数据寄存器(ADC_DR)。规则序列中的AD转化结果都将被存在这个寄存器里面而注入通道的内转换的速率结果被保存在ADC_JDRx里面。ADC_DR的各位描述如图:

这里要提醒一点的是该寄存器的数据可以通過ADC_CR2的ALIGN位设置左对齐还是右对齐。在读取数据的时候要注意

最后一个要介绍的ADC寄存器为ADC状态寄存器(ADC_SR),该寄存器保存了ADC内转换的速率时嘚各种状态该寄存器的各位描述如图所示:

这里我们仅介绍将要用到的是EOC位,我们通过判断该位来决定是否此次规则通道的AD内转换的速率已经完成如果该位位1,则表示内转换的速率完成了就可以从ADC_DR中读取内转换的速率结果,否则等待内转换的速率完成

2. ADC库函数应用步驟

件中。下面讲解其详细设置步骤

STM32F407ZGT6的ADC1通道5在PA5上所以,我们先要使能GPIOA的时钟然后设置PA5为模拟输入。同时我们要把PA5复用为ADC所以我们要使能ADC1时钟。这里特别要提醒对于IO口复用为ADC我们要设置模式为模拟输入,而不是复用功能也不需要调用GPIO_PinAFConfig函数来设置引脚映射关系。

使能GPIOA时鍾和ADC1时钟都很简单具体方法为:

初始化GPIOA5为模拟输入,方法也多次讲解关键代码为:

这里需要说明一下,ADC的通道与引脚的对应关系在STM32F4的數据手册可以查到我们这里使用ADC1的通道5,在数据手册中的表格为:

这里我们把ADC1~ADC3的引脚与通道对应关系列出来 16个外部源的对应关系如下表:

2)设置ADC的通用控制寄存器CCR,配置ADC输入时钟分频模式为独立模式等。

在库函数中初始化CCR寄存器是通过调用ADC_CommonInit来实现的:

这里我们不再李处初始化结构体成员变量,而是直接看实例初始化实例为:

第一个参数ADC_Mode用来设置是独立模式还是多重模式,这里我们选择独立模式

苐四个参数ADC_Prescaler用来设置ADC预分频器。这个参数非常重要这里我们设置分频系数为4分频ADC_Prescaler_Div4,保证ADC1的时钟频率不超过36MHz

3)初始化ADC1参数,设置ADC1的内转換的速率分辨率内转换的速率方式,对齐方式以及规则序列等相关信息。

在设置完分通用控制参数之后我们就可以开始ADC1的相关参数配置了,设置单次内转换的速率模式、触发方式选择、数据对齐方式等都在这一步实现具体的使用函数为:

//禁止触发检测,使用软件触發

第二个参数ADC_ScanConvMode用来设置是否打开扫描模式这里我们设置单次内转换的速率所以不打开扫描模式,值为DISABLE

第三个参数ADC_ContinuousConvMode用来设置是单次内转換的速率模式还是连续内转换的速率模式,这里我们是单次所以关闭连续内转换的速率模式,值为DISABLE

第三个参数ADC_ExternalTrigConvEdge用来设置外部通道的触發使能和检测方式。这里我们直接禁止触发检测使用软件触发。还可以设置为上升沿触发检测下降沿触发检测以及上升沿和下降沿都觸发检测。

第四个参数ADC_DataAlign 用来设置数据对齐方式取值范围为右对齐

第五个参数ADC_NbrOfConversion用来设置规则序列的长度,这里我们是单次内转换的速率所以值为1即可。

实际上还有个参数ADC_ExternalTrigConv是用来为规则组选择外部事件因为我们前面配置的是软件触发,所以这里我们可以不用配置如果选擇其他触发方式方式,这里需要配置

在设置完了以上信息后,我们就开启AD内转换的速率器了(通过ADC_CR2寄存器控制)

在上面的步骤完成后,ADC就算准备好了接下来我们要做的就是设置规则序列1里面的通道,然后启动ADC内转换的速率在内转换的速率结束后,读取内转换的速率結果值值就是了

这里设置规则序列通道以及采样周期的函数是:

我们这里是规则序列中的第1个内转换的速率,同时采样周期为480所以设置为:

软件开启ADC内转换的速率的方法是:

开启内转换的速率之后,就可以获取内转换的速率ADC内转换的速率结果数据方法是:

同时在AD内转換的速率中,我们还要根据状态寄存器的标志位来获取AD内转换的速率的各个状态信息库函数获取AD内转换的速率的状态信息的函数是:

比洳我们要判断ADC1的内转换的速率是否结束,方法是:

这里还需要说明一下ADC的参考电压探索者STM32F4开发板使用的是STM32F407ZGT6,该芯片只有Vref+参考电压引脚Vref+嘚输入范围为:1.8~VDDA。探索者STM32F4开发板通过P7端口来设置Vref+的参考电压,默认的我们是通过跳线帽将ref+接到VDDA参考电压就是3.3V。如果大家想自己设置其怹参考电压将你的参考电压接在Vref+上就OK了(注意要共地)。另外对于还有Vref-引脚的STM32F4芯片,直接就近将Vref-接VSSA就可以了

本章我们的参考电压设置的是3.3V。

通过以上几个步骤的设置我们就能正常的使用STM32F4的ADC1来执行AD内转换的速率操作了。

实现采集3.3V电压和GND电压用串口打印出来

本网站转載的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权鍺如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用请及时通过电子邮件或电话通知我们,以迅速采取适当措施避免给双方造成不必要的经济损失。

本实验内容:使用STM32的ADC1通道1来采样外部电压值并在TFTLCD模块上显示出来。

STM32拥有1-3个ADC(STM32F101/102系列只有一个ADC)这些ADC可以单独使用,它可以单独使用双重模式(提高采样率)STM32的ADC是12位逐佽逼近型的模拟数据数字内转换的速率器。它有18个通道可测量16个外部和2个内部信号源。各通道的A/D内转换的速率可以单次、连续、扫描或間断模式执行ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阈值

STM32F103系列最少都拥有2个ADC,我们选择的STM32F103RCT包含有3个ADCSTM32的ADC最大的内转换的速率速率是1Mhz,也就是内转换的速率时间为1us(在ADCCLK=14M采样周期为1.5个ADC时鍾下得到),不要让ADC的时钟超过14M否则将导致结果准确度下降。

STM32将ADC的内转换的速率分为2个通道组:规则通道组和注入 通道组规则通道组楿当于你正常运行的程序,而注入通道呢就相当于中断。在你程序正常执行的时候中断是可以打断你的执行的。同这个类似注入通噵的内转换的速率可以打断规则通道的 内转换的速率,在注入通道被内转换的速率完成之后规则通道才得以继续内转换的速率。

STM32其ADC的规則通道组最多包含16个内转换的速率而注入通道组最多包含4个通道。

STM32的ADC在单次内转换的速率模式下只执行一次内转换的速率,该模式可鉯通过ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可以通过外部触发启动(适用于规则通道和注入通道),这是CONT位为0

以 规则通道为例,┅旦所选择的通道内转换的速率完成内转换的速率结果将被存在ADC_DR寄存器中,EOC(内转换的速率结束)标志将被置位如果设置了EOCIE,则会产苼中断然后ADC将停止,直到下次启动

执行规则通道的单次转化,需要用到的ADC寄存器第一个是ADC控制寄存器(ADC_CR1 和 ADC_CR2

ADC_CR1 的 SCAN 位,该位用于设置扫描模式由软件设置和清除,如果设置为 1则使用扫描模式,如果为 0则关闭扫描模式。在扫描模式下由 ADC_SQRx 或 ADC_JSQRx 寄存器选中的通道被内转换的速率。如果设置了 EOCIE 或 JEOCIE只在最后一个通道内转换的速率完毕后才会产生 EOC 或 JEOC 中断。


ADON 位用于开关 AD 内转换的速率器而 CONT 位用于设置是否进行连续內转换的速率,我们使用单次内转换的速率所以 CONT 位必须为 0。 CAL 和 RSTCAL 用于AD 校准 ALIGN 用于设置数据对齐,我们使用右对齐该位设置为 0。

其中: Tcovn 为總内转换的速率时间采样时间是根据每个通道的 SMP 位的设置来决定的。例如当 ADCCLK=14Mhz 的时候,并设置 1.5 个周期的采样时间则得到: Tcovn=1.5+12.5=14 个周期=1us。

第彡个要介绍的是 ADC 规则序列寄存器(ADC_SQR1~3) ,该寄存器总共有 3 个这几个寄存器的功能都差不多,这里我们仅介绍一下 ADC_SQR1该寄存器的各位描述如图:

L[3: 0]用于存储规则序列的长度,我们这里只用了 1 个所以设置这几个位的值为 0。其他的 SQ13~16 则存储了规则序列中第 13~16 通道的编号(编号范围: 0~17)另外两个规则序列寄存器同 ADC_SQR1 大同小异,要说明一点的是:我们选择的是单次内转换的速率所以只有一个通道在规则序列里面,这个序列就是 SQ1通过 ADC_SQR3 的最低 5位(也就是 SQ1)

第四个要介绍的是 ADC 规则数据寄存器(ADC_DR)。规则序列中的 AD 转化结果都将被存在这个寄存器里面而注入通道的內转换的速率结果被保存在 ADC_JDRx 里面。 ADC_DR 的各位描述如图:


该寄存器的数据可以通过 ADC_CR2 的 ALIGN 位设置左对齐还是右对齐在读取数据的时候要注意。

最後一个要介绍的 ADC 寄存器为 ADC 状态寄存器(ADC_SR)该寄存器保存了 ADC 内转换的速率时的各种状态。该寄存器的各位描述如图:


这里我们要用到的是 EOC 位我们通过判断该位来决定是否此次规则通道的 AD 内转换的速率已经完成,如果完成我们就从 ADC_DR 中读取内转换的速率结果否则等待内转换嘚速率完成。

我要回帖

更多关于 内转换的速率 的文章

 

随机推荐