zoukankan      html  css  js  c++  java
  • 12-STM32 ADC原理

    STM32F1 ADC

    STM32的ADC注意点:

    (1)STM32f103 系列有 3 个 ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道。其中ADC1 和 ADC2 都有 16 个外部通道,ADC3 根据CPU 引脚的不同通道数也不同,一般都有8 个外部通道。

    (2)ADC的输入时钟规定不得超过14MHz,它是由PCLK2经分频产生。
    (3)单次:触发一次转换一次;单通道:每次触发只转换一条通道;单通道单次转换,多通道单次转换,单通道连续转换,多通道连续转换。

    (4)在单模式下,ADC1/2/3 都不使用高 16 位,高 16 位是在 ADC1 中双模式下保存 ADC2 转换的规则数据

    (5)规则通道可以有 16 个这么多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数据就全部都挤在了 DR 里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉,所以当通道转换完成后就应该把数据取走,或者开启 DMA 模式,把数据传输到内存里面,不然就会造成数据的覆盖。最常用的做法就是开启 DMA 传输。

    (6)注入数据寄存器ADC_JDRx 是 32 位的,低 16 位有效,高 16 位保留,数据同样分为左对齐和右对齐

    (7)注入序列的转换顺序和规则组的不同(编程时需要注意)

    (8)只有 ADC1 和 ADC3 可以产生 DMA 请求

    (9)内部参照电压VREFINT与参考电压不是一回事

    (10)用来做 ADC 输入的 IO 不能被复用,否则会导致采集到的信号不准确

    (11)DMA请求:ADC1对应DMA1通道1,ADC3对应DMA2通道5

    ADC的三个电压:(输入电压,参考电压,供电电压)

    (1)输入电压
    ADC 输入范围为:V REF- ≤ V IN ≤ V REF+ 。由 V REF- 、V REF+ 、V DDA 、VSSA 这四个外部引脚决定。

    (2)供电电压

    F103系列单片机的内部高速RC 振荡器(HSI)由VDDA、VSSA 供电,故即使不使用单片机自带的A/D 转换器,也必须保证VDDA、VSSA 的供电,否则STM32F103单片机不能正常启动。

      

     (3)参考电压

    如果有VREF-引脚(根据封装而定),它必须连接到VSSA。
    100脚和144脚封装: 确保输入为低压时获得更好精度,用户可以连接一个独立的外部参考电压ADC到V REF+和V REF-脚上。在V REF+的电压范围为2.4V~V DDA。
    64脚或更少封装:     没有V REF+和V REF-引脚,他们在芯片内部与ADC的电源(V DDA )和地(V SSA )相联。
    Ex:
    V SSA 和V REF- 接地,把V REF+ 和V DDA 接3V3,得到ADC的输入电压范围为:0~3.3V。
    如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V,这样 ADC 就可以测量了。

     

    注意:内部参照电压VREFINT与参考电压不是一回事

    ADC的参考电压都是通过Vref+提供的并作为ADC转换器的基准电压。

    根据数据手册中的数据,这个参照电压的典型值是1.20V,最小值是1.16V,最大值是1.24V。这个电压基本不随外部供电电压的变化而变化。

    注:VREFINT=1.2V,VREF为参考电压值=3.3V

    当我们使用的Vref+是直接取自用VCC电压时,当VCC电压波动比较大时或稳压性能比较差时,可以借用STM32的内部参照电压VREFINT校正测量精度。

    以测量1通道的电压值为例,先读出参照电压的ADC测量结果,记为Adre; 再读出要测量通道1的ADC转换结果,记为ADch1;
    则要测量的电压为:Vch1 = VREFINT* (((ADch1*(VREF/4096))/(ADre*(VREF/4096)))

    公式简化: Vch1 = VREFINT*(ADch1/ADre) 
    这种方法等于变相将内部参照电压VREFINT当成是ADC参考电压,也就是说,此时Vref参考电压的准确度已在此已对结果影响不大了,ADC的转换结果基本由VREFINT的精度决定。

    注:一般情况下,这种办法只适合于当Vref+参考电压(其实也就是VCC电压)离散性实在太差的情况下使用。
     


    输入通道(将输入电压输入进去ADC中进行采样)

     

    我们确定好 ADC 输入电压之后,那么电压怎么输入到 ADC?

    STM32 的 ADC 多达 18 个通道,其中外部的 16 个通道就是框图中的 ADCx_IN0...ADCx_IN5。这 16 个通道对应着不同的 IO 口
    其中ADC1/2/3还有内部通道:ADC1的通道16连接到了芯片内部的温度传感器, Vrefint 连接到了通道 17
    ADC2 的模拟通道 16 和 17 连接到了内部的 VSS。
    ADC3 的模拟通道 9、14、15、16 和 17 连接到了内部的 VSS。


    外部的 16 个通道在转换的时候又分为规则通道和注入通道:

    规则通道:就是很规矩的意思,我们平时一般用到的都是这个通道
    注入通道: 注入,可以理解为插入,插队的意思,是一种不安分的通道。如果在规则通道转换过程中,有注入通道插队,那么就要先转换完注入通道,等注入通道转换完成后,再回到规则通道的转换流程(类似中断)。所以,注入通道只有在规则通道存在时才会出现。

    规则通道最多有 16路,注入通道最多有 4 路。

    转换顺序
    规则序列转换顺序:规则序列寄存器有 3 个,分别为 SQR3、SQR2、SQR1
    SQR3 控制着规则序列中的第一个到第六次转换,对应的位为:SQ1[4:0]~SQ6[4:0]
    SQR2 控制着规则序列中的第7个到第12次转换
    SQR1 控制着规则序列中的第13个到第16次转换
    Ex: 如果通道 16 想第一次转换,那么在 SQ1[4:0]写 16 即可

    ★具体使用多少个通道,由 SQR1 的位SQL[3:0]决定,最多 16 个通道。

    注入序列转换顺序:

    注入序列寄存器 JSQR 只有一个,最多支持 4 个通道,具体多少个通道需要转换由 JSQR 的JL[1:0]决定。
    ★如果JL的值小于4 的话,则 JSQR 跟 SQR 决定转换顺序的设置不一样,第一次转换的不是 JSQR1[4:0],而是 JCQRx[4:0] ,x = (4-JL);

    如果 JL=00(1 个换),那么转换的顺序是从 JSQR4[4:0]开始,而不是从 JSQR1[4:0]开始,这个要注意,编程的时候不要搞错

    ★当 JL 等于 4 时,跟 SQR 一样

     

    触发源

    通道选好了,转换的顺序也设置好了,那接下来就该开始转换了。
    ①ADC 转换可以由ADC控制寄存器2:ADC_CR2 的 ADON 这个位来控制。
    ADON=1 --开始转换
    ADON=0 --停止转换

    ②ADC 还支持触发转换,这个触发包括内部定时器触发和外部 IO 触发。
    选择哪一种触发源,由ADC 控制寄存器2:ADC_CR2 的EXTSEL[2:0] 和 JEXTSEL[2:0]位来控制。 EXTSEL[2:0]用于选择规则通道的触发源 ,JEXTSEL[2:0]用于选择注入通道的触发源。选定好触发源之后,触发源是否要激活,则由ADC 控制寄存器 2:ADC_CR2 的 EXTTRIG 和 JEXTTRIG 这两位来激活。
    其中ADC3的规则转换和注入转换的触发源与 ADC1/2 的有所不同。

    转换时间

     

    ADC输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大不超过 14M(数字量化需要时间,太快准确率会下降),分频因子由 RCC 时钟配置寄存器 RCC_CFGR 的位 15:14 ADCPRE[1:0]设置,可以是 2/4/6/8 分频

    采样时间:(采样周期越短,ADC转换数据输出周期就越短但数据精度也越低,采样周期越长ADC转换数据输出周期就越长同时数据精度越高)   
    ADC使用若干个ADC_CLK周期对输入的电压进行采样,采样的周期数可通过 ADC 采样时间寄存器 ADC_SMPR1 和 ADC_SMPR2 中的 SMP[2:0]位设置:ADC_SMPR2 控制的是通道 0~9, ADC_SMPR1 控制的是通道 10~17。
    每个通道可以分别用不同的时间采样。其中采样周期最小是 1.5 个,即如果我们要达到最快的采样,那么应该设置采样周期为 1.5 个周期,这里说的周期就是 1/ADC_CLK

    ADC 的转换时间:与 ADC 的输入时钟和采样时间有关,公式为:Tconv=采样时间 +12.5 个周期。当 ADCLK = 14MHZ(规定的最高),采样时间设置为 1.5 周期(最快),那么总的转换时间(最短)Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 14×1/ADC_CLK =1 us。

    由于ADC时钟不超过14M,则分频系数只能设置为6和8,当设置为6时 ADC 预分频器能分频到最大的时钟只能是 12M,采样周期设置为 1.5 个周期,算出最短的转换时间为 1.17us,这个才是最常用的。

    数据寄存器


    一切准备就绪后,ADC 转换后的数据根据转换组的不同,规则组的数据放在 ADC_DR寄存器,注入组的数据放在 JDRx。

    规则数据寄存器
    ADC 规则组数据寄存器 ADC_DR 只有一个,是一个 32 位的寄存器,低 16 位在单 ADC时使用(在单模式下,ADC1/2/3 都不使用高 16 位),高 16 位是在 ADC1 中双模式下保存 ADC2 转换的规则数据。
    双模式就是 ADC1 和ADC2 同时使用。

    因为 ADC 的精度是 12 位,无论 ADC_DR 的高 16 或者低 16 位都放不满,只能左对齐或者右对齐,具体是以哪一种方式存放,由 ADC_CR2 的 11 位 ALIGN 设置。

    规则通道可以有 16 个这么多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数据就全部都挤在了 DR 里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉,所以当通道转换完成后就应该把数据取走,或者开启 DMA 模式,把数据传输到内存里面,不然就会造成数据的覆盖。最常用的做法就是开启 DMA 传输。 

    注入数据寄存器
    注入数据寄存器 ADC 注入组最多有 4 个通道,刚好注入数据寄存器也有 4 个,每个通道对应着自己的寄存器,不会跟规则寄存器那样产生数据覆盖的问题。ADC_JDRx 是 32 位的,低 16 位有效,高 16 位保留,数据同样分为左对齐和右对齐,具体是以哪一种方式存放,由ADC_CR2 的 11 位 ALIGN 设置。

    中断
    利用 ADC 转换完成中断可以非常方便的保证我们读取到的数据是转换完成后的数据而不用担心该数据可能是ADC正在转换时“不稳定”的数据。


    转换结束中断 :
    数据转换结束后,可以产生中断,中断分为三种:
    1)规则通道转换结束中断
    2)注入通道转换结束中断
    3)模拟看门狗中断
    其中转换结束中断很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能位,我们还可以根据中断类型写相应配套的中断服务程序。

    模拟看门狗中断
    当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由 ADC_LTR 和 ADC_HTR 设置。例如我们设置高阈值是 2.5V,那么模拟电压超过 2.5V 的时候,就会产生模拟看门狗中断,反之低阈值也一样。

    DMA 请求

    规则和注入通道转换结束后,除了产生中断外,还可以产生 DMA 请求,把转换好的数据直接存储在内存里面。要注意的是只有 ADC1 和 ADC3 可以产生 DMA 请求。一般我们在使用 ADC 的时候都会开启 DMA 传输。

    ADC1对应DMA1通道1,ADC3对应DMA2通道5


    https://blog.csdn.net/bianjingshan/article/details/56478999


    电压转换
    我们一般在设计原理图的时候会把 ADC 的输入电压范围设定在:0~3.3v,因为 ADC是 12 位的,那么 12 位满量程对应的就是 3.3V,12 位满量程对应的数字值是:2^12。

    数值0 对应的就是 0V。如果转换后的数值为 X ,X 对应的模拟电压为 Y,那么会有这么一个等式成立: Y = (3.3 * X ) / 2^12。

  • 相关阅读:
    调用其他类的方法
    CString中 format、trimLeft和trimright、trim 和FindOneOf用法
    GetAsyncKeyState()& 0x8000
    C++打开剪切板,获取剪切板数据
    CString比较不区分大小写
    C++ string中find() 用法
    CString数组和CStringArray
    nested exception is java.io.FileNotFoundException: Could not open ServletContext resource
    SQLPlus获取oracle表操作SQL
    XShell实现服务器端文件的上传下载
  • 原文地址:https://www.cnblogs.com/darren-pty/p/14020247.html
Copyright © 2011-2022 走看看