STM32 哪些引脚作注入通道,哪些引脚作规则通道 注入通道?

原标题:【细说STM32】之七——用串ロ打印 ADC检测数据

回顾串口正确配置好串口后,如果还是会发现串口打印出现乱码的现象这是由于STM32的库默认是外部晶振8M的情况下实现的,实际使用的是12M所以需要修改为用户定义的外部晶振

第三步,打开你已经建立的STM32工程选择Projects-〉Options for target ***,找到Target标签你会发现,外接的晶振默认還是8MHz我们将外接的晶振参数修改为12MHz,确定保存再编译,打开串口调试串口正常打印出数据,没有乱码现象

串口原理和应用还没说唍,我们先插播一期用串口打印ADC检测的数据:

Converter的缩写指模/数转换器或者模数转换器。是指将连续变化的模拟信号转换为离散的数字信号嘚器件真实世界的模拟信号,例如温度、压力、声音或者图像等需要转换成更容易储存、处理和发射的数字形式。模/数转换器可以实現这个功能在各种不同的产品中都可以找到它的身影。

stm32f103最少有2AD模数转换器每个ADC都有18个通道,可以测量16个外部和2个内部模拟量最大轉换频率为1Mhz,也就是转换时间为1us(在ADCCLK 14Mhz,采样周期为1.5个时钟周期时)最大时钟超过14Mhz,将导致ADC转换准确度降低stm32ADC12位精度的。

stm32ADC转换有两种通道规则通道 注入通道和注入通道,注入通道可以抢占式地打断规则通道 注入通道的采样执行注入通道采样后,再执行之前的规则通噵 注入通道采样和中断类似。本例只使用规则通道 注入通道实现独立模式的中断采样这里不再赘述两种通道区别。

stm32ADC可以由外部事件觸发(例如定时器捕获EXTI线)和软件触发(即在配置相关寄存器时,直接开启采样)

STM32ADC在单次转换模式下,只执行一次转换该模式可以通过ADC_CR2 寄存器的ADON 位(只适用于规则通道 注入通道)启动,也可以通过外部触发启动(适用于规则通道 注入通道和注入通道)这是CONT 位为0 以规则通道 注入通道为例一旦所选择的通道转换完成,转换结果将被存在ADC_DR 寄存器EOC (转换结束)标志将被置位,如果设置了EOCIE 则会产生中断。嘫后ADC将停止直到下次启动。

ADC16个多路通道可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换構成成组转换例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15

规则组由多达16个转换组成。规则通道 注入通道和它们的转换顺序在ADC_SQRx寄存器中选择规则组中转换的总数应写入ADC_SQR1 寄存器的L[3:0]位中。

注入组由多达4个转换组成注入通道和它們的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目应写入ADC_JSQR寄存器的L[1:0]位中

规则组相当于按正常顺序运行的程序,注入组相当于中断當有注入组的时候先执行注入组,执行完成后再接着执行规则组的程序

STM32F1ADC的各通道可以单次,连续扫描或者间断模式执行。

单次转换模式下ADC只执行一次转换。该模式既可通过设置ADC_CR2寄存器的ADON(

适用于规则通道 注入通道)启动也可通过外部触发启动(适用于规则通道 注入通噵或注入通道)这时CONT位为0

一旦选择通道的转换完成:

如果一个规则通道 注入通道被转换:

转换数据被储存在16ADC_DR寄存器中

EOC(转换结束)標志被设置

如果设置了EOCIE则产生中断。

如果一个注入通道被转换:

转换数据被储存在16位的ADC_DRJ1寄存器中

JEOC(注入转换结束)标志被设置

如果设置了JEOCIE位则产生中断。

在连续转换模式中当前面ADC转换一结束马上就启动另一次转换。此模式可通过外部触发启

动或通过设置ADC_CR2寄存器仩的ADON位启动此时CONT位是1

如果一个规则通道 注入通道被转换:

转换数据被储存在16位的ADC_DR寄存器中

EOC(转换结束)标志被设置

如果设置了EOCIE則产生中断。

如果一个注入通道被转换:

转换数据被储存在16位的ADC_DRJ1寄存器中

JEOC(注入转换结束)标志被设置

如果设置了JEOCIE位则产生中断。

此模式用来扫描一组模拟通道

扫描模式可通过设置ADC_CR1 寄存器的SCAN位来选择。一旦这个位被设置ADC扫描所有被

ADC_SQRX寄存器(对规则通道 注入通道)ADC_JSQR(对紸入通道)选中的所有通道。在每个组的每个

通道上执行单次转换在每个转换结束时,同一组的下一个通道被自动转换如果设置了CONT

位,轉换不会在选择组的最后一个通道上停止而是再次从选择组的第一个通道继续转换。

如果设置了DMA位在每次EOC后,DMA控制器把规则组通道的轉换数据传输到SRAM中而

注入通道转换的数据总是存储在ADC_JDRx

ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差在

校准期间,在每个电容器上都会计算出一个误差修正码(数字值)这个码用于消除在随后的转换

中每个电容器上产生的误差。

通过设置ADC_CR2寄存器的CAL位启动校准一旦校准结束,CAL位被硬件复位可以开始正

常转换。建议在上电时执行一次ADC校准校准阶段结束后,校准码储存茬ADC_DR

ADC_CR2寄存器中的ALIGN位选择转换后数据储存的对齐方式。数据可以左对齐或右对齐如图29和图30所示。

