织梦做双语版网站,app模板图片,深圳最好的做网站,wordpress 瀑布流分页026- STM32学习笔记 - ADC初识#xff08;一#xff09; 前几天不小心把板子掉地上了#xff0c;液晶屏摔坏了#xff0c;暂时先停一下液晶屏的学习#xff0c;等新的板子来了再继续学习。
一、ADC介绍
ADC指的是Analog to Digital Converter#xff08;模数转换器一 前几天不小心把板子掉地上了液晶屏摔坏了暂时先停一下液晶屏的学习等新的板子来了再继续学习。
一、ADC介绍
ADC指的是Analog to Digital Converter模数转换器即将连续变化的模拟信号转换为数字信号常见的模拟信号有例如压力、温度、声音等我们可以将诸如上面说的集中通过模数转换器将其转换为更容易存储的数字信息。
二、ADC结构框图 2.1 电压输入范围
在ADC中输入电压模拟量并不是什么电压范围都可以直接输入的我们知道MCU的电源电压一般都为0-3.3V而429中ADC的输入范围为VREF- ≤ VIN ≤ VREF。设计时是将VSSA和VREF-接地把VREF和VDDA接3.3V因此ADC的输入电压范围就是03.3V。我们在常见的模拟量一般为05V、010V或者-10V10V针对于这些电压比较高的可以在外部增加转换电路将电压转换为0~3.3V即可。
2.2 输入通道
在F429上面一共有三个独立的ADC 1/2/3其分辨率有6/8/10/12位可选每个ADC具有19个通道其中外部通道共有16个。这就相当于可以采集3*1648路模拟量信号通道数不代表可以同时使用的通道数具体看下表。
ADC IO分配
ADC1ADC2ADC3通道0PA0PA0PA0通道1PA1PA1PA1通道2PA2PA2PA2通道3PA3PA3PA3通道4PA4PA4PF6通道5PA5PA5PF7通道6PA6PA6PF8通道7PA7PA7PF9通道8PB0PB0PF10通道9PB1PB1PF3通道10PC0PC0PC0通道11PC1PC1PC1通道12PC2PC2PC2通道13PC3PC3PC3通道14PC4PC4PF4通道15PC5PC5PF5通道16连接内部VSS连接内部VSS连接内部VSS通道17连接内部Vrefint连接内部VSS连接内部VSS通道18连接内部温度传感器/内部VBAT连接内部VSS连接内部VSS
这里我们可以看到在三组通道中前两组ADC1、ADC2的引脚0-15一致ADC3与ADC1/2的第4-10、14-15共8个通道引脚不同因此假如我们在使用过程中假如ADC1/2的引脚全部用完也可以使用ADC3通道中这8个引脚因此实际429的ADC通道可以同时使用引脚数一共为16824组
除了以上说的引脚外ADC1/2/3的1618位内部通道ADC2/3的1618引脚全部连接到内部VSSADC1的通道16连接到VSS通道17连接到内部参考电压VREFINT通道18连接的为芯片内部温度传感器或者备用电源VBAT。
外部使用的16个通道在转换时区分为规则通道和注入通道其中规则通道最多为16路注入通道最多为4路其区别如下
规则通道从字面上理解就是规规矩矩的做模数转换的通道。
注入通道可以强制插入到规则通道中并且注入通道一定是在存在规则通道时才会存在。
这里举个不恰当的例子来说明一下规则通道和注入通道的区别假如有一个房子房子外面一共有16个监控摄像头房子内有4个监控摄像头监控系统正常情况下是显示外面16个摄像头的内容这些内容是由监控系统挨个去扫描数据从而显示的当我们需要看室内的情况时可以通过监控系统的切换暂时不接收室外视频数据流从而只显示室内摄像头的数据流看完后再自动切换回室外摄像头数据流。这里室外摄像头就相当于规则通道室内摄像头则为注入通道。
2.3 转换顺序
根据上面通道的分类转换顺序可分为规则序列和注入序列分别由不同的寄存器进行控制。
规则序列
控制规则序列的寄存器有3个分别为SQR3、SQR2、SQR1每个SQR寄存器有5位取值范围为1-16对应通道ADCx_IN[0-15]。其中SQR3控制规则序列中前6个通道这里说的前6个通道不是物理意义上的0-5通道而是顺序。比如我们想在第一次采集第ADCx_IN15通道的数据那么在SQ1[4:0]中写入16即可。SQR2控制转换序列中第712个通道SQR1则控制第1316个通道可能我们一次接入的转换通道不够16位那么具体需要转换多少位则由SQR1的L[3:0]来控制。规则序列寄存器配置如下表 注入序列
注入序列寄存器只有一个JSQR最多支持4个通道具体多少有JSQR的JL[2:0]决定如果JL的值小于4的时候JSQR跟SQR决定转换顺序的设置不一样第一次转换的位JCQRx[4:0]其中x4-JL跟SQR的顺序相反。如果JL 0时表示只有1个转换那么转换顺序就从JSQR4开始如果JL 4转换顺序就跟SQR一致。注入序列寄存器配置如下表 2.4 触发源
ADC转换起始和结束可以有ADC的控制寄存器2:ADC_CR2的ADON位来控制写入1时启动转换写入0时停止转换。同时也可以通过外部事件触发转换可以设置为内部定时器触发或者外部IO触发具体选择哪种触发源由ADC控制寄存器2:ADC_CR2的EXTSEL[3:0]和JEXTSEL[3:0]位控制其中EXTSEL[3:0]用于选择规则通道的触发源JEXTSEL[3:0]选择注入通道的触发源。触发源选定后是否需要激活有ADC的控制器2:ADC_CR2的EXTTRIG和JEXTTRIG这两位激活。 若设置为外部触发可以通过设置ADC寄存器2:ADC_CR2的EXTEN[1:0]和JEXTEN[1:0]来控制触发极性可以设置为禁止触发检测、上升沿检测、下降沿检测以及上升沿下降沿军检测。
2.5 转换时间
ADC时钟
作为一个外设ADC同样也需要开启时钟ADC的输入时钟ADC_CLK有PCLK2经过分频产生最大值为36MHz分频因子由ADC通用控股之寄存器ADC_CCR的ADCPRE[1:0]设置可设置的分频系数有2、4、6和8分频由于PCLK2一般我们设置的为90MHz所以这里我们可以将分频系数设置为4分频(90MHz/4 22.5MHz)或者设置为6分频(90MHz/6 15MHz)。这里注意VDD我们接的时3.3V时钟周期看VDDA 2.4 to 3.6V。 采样时间
ADC对输入的电压进行周期性采集采样的周期数通过采样时间寄存器ADC_SMPR1和ADC_SMPR2中的SMP[2:0]位进行设置ADC_SMPR1用于控制通道09ADC_SMPR2用于控制1017。每个通道可以设置不同的时间进行采样。采样周期可设置的最小值为3个周期周期即为1/ADC_CLK。
ADC的转换时间跟ADC的输入时钟和采样周期相关公式为 T c o n v 采样时间 12 个周期 Tconv 采样时间 12个周期 Tconv采样时间12个周期 当PCLK2 90MHz时经过ADC预分频器分频得到的最大时钟为22.5MHz采样周期设置为最快采样周期即3个周期那么Tconv 3 12 15个周期 15 * 1/22.5 0.6667us。
2.6 数据寄存器
前面对于ADC的转换序列分为规则数列和注入序列为了设置这两组序列分别存在规则数据寄存器ADC_DR和注入数据寄存器ADC_JDRxADC将模拟量转为数字量时根据其转换组别不同数据存入的寄存器也不同其中规则组的数据存放在ADC_DR寄存器而注入组的数据则是存放在JDRx中。如果使用的时双重或者三重模式那么规则组的数据则是存放在规矩寄存器ADC_CDR中。
规则数据寄存器ADC_DR
规则组数据寄存器ADC_DR只有一个是一个32位的寄存器其中只有低16位有效并且只是用于独立模式存放转换完成的数据因为ADC的精度最大为12位而ADC_DR是16位有效因此ADC存放数据时需要选择左对齐或者右对齐具体选择哪种方式由ADC_CR2的11位ALIGN设置比如设置ADC精度位12位如果设置数据位左对齐那么转换完成的数据存放在ADC_DR寄存器的[4:15]位中如果设置为右对齐则存放在ADC_AR寄存器的[0:11]位中。
这里需要注意的是前面学习到前面规则序列时知道规则序列一共有16个但是因为规则数据寄存器只有1个如果多通道转换时所有转换的数据都会全部存储到ADC_DR寄存器中存储的先后顺序也会随着转换完成通道的先后顺序依次进行**覆盖**如果没有及时取走转换成的数据可能就会被下一个通道转换完成的数据给覆盖掉这里就需要使用ADC状态寄存器的ADC_SR来获取ADC转换的进度状态从而保证转换数据能正常获取。
当然除了这种办法外还可以启用DMA模式将转换完成的数据传输到内存中这样就不会存在数据的覆盖了具体如何实现等后面我们在学习。
注入数据寄存器ADC_JDRx
注入组与规则组不同注入组共有4个数据寄存器刚好对应4个通道因此不存在与规则组一样有数据覆盖的问题。ADC_JDRx同样时32位寄存器低16位有效高16位保存数据同样也分左对齐和右对齐具体以哪种方式存放由ADC_CR2的11位ALIGN设置。
通用规则数据寄存器ADC_CDR
规则数据寄存器ADC_DR只是用与独立模式即上面说的ADC1/2/3只启用任意一组而通用规则数据寄存器ADC_CDR则适用于双重和三重模式双重模式为启用任意两组ADC通道三重则为3个通道都启用此处需要注意的是双重或三重模式下尽可能配合DMA数据传输使用。
2.7 中断
ADC在完成数据转换后可以产生中断其中中断分为4种分别为
规则通道转换结束中断注入转换通道转换结束中断模拟看门狗中断溢出中断DMA请求
前面两个中断比较好理解就是表示ADC正常转换结束后触发的中断可以通过相应的中断标志位和中断使能写出配套的中断服务程序。
模拟看门狗中断
在前面我们了解到ADC的输入范围为VREF- ≤ VIN ≤ VREF其中VREF- ~ VREF为ADC转换采集的模拟量阈值区间假如采集的模拟量电压低于VREF-或者高于VREF这种情况该怎么办呢为了因对输入模拟电压超出阈值区间这里需要开启模拟看门狗中断低阈值由ADC_LTR设置高阈值由ADC_HTR设置比如设置高阈值为2.5V当模拟输入电压高于2.5V时就会产生模拟看门狗中断同理低阈值也一样。
溢出中断
如果发生DMA传输数据丢失会置位ADC状态寄存器ADC_SR的OVR位如果同时使能溢出中断则在转换结束后会产生一个溢出中断。
DMA请求
ADC转换结束后除了产生终端外还可以产生DMA请求将转换好的数据直接存储到内存中对于独立模式的多通道AD转换使用DMA传输非常有必要对于双重模式或者三重模式使用DMA可以说时必不可少的。可以避免丢失在下一次写入之前还未被读出的ADC_DR寄存器中的数据。
2.8 电压转换
模拟电压经过ADC转换后是个相对精度的数字值什么意思呢在F429开发板中ADC的输入电压范围设置位0~3.3V假如此时我们设置采集精度为12位那么当输入模拟电压达到3.3V时12位寄存器就会被填满此时我们如果通过串口以16进制打印出来会发现并不是我们要的3.3V而是FFF那么才能将最终输出的数据转换为我们需要的数值呢这里就用到了电压转换。 V o l t V ∗ V o u t / 2 n VoltV * Vout / 2 ^ n VoltV∗Vout/2n 其中V为3.3VVout极为ADC_DR中的数值n则表示我们选择的精度上面的例子中n 12因此假如此时输入模拟电压为3.3V时那么输出应为3.3 * FFF / 2^12即3.3 * 4096 /4096即输出数据为3.3。
OK关于ADC的基本知识就学习到这里后面继续学习关于ADC的相关结构体并且进行实战。