今天学习ADC的数模转换器的内容,首先是使用单通道进行转换电压值
代码如下:首先是开启时钟,尤其是增加了ADC的时钟,之后需要GPIO的初始化、ADC的规则组通道配置以及ADC的初始化、开启使能,最后进行ADC的校准。
以下是模数转换的函数
可以将输出值转换为电压值,ADC单通道的结果如下所示:
将电位器左转,输出电压值减小
电位器左转
电压值右转,输出电压值增大
电位器右转
接下来是理论部分:
ADC为12位,范围是0~2^12-1(4095),内部信号源分为温度传感器(可以测量CPU的温度)和一个内部1.2V的基准电压(当外部电压的引脚不标准时,可采用此电压进行校正)
常规使用的规则组,突发事件的注入组。
ADC可测量光线强度、温度,可使用模拟看门口功能实现
首先了解以下ADC芯片:
芯片共有8个通道,首先选择一路将数据传递到比较器,之后与DAC值通过逐次逼近SAR采用二分法进行比较值,如果DAC值大于数据,调小DAC,反之调大,直到DAC与传输的数据近似相等,此时DAC的输入数据就是外部输入的未知电压的编码数据,
如下所示:因为ADC芯片一共8个通道,所以一共0~255的范围,一次一次与未知数据比较,譬如,第一次比较给DAC输入255一半128与未知数据进行比较看是大是小,如果大,就继续给DAC输入126一半64,判断8次就可以找到未知的编码数据,以此类推找到近似值。
了解STM32的ADC:
主要是规则通道一次性最多可以有16个通道,譬如这个转换系统相当于点菜,普通是点一道上一道菜,但是规则通道相当于是一个菜单,可以一次性上16道,但是在规则通道数据寄存器相当于一个只能放下一道菜的桌子,相当于有新的菜上来时前面的就会被覆盖,因此需要结合DMA数据转运小助手将每次上来的菜立马端走防止被覆盖。而注入通道相当于VIP,一次性最多上4道且前面的数据不会被后来的数据覆盖。
STM32的ADC一共有16个GPIO口+一个温度传感器口+内部基准电压口,一共18个输入口。
ADC的时钟最大允许14MHz,因此后续选择6/8分频才能满足要求。
整体如下所示:
ADC中一共有4种转换模式:
首先是单次转换、非扫描模式,主要是首先选择需要转换的通道,之后触发开始转换,只有序列的第一行有效,之后当数据传入到数据寄存器时,给EOC置1,如果想再次转换,需要再次触发然后进行转换。
之后是连续转换、非扫描模式
开始转换后不需要多次触发,只需要触发开始的一次即可,他会不断将数放到数据寄存器。
之后是单次转换、扫描模式
这时用到了菜单列表,依次进行转换,使用到了DMA将数据及时挪走防止覆盖。
菜单中的通道数可以重复,转换之后EOC为1,表示数据转换完
最后是连续转换,扫描模式
一般选用右对齐,输出值就是实际值
左对齐用于当你不需要高分辨率时,可以取出前8位,将12位ADC转换为8位ADC,舍弃后4位的精度。
因为ADC是12位所以加12.5个ADC周期(0.5做一些别的事)
接下来是多通道的实现,采用三种传感器,主要通过将输入数据改为自己写入通道数,即实现用单次转换,非扫描模式实现多通道的ADC转换。
主函数:
结果如下:分别是各个通道的电压值变换
A01
A02
A03