STM32 | STM32CubeMX基础之ADC

一、ADC框图

  1. ADC输入电源

2. 输入通道

这16个通道对应着不同的IO口,此外 ADC1 的通道 16 连接到了芯片内部的温度传感器,通道 17连接到了VRefInt(内部参照电压)。

3. 规则通道与注入通道
a)规则通道组:

i)相当正常运行的程序。最多16个通道。规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中。

ii)规则通道中的转换顺序由三个寄存器控制:SQR1、SQR2、SQR3,它们都是32位寄存器。SQR寄存器控制着转换通道的数目和转换顺序,只要在对应的寄存器位SQx中写入相应的通道,这个通道就是第x个转换。

b)注入通道组:

i)相当于中断。最多4个通道。注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的JL[1:0]中。

ii)和规则通道转换顺序的控制一样,注入通道的转换也是通过注入寄存器来控制,只不过只有一个JSQR寄存器来控制。

4. 规则通道与注入通道

ADC需要一个触发信号来实行模/数转换,其一就是通过直接配置寄存器触发,通过配置控制寄存器CR2的ADON位,写1时开始转换,写0时停止转换。另外,还可以通过内部定时器或者外部IO触发转换,也就是说可以利用内部时钟让ADC进行周期性的转换,也可以利用外部IO使ADC在需要时转换,具体的触发由控制寄存器CR2决定。

5.转换时间

ADC的每一次信号转换都要时间,这个时间就是转换时间,转换时间由输入时钟和采样周期来决定。

a)输入时钟

由于ADC在STM32中是挂载在APB2总线上的,所以ADC得时钟是由PCLK2经过分频得到的。

b)采样周期

ADC预分频器的ADCCLK是ADC模块的时钟来源。通常,由时钟控制器提供的ADC_CLK时钟和PCLK2(APB2时钟)同步。RCC控制器为ADC时钟提供一个专用的可编程预分频器。 分频因子由RCC_CFGR的ADCPRE[1:0]配置,可配置2/4/6/8分频。

为了保证ADC转换结果的准确性,ADC的时钟最好不超过14M。

T = 采样时间 + 12.5个周期,其中1周期为1/ADC_CLK

例如,当 ADC_CLK=14Mhz 的时候,并设置 1.5 个周期的采样时间,则得到: Tcovn=1.5+12.5=14 个周期=1us。

6.数据寄存器

转换完成后的数据就存放在数据寄存器中,但数据的存放也分为规则通道转换数据和注入通道转换数据的。

a)规则数据寄存器

规则数据寄存器负责存放规则通道转换的数据,通过32位寄存器ADC_DR来存放。当使用ADC独立模式(也就是只使用一个ADC,可以使用多个通道)时,数据存放在低16位中,当使用ADC多模式时高16位存放ADC2的数据。需要注意的是ADC转换的精度是12位,而寄存器中有16个位来存放数据,所以要规定数据存放是左对齐还是右对齐。

当使用多个通道转换数据时,会产生多个转换数据,然而数据寄存器只有一个,多个数据存放在一个寄存器中会覆盖数据导致ADC转换错误,所以我们经常在一个通道转换完成之后就立刻将数据取出来,方便下一个数据存放。一般开启DMA模式将转换的数据,传输在一个数组中,程序对数组读操作就可以得到转换的结果。

b)注入数据寄存器

7.数据寄存器

a)规则通道转换完成中断

规则通道数据转换完成之后,可以产生一个中断,可以在中断函数中读取规则数据寄存器的值。这也是单通道时读取数据的一种方法。

b)注入通道转换完成中断

注入通道数据转换完成之后,可以产生一个中断,并且也可以在中断中读取注入数据寄存器的值,达到读取数据的作用。

c)模拟看门狗事件

当输入的模拟量(电压)不再阈值范围内就会产生看门狗事件,就是用来监视输入的模拟量是否正常。

以上中断的配置都由ADC_SR寄存器决定:


链接:STM32—ADC详解_stm32adc功能详解_Aspirant-GQ的博客-CSDN博客

二、ADC的转换模式

1. 单次转换模式

ADC只执行一次转换;

2. 连续转换模式(Continuous Conversion Mode)

转换结束之后马上开始新的转换;

3. 扫描模式(Scan Conversion Mode)

ADC扫描被规则通道和注入通道选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续 转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

扫描模式简单的说是一次对所有所选中的通道进行转换,比如开了ch0、ch1、ch4、ch5。ch0转换完以后就会自动转换通道1、4、5直到转换完这个过程不能被打断。如果开启了连续转换模式,则会在转换完ch5之后开始新一轮的转换。

4. 间断模式(Discontinuous Conversion Mode)

触发一次,转换一个通道,在触发,在转换。在所选转换通道循环,由触发信号启动新一轮的转换,直到转换完成为止。

间断模式可以说是对扫描模式的一种补充。它可以把0、1、4、5这四个通道进行分组。可以分成0、1一组,4、5一组。也可以每个通道单独配置为一组。这样每一组转换之前都需要先触发一次。

三、ADC单通道与多通道

  1. ADC单通道

只进行一次ADC转换:配置为“单次转换模式”,扫描模式关闭。ADC通道转换一次后,就停止转换。等待再次使能后才会重新转换。

进行连续ADC转换:配置为“连续转换模式”,扫描模式关闭。ADC通道转换一次后,接着进行下一次转换,不断连续。

  1. ADC多通道

只进行一次ADC转换:配置为“单次转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,就停止转换。等待再次使能后才会重新转换。

进行连续ADC转换:配置为“连续转换模式”,扫描模式使能。ADC的多个通道,按照配置的顺序依次转换一次后,接着进行下一次转换,不断连续。

需要注意的是,如果开启了多通道ADC,需要将每次转换的数据及时取出,否则会被后面的的数据覆盖掉。


链接:https://blog.csdn.net/as480133937/article/details/99627062

四、不同通道ADC采样不同引脚的电压示例

  1. STM32CubeMX设置

  1. 主函数
    while (1)
    {

        int16_t adcBuf[2];
        for(int i=0;i<2;i++)
        {
            HAL_ADC_Start(&hadc1);
            HAL_ADC_PollForConversion(&hadc1,50);
            adcBuf[i]=HAL_ADC_GetValue(&hadc1);
            printf("adc %d = %d \r\n",i,adcBuf[i]);
        }
        HAL_ADC_Stop(&hadc1);
        HAL_Delay(1000);
    }
  1. 配置分析

分析配置成这样的模式,扫描模式是在配置为多个通道必须打开的,CubeMX上也默认好了,只能使能。单次转换模式是我不需要不停的去采集每个通道值,而是把两个通道采集完以后就让它停止。间断模式可以让扫描的两个通道进行分成两个组,CubeMX参数里面Number of Discontinous Conversions是配置间断组每个组有几个通道的,这里必须配置为1(否则在获取ad值得时候只能读取到每个间断组最后一个通道)。


链接:https://blog.csdn.net/qq_35241004/article/details/120165458

  1. 输出结果

这里将PC4引脚连接到了GND,PC5引脚连接到了3.3V。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 | STM32CubeMX基础之ADC

发表评论