❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v
本学习过程参考:https://space.bilibili.com/383400717
STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf
链接里压缩包的解压密码:32
本大节主要学习ADC模拟数字转换器的相关知识,包含两小节:
第一小节主要学习ADC模拟数字转换器的理论基础知识,第二小节是对第一小节的内容写两个程序进行练习,分别是AD单通道和AD多通道;
最终附上所有的源代码;
本小节主要学习ADC模拟数字转换器的理论基础知识。
ADC的作用:
对于GPIO来说,它只能读取引脚的高低电平,要么是高电平,要么是低电平,只有两个值;而使用ADC之后,我们就可以对这个高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量,就可以知道引脚的具体电压是多少了;所以ADC其实就是一个电压表,把引脚的电压值测出来,放在一个变量里,这就是ADC的作用
;
文章目录
- 1 ADC简介
- 2 逐次逼近型ADC
- 3 ADC框图
- 4 ADC基本结构
- 5 输入通道
- 6 转换模式
- 7 触发控制
- 8 数据对齐
- 9 转换时间
- 10 校准
- 11 硬件电路
1 ADC简介
- STM32主要是数字电路,数字电路只有高低电平,没有几伏电压的概念,所以如果想要读取电压值,就需要借助ADC模数转换器来实现了;ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,我们再把这个数据读取到变量里,就可以进行显示、判断、记录等等操作了;
- ADC可以将模拟信号转换为数字信号,是模拟电路到数字电路的桥梁;
- DAC模拟数字转换器,可以将数字量转换为模拟电压;
ADC有两个关键参数:
- 第一个是分辨率,一般用多少位来表示,12位AD值,它的表示范围就是
0~2^12-1
;就是量化结果范围是0~4095
;位数越高,量化结果就越精细,对应分辨率就越高; - 第二个是转换时间,就是转换频率;AD转换是需要花一小段时间的,这里的1us就表示从AD转换开始,到产生结果,需要花1us时间,对应AD转换的频率就是1MHz;这个就是STM32 ADC最快的转换频率;
2 逐次逼近型ADC
- 上图是ADC0809的内部结构图;它是一个独立的8位逐次逼近型ADC芯片,其是一款经典的外挂型ADC芯片;
- 左边IN0-IN7是8路输入通道;通过通道选择开关,选中一路,输入到比较器进行转换;
- 下面的地址锁存和译码模块;就是你想选中哪个通道,就把通道号放在
ADDA-ADDC
这三个引脚上,然后给一个锁存信号,则上面通道选择开关里对应的通路开关就可以自动拨好了; - 这个ADC只有8个输入通道,而我们STM32内部的ADC是有18个输入通道的;所以对应上面输入通道,STM32内部是有18个输入的;
- 比较器可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,它的两个输入端,一个是待测电压,另一个是DAC的电压输出端,DAC是数模转换器,给它一个数据,它就可以输出数据对应的电压;现在在比较器两端,一端有了一个外部通道输入的位置编码的电压,另一端有了一个DAC输出的一直编码的电压,他俩同时输入到电压比较器,进行大小判断;如果DAC输出的电压比较大,我就调小DAC数据,如果DAC输出的电压比较小,我就增大DAC数据,直到他们相等;就得到了外部位置编码电压的具体数值,这样DAC输入的数据就是外部电压的编码数据了 ;
这就是DAC的实现原理
; - 上面提到的比较方法,使用的是
二分法
的比较方法;
3 ADC框图
- 模拟多路开关,可以指定我们想要选择的通道;右边是多路开关的输出,进入到模数转换器;这里的模数转换器就是执行逐次比较的过程;转换结果会直接放在数据寄存器里;通过程序读取寄存器就能直到ADC转换的结果了;
4 ADC基本结构
- 左边是输入通道,16个GPIO口,外加两个内部的通道;
- 然后进入AD转换器,AD转换器里有两个组,一个是规则组,一个是注入组,规则组最多可以选中16个通道,注入组最多可以选择4个通道;
- 转换的结果可以存放在AD数据寄存器里,其中规则组只有1个数据寄存器,注入组有4个
- 然后下面有触发机制,提供了开始转换这个START信号,触发控制可以选择软件触发和硬件触发,硬件触发主要是来自于定时器,当然也可以选择外部中断的引脚;右边是来自于RCC的ADC时钟CLOCK;ADC逐次比较的过程就是由这个时钟推动的;
- 模拟看门狗用于检测转换结果的范围, 如果超出设定的阈值,就通过中断输出控制,向NVIC申请中断;
- 另外,规则组和注入组转换完成后会有个EOC信号,它会置一个标志位,当然也可以通向NVIC;
- 最后右下角还有个开关控制,在库函数中,就是ADC_Cmd函数,用于给ADC上电的;
5 输入通道
上图是ADC通道和引脚复用的关系;
6 转换模式
- 单词转换,非扫描模式,单次转换后就会停止;然后开启下一次转换;
- 连续转换,非扫描模式:它与单次转换,非扫描模式的不同是,它在一次转换结束后不会停止,而是立刻开始下一轮的转换,然后一直持续下去;这样只需要最开始触发一次,之后就可以一直转换了;
- 这个模式的好处是开启转换后不需要等待一段时间;
- 单次转换,扫描模式:也是单次转换,所以每触发一次,转换结束后就会停下来,下次转换就得再触发才能开始;然后它是扫描模式,就会用到列表了,左边的每个位置是通道几可以任意指定,并且可以重复;初始化结构体里还会有个参数,就是通道数目,因为16个位置可以不用完,只用前几个,所以需要指定通道数;
- 连续转换,扫描模式
7 触发控制
8 数据对齐
- 一般我们使用右对齐