STM32 ADC数模转换小笔记

  • STM32数模转换:
  1. ADC(Analog-Digital Converter)模拟-数字转换器
  2. ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
  3. 12逐次逼近型ADC,1us转换时间 
  4. 分辨率:一般用多少位来表示,例如:12位AD值,它的表示范围是0 ~ 212-1(0~4095)
  5. 转换时间(转换频率):AD转换是需要一小段时间的,这里的1us就表示从AD转换开始到产生结果,需要1us时间,对应的AD转换频率就是1MHz.
  6. 输入电压范围:0~3.3V负极到正极之间变化),转换结果范围:0~4095经过转换后0V对应0,3,3V对应4095)中间都是一一对应的线性关系0~3,3(0~4095)。
  7. 18个输入通道,可测量16个外部2个内部信号源16个外部信号源就是:16个GPIO口,在引脚直接接模拟信号就行,不需要额外电路,引脚就直接能测电压。
  8. 2个内部信号源就是:内部温度传感器内部参考电压,温度传感器可以测量CPU的温度;内部参考电压是一个1,2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的,可以读取这个基准电压进行校准,左右就能得到正确的电压值。
  9. 规则组和注入组两个转换单元
  10. Stm32的ADC可以列一个组,一次性启动一个组,连续转换多个值,并且有两个组,一个是用于常规的规则组另一个是用于突发事件的注入组。                                                                                                                                     
  11. 模拟看门狗自动监测输入电压范围   
  12. 这个ADC可以用于测量光线强度,温度,并且经常有个需求,就是如果光线、温度高于某个阈值,低于某个阈值,执行一些操作,这个操作可以用模拟看门狗进行检测。
  13. STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

  • 逐次逼近型ADC:

  1. 这三个参数的部分相当于一个可通过模拟信号的数据选择器

IN1~8:输入通道

ADDA~C:选中通道的通道号放在这三个引脚上

ALE:锁存信号

  1. SAR逐次逼近寄存器部分

比较器:一端是待测电压,一端接在DAC(数模转换,即给一个数据可以测出数据对应的电压)上。它两同时输入到电压比较器里,进行大小判断,通过调节DAC的电压,直到DAC输出的电压,与外部通道输入的电压近似相等,这样DAC输入的数据就是你外部电压的编码数据了,这个电压调节的过程就是逐次逼近SAR来完成的。一般使用二分法来完成。

  1. VERF+和VERF-是DAC的参考电压。
  2. EOC是End Of Conbert,转换结束信号。
  • STM32 ADC的框图:
  • 图中黑色部分是上个图片的内容

  1. 规则组:是一个一次最多有16位的数据输入通道,但只有1个数据寄存器,也就是只能从第一位到最后一位依次模数转换取码,如果你想跳着直接得到第16个,那么你只能得到第16个,前面15个数据将会释放。
  1. 注入组:一次最多有4位的数据选择通道,可以看到图中注入组对应的数据通道寄存器有4个,所以可以同时得到四个数据无需排队。

  1. VERF+和VERF-是ADC的参考电压,决定了ADC的输入电压范围
  2. VDDA和VSSA是ADC的供电引脚

一般情况下,VERF+要接VDDA  ,VERF-要接VSSA,但在这个C8T6芯片上没有VERF+和VERF-的引脚,在内部就已经和VDDA和VSSA连在一起了,VDDA和VSSA在引脚定义表中可以看到,是内部模拟部分的电源。

  1. 图中ADCCLK是上个图的CLOCK,是用于驱动内部逐次比较的时钟。
  2. ADC预分频器(最大14MHz且有2,4,6,8分频),它是来源于RCC的。但它只能选择六分频或八分频,就是12MHZ或9MHZ
  • 红色部分是触发转换的部分:

触发转部分也就是上个图的START信号

对于STM32的ADC,触发ADC开始转换的信号有两种。

  1. 软件触发:就是在程序中手动调用一条代码,就可以启动转换了。
  2. 硬件触发:就是图中红色部分的触发源,上面是注入组的触发源,下面是规则组的触发源这些触发源主要来源于定时器,有定时器的各个通道以及TRGO定时器主模式的输出,

  • 模拟看门狗:

      它里面可以存一个阈值高限和阈值低限,如果启动看门狗,并且指定了看门通道,看门狗就会         关注它的看门通道,一点查过阈值范围了,就会在上面申请模拟看门狗的中断通向NVIC。

      对于注入组和规则组而言,也有一个EOC转换完成的信号,EOC是规则组的完成信号,JEOC        是注入组的完成信号,这两个信号会在,状态寄存器里置一个标志位,读取标志位就知道是不        是转换结束了,同时这两个标志位也可以去NVIC申请中断。

  • ADC的基本结构:

  1. 左边是输入通道,16个GPIO口,外加两个内部的通道。
  2. 中间是AD转换器,AD转换器有两个组,规则组(16通道,依次)和注入组(4通道,同时),转换的结果存在AD数据寄存器里,像规则组只有一个数据寄存器,注入组有四个数据寄存器

触发控制:提供控制转换START信号,触发控制可以选择  软件、硬件触发(定时器/外部中断引                       脚)。

     RCC(CLOCK):ADC逐次比较的过程就是这个时钟推动的

模拟看门狗:用于监测转换结果的范围,若超出设定的阈值,   就可通过中断输出控制,向NVIC                          申请中断,另外规则组和注入组还有个JEOC、EOC信号,指标志位通向NVIC。

  1. 右下角开关控制:就是ADC_Cmd函数,用于给ADC上电。
  • 输入通道:

这些就是ADC18个输入通道对应的引脚,可在引脚定义表中查看。

在C8T6这个芯片中,只有IN0~IN9十个通道,对应也就是PA0~PB1