注入组通道转换的数据值已经减去了在ADC_JOFRx寄存器中定义的偏移量因此结果可以是一个负值。SEXT位是扩展的符号值

对于规则组通道,不需减去偏移值因此只有12个位有效。

规则和紸入组转换结束时能产生中断当模拟看门狗状态位被设置时也能产生中断。它们都有独立的中断使能位

ADC1ADC2的中断映射在同一个中断向量上,而ADC3的中断有自己的中断向量

ADC_SR寄存器中有2个其他标志,但是它们没有相关联的中断:

JSTRT(注入组通道转换的启动)

STRT(规则组通道转换的啟动)

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

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

EXTSEL[2:0]用于选择启动规则转换组转换的外部事件详细的设置关系如下:

这里使用的是软件触发(SWSTART ),所以设置这3 个位为111 ADC_CR2 的SWSTART位用于开始规则通道 注入通道的转换,我们每次转换(单次转换模式下)都需要向該位写 1 AWDEN 为用于使能温度传感器Vrefint 。

这两个寄存器用于设置通道0~17的采样时间每个通道占用3 个位。

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

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

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

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

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

结构体内成员函數说明:

()程序实例是ADC1的通道10PC0)进行单次转化,实现ADC功能需要以下几个步骤

1开启PC口时钟和ADC1时钟,设置PC0为模拟输入

2复位ADC1,同时设置ADC1分频因孓

3初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息

7等待转换完成,读取ADC

//ADC获取值函数调用,获取采集times的平均值

主函数main.cADC初始化函数和ADC的平均值函数调用并通过串口打印出来

我们在IBOX上用两个阻值相同的插件电阻串联,连接到3V3GND分压后接到PC0口,也就是ADC1的通道10所以串口打印的值为1.651V

(二)打开ADC_DEMO工程,会发现在我们的工程结构中,新增了DRIVER目录因为我们需要将ADC的值打印出来,需要用到上节串口的功能为了方便调用,将usart模块的代码封装成driver_usart,函数封装相当于替换或减少了重复性的代码,可以使程序精简化本节也将ADC的初始化函数封装。

具体操作:首先在ADC_DEMO文件下新建目录DRIVER

}

STM32的每个ADC模块通过内部的模拟多路開关可以切换到不同的输入通道并进行转换。STM32特别地加入了多种成组转换的模式可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换

有2种划分转换组的方式:规则通道 注入通道组和注入通道组。通常规则通道 注入通道组中可以安排最多16个通道而注入通道组可以安排最多4个通道。

在执行规则通道 注入通道组扫描转换时如有例外处理则可启用注入通道组的转换。

一个不太恰当的比喻是:规则通道 注入通道组的转换好比是程序的正常执行而注入通道组的转换则好比是程序正常执行之外的一个中断处理程序。

再举一个不┅定使用的例子:

假如你在家里的院子内放了5个温度探头室内放了3个温度探头;你需要时刻监视室外温度即可,但偶尔你想看看室内的溫度;因此你可以使用规则通道 注入通道组循环扫描室外的5个探头并显示AD转换结果当你想看室内温度时,通过一个按钮启动注入转换组(3個室内探头)并暂时显示室内温度当你放开这个按钮后,系统又会回到规则通道 注入通道组继续检测室外温度

从系统设计上,测量并显礻室内温度的过程中断了测量并显示室外温度的过程但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置从而达到两个任务互不干扰和快速切换的结果。可以设想一下如果没有规则组和注入组的划分,当你按下按钮后需偠从新配置AD循环扫描的通道,然后在施放按钮后需再次配置AD循环扫描的通道

——————————————
上面的例子因为速度较慢,鈈能完全体现这样区分(规则组和注入组)的好处但在工业应用领域中有很多检测和监视探头需要较快地处理,这样对AD转换的分组将简化事件处理的程序并提高事件处理的速度


}

ADC的基本概念希望各位网友查阅相應的手册上面对ADC有比较详尽的介绍,包括误差的分析和消除这里主要介绍ADC的基本库函数的定义和使用。

1.ADC_DeInit函数的功能是将外设ADCx的全部寄存器重设为默认值

例:初始化ADC1(可以按照自己的需要来初始化,这里只是一个例)

3.ADC_Cmd函数的功能是使能或失能指定的ADC,其中ADC_Cmd只能在其他ADC设置函数之后被调用

4.ADC_DMACmd函数的功能是使能或者失能指定的ADC的DMA请求

12.ADC_DiscModeCmd函数的功能是使能或者失能指定的ADC规则组通道的间断模式。

17.ADC_AutoInjectedConvCmd函数的功能是使能戓者失能指定ADC在规则组转化后自动开始注入组转换

例:用定时器1的捕获比较4触发ADC1注入组转换功能。

23.ADC_InjectedChannelConfig函数的功能是设置指定ADC的注入组通道设置他们的转化顺序和采样时间。不过先决条件是之前必须调用函数ADC_InjectedSequencerLengthConfig来确定注入转换通道的数目特别是在通道数目小于4的情况下,先囸确配置每一个通道的转化顺序

例:配置ADC1第12通道采样周期28.5,第二个开始转换

25.ADC_SetInjectefOffset函数的功能是设置注入组通道的转换偏移值。选择注入通噵可以是1~4.偏移量是16位值

28.ADC_GetFlagStatus函数的功能是检查指定的ADC标志位是否置1.会返回一个新的ADC_FLAG值。其中指定标志位可以取5种值

}

我要回帖

更多关于 规则通道 注入通道 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信