嵌入式之ADC
ADC
ADC - 模数转换器:
以GD32DF330为例,MCU片上集成了12位逐次逼近式模数转换器模块(ADC),可以采样来自于16个外部通道、2个内部通道和电池电压(VBAT)通道的模拟信号。
分辨率
假如ADC采样分辨率为12位,输入信号最大值为3.3V,那么这个转换器应能区分出输入信号的最小电压为 3.3 / (2 ^ 12) = 0.806mV
转换时间
转换时间是指模数转换器从模拟信号到来开始,到输出端得到稳定的数字信号所经过的时间。
假如ADC采样分辨率为12位,那么:
总转换时间 = 采样时间 + 12.5个CK_ADC周期
通道采样时间由 ADC_SAMPTn 寄存器配置,共有8种选择(从 1.5采样周期 到 239.5采样周期)。
例如: CK_ADC为6MHz ,采样时间配置为55.5个采样周期,那么总的转换时间为:”55.5 + 12.5”个 CK_ADC 周期,即(1 / 6000000) * (55.5 + 12.5) = 0.0113us = 11.3ns。
运行模式
单次转换,非扫描模式:
在第一次ADC触发之后,将AD值存在数据寄存器里面,并且会将EOC(End Of Conversion - 转换结束)标志位置1,根据这个标志位判断转换状态状态,如果转换完毕,就读取数据。
在读取数据寄存器之后,硬件会自动将EOC标志位清零,那么就可以开始下一次转换了。
连续转换,非扫描模式:
这个模式开启转换之后不需要判断标志位,一次转换结束之后会继续开启下一次转换,直到失能ADC;
所以配置完ADC后,只需要开启一次转换即可,然后需要AD值的数据的时候直接去寄存器读取即可。
单次转换,扫描模式:
在这个模式中,可以一次转换多个通道,一次将多个通道转换的数据存入数据寄存器,然后在转换结束的时候产生一个EOC标志位,读取数据寄存器后硬件会自动清除EOC的标志位,等待开启下一次的转换。
需要注意的是,需要进行通道数目的配置(只在扫描模式的时候配置),一次扫描多个通道,进行AD转换。
假如通道数目配置为7,则只看前7个序列所对应的通道。
连续转换,扫描模式:
这个模式,只需开启一次转换,转换结束会自动进行下一次转换。
但是规则组的数据寄存器只有16位,所以只能存入1个通道的数据,如果不及时转存数据的话,本次的数据会被下一个通道的数据覆盖。
间断模式
间断模式是在扫描模式中才会出现的,即:转换几个通道之后,间断一会,再进行下面通道的转换。
通道
规则通道
规则组可以设置由1个或多个ADC通道组成的转换序列,当启动转换时,ADC将按照转换序列中指定的ADC通道顺序和序列长度进行转换
一个规则转换组最多由16个转换构成, 规则通道的转换结果储存在常规数据寄存器”ADC_RDATA”中;所有规则通道的转换结果均共用此规则数据寄存器,因此为避免数据丢失,在每个通道转换完毕时应尽快将转换结果读出,如果转换足够快则应使用DMA。
注入通道
如果将规则通道比作普通C函数,则注入通道就像是中断服务函数一样。
注入通道可以中断规则通道的转换,然后在注入通道组转换完成后,规则通道组的规则转换会从上次中断的规则转换处恢复。
注入组可以设置由1个或多个ADC通道组成的转换序列,当启动转换时,ADC将按照转换序列中指定的ADC通道顺序和序列长度进行转换。
一个注入转换组最多由4个转换构成, 注入通道的转换结果储存在注入数据寄存器”ADC_IDATAn (n为0~3)”中。它们包括来自注入通道 n 的转换结果。
触发方式(转换开始的发起)
- 软件触发
- 硬件触发
常用软件触发
中断的产生:
- 常规序列转换结束
- 模拟看门狗事件
常用 “单次转换 + 常规序列转换结束中断” 来采样