注:例如引脚定义表中ADC12_IN0的意思是,ADC1和ADC2的IN0都是在PA0上的。

同时,只有ADC1上有温度传感器和内部参考电压,GPIO顺 序是PA0~7,PB0~1,PC0~5 

  • 下面是规则组的四种转换模式:

  • 单次转换,非扫描模式:

  • 连续转换,非扫描模式:  
  • 单次转换,连续模式:
  • 连续转换,扫描模式:

在ADC初始化函数里,会有两个参数,一个是选择单次转换或者连续转换;另一个是选择扫描模式还是非扫描模式。

  1. 单次转换:每触发一次就会停下来,下次转换就得手动再触发才能开始,并且还要每次判断是否结束 。
  2. 连续转换:只用触发一次,立刻开始下一次转换触发了。可以不需要手动开始转换和判断是否结束。
  3. 非扫描模式:没用到规则组和注入组,一次触发只能一个序列一个通道。
  4. 扫描模式:用到规则组和注入组,一次触发可以实现多通道(序列)数目,不同通道位置(可以重复 )。
  5. 间断模式:就是在扫描的过程中,每隔几个转换,就暂停一次需要再次触发才能继续。

  • 控制触发:

  • 数据对齐:

C8T6的ADC是12位(10GPIO+2)的,转换结果就是12位,但我们的数据寄存器是16位,所以就有数据对齐。

  1. 数据右对齐:高位补零。
  2. 数据左对齐:低位补零。

一般使用数据右对齐,这样读取16位寄存器,直接就是转换结果,若用左对齐,得到的数据比实际数据大24倍。

如果使用数据左对齐一般就是不需要这么多的精度,只取前八位后四位舍弃,就是八位的精度了

  • 转换时间:
  1. AD转换的步骤:采样,保持,量化,编码

采样,保持因为AD转换,就是后面的量化,编码需要一小段时间的,如果在这一小段时间里输                       入的电压还在不断变化,就没法定位输入电压到底在哪,所以在量化编码前,需要设                      置一个采样开关,打开开关,收集外部的电压,然后断开采样开关,再进行后面的                          AD转换,这样量化编码期间,电压保持不变。

量化,编码:就是之前的逐次逼近的过程。需要花一部分时间,一般位数越多花的时间越长。

  1. STM32 ADC的总转换时间为:
  2. TCONV = 采样时间 + 12.5个ADC周期

采样时间:采样保持过程中,需要闭合采样开关,过一段时间再断开,就会产生一个采样时间。

  1. 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
  2. TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

  • 校准:
  1. ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
  2. 后建议在每次上电执行一次校准
  3. 启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期

  • 硬件电路:

图2:电阻减小,串联分压,下拉作用变强,输出端电压就下降

         电阻增大,串联分压,上拉作用变强,输出端电压就上升

         可变电阻(光敏,热敏)都是光线、温度提高,阻值下降。

图3:简易的电压转换电路,Vin是0~5v,串联分压,R1的电压是5/50*17=1.7V,同理                                 PA2=UR2=3,3V。

  • AD初始化的步骤:
  1. 开启RCC时钟,包括ADC和GPIO的时钟,ADC的clock分频器也需要配置。
  2. 配置GPIO,把要用的GPIO配置成输入模拟模式。
  3. 配置多路开关,把左边的通道接入到右边的规则组列表里。
  4. 配置ADC转换器。
  5. 开关控制。ADC_Cmd开启ADC

  • DAC的库函数:

加了*号是比较重要的,其他的了解认识即可。

1.这个函数是用来配置ADCCLK分频器的,他可以对APB2的72MHZ选择2、4、6、8分频,输入到ADCCLK

2.回复缺省配置

*3.初始化

4.结构体初始化

*5.给ADC上电的(开关控制)

*6开启DMA输出信号的,如果使用DMA转运数据,就得调用这个函数

*7.中断输出控制,用于控制某个中断,能不能前往NVIC

8.复位校准

9.获取复位校准状态

10.开始校准

11.获取开始校准状态

12.ADC软件开始转换控制,就是用于软件触发的函数了

13.ADC获取软件开始转换状态,这个函数是返回SWSTART的状态,不能判断AD转换是否结束

14.配置间断函数的,这个函数作用是:每隔几个通道间断一次

15.配置间断函数的,这个函数作用是:是不是启用间断函数

*16.ADC规则组通道配置,它的作用是给每个序列填写通道,参数分别是,1 ADCX,2你想指定的通道,3序列几的位置,4指定通道采样时间

17.ADC外部触发转换控制,就是是否允许外部触发转换

*18.ADC获取转换值,就是获取AD转换的数据寄存器,读取转换结果使用的函数。

19.ADC获取双模式转换值,这个就是双ADC模式读取转换结果的函数

*20.获取标志位状态,参数给EOC的标志位,判断EOC标志位2是不是置1了,如果转换结束EOC标志位置1,然后调用这个函数,判断标志位,这才是正确的判断转换是否结束的方法。

21.这个函数是对模拟看门狗进行配置的,这个是:是否启动模拟看门狗

22.这个函数是对模拟看门狗进行配置的,是:配置高低阈值

23.这个函数是对模拟看门狗进行配置的,是:配置看门的通道

24.ADC温度传感器、内部电压参考电压控制,这个是用来开启内部的两个通道,如果想使用这两个通道,就得调用这个函数,开启一下

25.获取标志位状态

26.清除标志位

27.获取中断状态

28.清除中断挂起位

  1. 当然,AD的库函数不止这些,在AD的头文件里,在我写的函数下面还有函数,它们带有Injected,是注入组的意思,所以都是对注入组进行配置的。可在头文件和手册中理解。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值