写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
本文写于:2025.04.07
STM32开发板学习——第21节:[7-1] ADC模数转换器
- 前言
- 开发板说明
- 引用
- 解答和科普
- 一、ADC模数转换
- 二、规则组的转换模式
- 问题
- 总结
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
原理图如下
1、开发板原理图
2、STM32F103C6和51对比
3、STM32F103C6核心板
视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。
下图是实物图
引用
【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
数据手册
解答和科普
一、ADC模数转换
AD单通道
用电位器产生一个0~ 3,3V连续变化的模拟电压信号,接到了STM32的PA0口上,之后用STM32内部的ADC读取电压数据,显示在屏幕上。第一行显示的是AD转换后的原始数据,第二行是经过处理后实际的电压值。是一个12位的。只有0和3.3V两个值,可以是个电压表,把引脚的电压值测出来,放在一个变量里,这就是ADC的作用。
AD多通道
又接了3个传感器模块。分别为光敏电阻,热敏电阻,和反射红外模块,把它们的AO、模拟电压输出端,分别接在了A1、A2、A3引脚,加上刚才的电位器,总共4个通道,然后测出来的4个AD数据分别显示在屏幕上。
STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,所以如果想要读取电压值,就需要借助ADC模数转换器来实现了,ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,再把这个数据读取到变量里来,就可以显示判断,记录等等操作了;
PWM也是数字到模拟,用PWM比DAC更好了,波形生成器;
12位AD值,它的表示范围是0~ 2^12-1,就是量化结果的范围0~ 4095;位数越高,量化结果就越精细,对应分辨率就越高;
第二个是转换时间,就是转换频率,AD转换是需要花一小段时间的,这里1us就表示从AD转换开始到转换结果,需要花1us的时间,对应的AD转换频率就是1Mhz;(需要考虑是不是够用)。
0对应0,3.3V对应4095.
普通的AD转换流程是,启动一次转换,读一次值,然后再启动、再读值、这样的流程,但是STM32的ADC就比较高级,可以列一个组,一次性启动一个组,连续转换多个值,并且有两个组,一个用于常规使用的规则组,一个是用于突发事件的注入组;
高于阈值可以用模拟看门狗自动执行,会申请中断,就是用if去判断力,在看门狗中断执行相关程序。
ADC0809外挂的ADC芯片,信号通路进过通道选择开关和地址锁存和译码器,就是数据选择器,进入,首先这个一个电压比较器,他可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,一个是待测的电压,一个是DAC的电压输出端(已知的电压大小),加权电阻实现的,进入比较器,进行电压比较,如果DAC输出电压比较大,就减小DAC数据,如果DAC输出电压比较小,就增大DAC数据,直到DAC输出电压和外部通路输入的电压近似相等,这样DAC输出的电压就是外部电压的编码数据了,这就是DAC的实现原理,电压的调节就是逐次逼近寄存器完成的,为了找到未知电压的编码,通常会使用二分法进行寻找,12位就是4095,已知二分法选择出电压编码,与二进制正好是每一位的位权,相当于对二进制从高位到低位依次判断是1还是0的过程,这就是逐次逼近型的来源;AD转换结束后,DAC的输入数据,就是未知电压的编码,通过后面输出,8位就有8根线,12位就有12根线,最后上面这是EOC,转换结束信号,START是开始转换,给一个输入脉冲,开始转换,CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程,下面是Vref参考电压,通常和电压的正负极接在一起。
左边是ADC的输入通道,包括16个GPIO口,IN0 ~ IN15,和两个内部通道,一个是内部温度传感器,另一个是VREDINT,内部参考电压,总共是18个通道,然后到达这里,这时一个模拟多路开关,可以指定想要选择的通道,右边是多路开关的输出,进入到模数转换器,这里的模数转换器就是执行的就是逐次比较的过程,转换结果会直接放在这个数据寄存器里,我们读取寄存器就能知道ADC转换的结果了,然后在这里,对于普通的ADC,多路开关一般都是只选中一个的,就是选中某一个通道,开始转换、等待转换完成,去除结果,这时不同的流程。
而STM32的AD,把通道分为两种分别为注入组和规则组,其中规则组一次最多选择16个通道,注入组最多选择4个通道,普通ADC是,你指定一个菜,老板给你做,然后做好了给你,你再点一个菜,继续;而这里就是老板给你一个菜单,这个菜单最多可以填16个菜,然后递一个菜单给老板,老板就按照菜单的顺序依次做好,一次性给你端上来,这样的话就可以大大提高效率;菜单是一个规则组,只有一个数据寄存器,就是桌子比较小,最多只能放一个菜,你如果上16个菜,那不好意思,前15个菜都会被挤掉,你只能得到第16个菜,所以对于规则组转换来说,如果使用这个菜单的话,最好配合DMA来实现,DMA是一个数据转运小帮手,他可以在每上一个才后,把这个菜挪到其他地方去,防止被覆盖;
注入组,相当于VIP,数据寄存器也有4个,是可以同时上四个菜的,就不用担心数据覆盖的问题了;
触发有两种,一种是软件触发,就是你在程序中手动调用一条代码,就可以启动转换了,另一种是硬件触发,就是这里的这些触发源,还有定时器,定时器可以通向ADC、DAC这些外设用于触发转换,那因为ADC经常需要过一个固定时间段转换一次,比如每隔1ms转换一次,正常的思路就是,用定时器,每隔1ms申请一次中断,在中断手动开始一次转换,这样也是可以的,但是频繁近中段对我们程序也是有一定影响的额,比如你有很多中断需要进入中断,那肯定会影响主程序的运行,并且不同中断之间,由于优先级的不同,也会导致某些中断不能及时得到响应,如果触发ADC的中断不能及时响应,那我们ADC的转换频率就肯定会产生影响了,所以这种需要频繁进入中断,并且只在中断完成简单的工作的情况,一般都会有硬件支持,比如这里就可以,给TIM3定个1ms的时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC这里,选择开始触发信号为TIM3的TRGO,这样TIM3的更新事件就能通过硬件自动化触发ADC转换了,整个过程不需要进中断,节省了中断资源,这就是定时器触发的作用;当然这里也可以选择外边中断引脚来触发转换,这就是触发转换的部分;
输入通道
ADC12_IN0的意思是,ADC1和ADC2的IN0都是在PA0上的,
ADC12,说明ADC1和ADC2的引脚全都是相同的,既然都相同,那么要ADC2还有啥用呢?
双ADC模式,ADC1和ADC2同时工作,它俩配合组成同步模式、交叉模式等等模式
比如交叉模式,ADC1和ADC2交叉地对一个通道进行采样,这样可以进一步提高采样率;快速交叉打拳;
二、规则组的转换模式
这是一个列表,就是规则组里的菜单,有16个空位,分别是序列1到序列16,你可以在这里 “点菜”,就是写入你要转换的通道,在非扫描的模式下,这个菜单就只有第一个序列1的位置有效,这时,菜单同时选中一组的方式就退化为简单地选中一个的方式了,在这里我们可以在序列1的位置指定我们想转换的通道,比如通道2,写到这个位置,然后我们就可以触发转换,ADC就会对这个通道2进行模数转换,过一小会,转换完成。转换结果放在数据寄存器里,同时给EOC标志位置1,整个转换过程就结束了。
我们判断这个EOC标志位,如果转换完了,我们就可以在数据寄存器里读取结果了,如果我们想在启动一次转换,那就需要再触发一次,转换结束,置EOC标志位,读结果,如果想换一个通道转换,那在转换之前,把第一个位置的通道改成其他通道,然后再启动转换,这样就行了。这就是单词转换,非扫描的转换模式,没有用到这个菜单列表,也是比较简单的一种模式。
它在一次转换结束后不会停止,而是立刻开始下一轮的转换,然后一直持续下去,这样只需要最开始触发一次,之后就可以一直转换了,好处是:开始转换之后不需要等待一段时间的,因为它一直都在转换,所以你就不需要手动开始转换了,也不用判断是否结束的,想要读AD值的时候,直接从数据寄存器取就是了,这就是连续转换,非扫描的模式。
这个模式也是单次转换,所以每触发一次,转换结束后,就会停下来,下次转换就得再触发才能开始;
然后他是扫描模式,这就会用到这个菜单列表了,你可以在这个菜单里点菜,如上图,每个位置是通道几可以任意指定,并且也是可以重复的;
然后初始化结构体里还会有个参数,就是通道数目,因为这16个位置你可以用不完,只用前几个,那你就需要再给一个通道数目的个数,告诉它我有几个通道,本次为7; 比如这里指定通道数口为7。那它就只看前7个位置; 然后每次触发之后。它就依次对这前7个位置进行AD转换; 转换结果都放在数据寄存器里, 这里为了防止数据被覆盖,就需要用DMA及时将数据挪走, 那7个通道转换完成之后。产生EOC信号。转换结束。然后在触发下一次,就又开始新一轮的转换。这就是单次转换。扫描模的工作流程。
就是一次转换完成后。立刻开始下一次的转换.
间断模式:它的作用是。在扫描的过程中。每隔见个转换。就暂停一次,需要再次触发,才能继续。没有列出来。
AFIO重映射控制,来自哪里。
裁剪分辨率左对齐。
采样保持:量化编码是需要时间的,要保持稳定,采样开关,就是在量化编码时,电压保持不变。
ADC周期就是从RCC分频过来的ADCCLOCK(最大是14Mhz);
最后加加几条代码就行了。
1电位器,2传感器 3、电压转换电路
高电压采集最好使用一些专用的采集芯片,比如隔离放大器等等。做到高低电压的隔离,保护电路的安全。
问题
总结
本节课主要是学习了ADC转换,理解了内部的硬件结构,如何实现ADC的工作流程,还分为两种,已经DMA来完成转运,在触发的时候也可以定时器完成触发,和外部中断触发。还有工作的典型的转换模式。