- STM32数模转换:
- ADC(Analog-Digital Converter)模拟-数字转换器
- ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
- 12位逐次逼近型ADC,1us转换时间
- 分辨率:一般用多少位来表示,例如:12位AD值,它的表示范围是0 ~ 212-1(0~4095)
- 转换时间(转换频率):AD转换是需要一小段时间的,这里的1us就表示从AD转换开始到产生结果,需要1us时间,对应的AD转换频率就是1MHz.
- 输入电压范围:0~3.3V(负极到正极之间变化),转换结果范围:0~4095(经过转换后0V对应0,3,3V对应4095)中间都是一一对应的线性关系0~3,3(0~4095)。
- 18个输入通道,可测量16个外部和2个内部信号源16个外部信号源就是:16个GPIO口,在引脚直接接模拟信号就行,不需要额外电路,引脚就直接能测电压。
- 2个内部信号源就是:内部温度传感器和内部参考电压,温度传感器可以测量CPU的温度;内部参考电压是一个1,2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的,可以读取这个基准电压进行校准,左右就能得到正确的电压值。
- 规则组和注入组两个转换单元
- Stm32的ADC可以列一个组,一次性启动一个组,连续转换多个值,并且有两个组,一个是用于常规的规则组,另一个是用于突发事件的注入组。
- 模拟看门狗自动监测输入电压范围
- 这个ADC可以用于测量光线强度,温度,并且经常有个需求,就是如果光线、温度高于某个阈值,低于某个阈值,执行一些操作,这个操作可以用模拟看门狗进行检测。
- STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
- 逐次逼近型ADC:
- 这三个参数的部分相当于一个可通过模拟信号的数据选择器
IN1~8:输入通道
ADDA~C:选中通道的通道号放在这三个引脚上
ALE:锁存信号
- SAR逐次逼近寄存器部分:
比较器:一端是待测电压,一端接在DAC(数模转换,即给一个数据可以测出数据对应的电压)上。它两同时输入到电压比较器里,进行大小判断,通过调节DAC的电压,直到DAC输出的电压,与外部通道输入的电压近似相等,这样DAC输入的数据就是你外部电压的编码数据了,这个电压调节的过程就是逐次逼近SAR来完成的。一般使用二分法来完成。
- VERF+和VERF-是DAC的参考电压。
- EOC是End Of Conbert,转换结束信号。
- STM32 ADC的框图:
- 图中黑色部分是上个图片的内容:
- 规则组:是一个一次最多有16位的数据输入通道,但只有1个数据寄存器,也就是只能从第一位到最后一位依次模数转换取码,如果你想跳着直接得到第16个,那么你只能得到第16个,前面15个数据将会释放。
- 注入组:一次最多有4位的数据选择通道,可以看到图中注入组对应的数据通道寄存器有4个,所以可以同时得到四个数据无需排队。
- VERF+和VERF-是ADC的参考电压,决定了ADC的输入电压范围
- VDDA和VSSA是ADC的供电引脚
一般情况下,VERF+要接VDDA ,VERF-要接VSSA,但在这个C8T6芯片上没有VERF+和VERF-的引脚,在内部就已经和VDDA和VSSA连在一起了,VDDA和VSSA在引脚定义表中可以看到,是内部模拟部分的电源。
- 图中ADCCLK是上个图的CLOCK,是用于驱动内部逐次比较的时钟。
- ADC预分频器(最大14MHz且有2,4,6,8分频),它是来源于RCC的。但它只能选择六分频或八分频,就是12MHZ或9MHZ
- 红色部分是触发转换的部分:
触发转部分也就是上个图的START信号
对于STM32的ADC,触发ADC开始转换的信号有两种。
- 软件触发:就是在程序中手动调用一条代码,就可以启动转换了。
- 硬件触发:就是图中红色部分的触发源,上面是注入组的触发源,下面是规则组的触发源这些触发源主要来源于定时器,有定时器的各个通道以及TRGO定时器主模式的输出,
- 模拟看门狗:
它里面可以存一个阈值高限和阈值低限,如果启动看门狗,并且指定了看门通道,看门狗就会 关注它的看门通道,一点查过阈值范围了,就会在上面申请模拟看门狗的中断通向NVIC。
对于注入组和规则组而言,也有一个EOC转换完成的信号,EOC是规则组的完成信号,JEOC 是注入组的完成信号,这两个信号会在,状态寄存器里置一个标志位,读取标志位就知道是不 是转换结束了,同时这两个标志位也可以去NVIC申请中断。
- ADC的基本结构:
- 左边是输入通道,16个GPIO口,外加两个内部的通道。
- 中间是AD转换器,AD转换器有两个组,规则组(16通道,依次)和注入组(4通道,同时),转换的结果存在AD数据寄存器里,像规则组只有一个数据寄存器,注入组有四个数据寄存器
触发控制:提供控制转换START信号,触发控制可以选择 软件、硬件触发(定时器/外部中断引 脚)。
RCC(CLOCK):ADC逐次比较的过程就是这个时钟推动的
模拟看门狗:用于监测转换结果的范围,若超出设定的阈值, 就可通过中断输出控制,向NVIC 申请中断,另外规则组和注入组还有个JEOC、EOC信号,指标志位通向NVIC。
- 右下角开关控制:就是ADC_Cmd函数,用于给ADC上电。
- 输入通道:
这些就是ADC18个输入通道对应的引脚,可在引脚定义表中查看。
在C8T6这个芯片中,只有IN0~IN9十个通道,对应也就是PA0~PB1
注:例如引脚定义表中ADC12_IN0的意思是,ADC1和ADC2的IN0都是在PA0上的。
同时,只有ADC1上有温度传感器和内部参考电压,GPIO顺 序是PA0~7,PB0~1,PC0~5
- 下面是规则组的四种转换模式:
- 单次转换,非扫描模式:
- 连续转换,非扫描模式:
- 单次转换,连续模式:
- 连续转换,扫描模式:
在ADC初始化函数里,会有两个参数,一个是选择单次转换或者连续转换;另一个是选择扫描模式还是非扫描模式。
- 单次转换:每触发一次就会停下来,下次转换就得手动再触发才能开始,并且还要每次判断是否结束 。
- 连续转换:只用触发一次,立刻开始下一次转换触发了。可以不需要手动开始转换和判断是否结束。
- 非扫描模式:没用到规则组和注入组,一次触发只能一个序列一个通道。
- 扫描模式:用到规则组和注入组,一次触发可以实现多通道(序列)数目,不同通道位置(可以重复 )。
- 间断模式:就是在扫描的过程中,每隔几个转换,就暂停一次需要再次触发才能继续。
- 控制触发:
- 数据对齐:
C8T6的ADC是12位(10GPIO+2)的,转换结果就是12位,但我们的数据寄存器是16位,所以就有数据对齐。
- 数据右对齐:高位补零。
- 数据左对齐:低位补零。
一般使用数据右对齐,这样读取16位寄存器,直接就是转换结果,若用左对齐,得到的数据比实际数据大24倍。
如果使用数据左对齐一般就是不需要这么多的精度,只取前八位后四位舍弃,就是八位的精度了
- 转换时间:
- AD转换的步骤:采样,保持,量化,编码
采样,保持:因为AD转换,就是后面的量化,编码需要一小段时间的,如果在这一小段时间里输 入的电压还在不断变化,就没法定位输入电压到底在哪,所以在量化编码前,需要设 置一个采样开关,打开开关,收集外部的电压,然后断开采样开关,再进行后面的 AD转换,这样量化编码期间,电压保持不变。
量化,编码:就是之前的逐次逼近的过程。需要花一部分时间,一般位数越多花的时间越长。
- STM32 ADC的总转换时间为:
- TCONV = 采样时间 + 12.5个ADC周期
采样时间:采样保持过程中,需要闭合采样开关,过一段时间再断开,就会产生一个采样时间。
- 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
- TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
- 校准:
- ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
- 后建议在每次上电执行一次校准
- 启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期
- 硬件电路:
图2:电阻减小,串联分压,下拉作用变强,输出端电压就下降
电阻增大,串联分压,上拉作用变强,输出端电压就上升
可变电阻(光敏,热敏)都是光线、温度提高,阻值下降。
图3:简易的电压转换电路,Vin是0~5v,串联分压,R1的电压是5/50*17=1.7V,同理 PA2=UR2=3,3V。
- AD初始化的步骤:
- 开启RCC时钟,包括ADC和GPIO的时钟,ADC的clock分频器也需要配置。
- 配置GPIO,把要用的GPIO配置成输入模拟模式。
- 配置多路开关,把左边的通道接入到右边的规则组列表里。
- 配置ADC转换器。
- 开关控制。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.清除中断挂起位
- 当然,AD的库函数不止这些,在AD的头文件里,在我写的函数下面还有函数,它们带有Injected,是注入组的意思,所以都是对注入组进行配置的。可在头文件和手册中理解。