介绍STM32ADC模块的特色 1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈) STM32F103系列:在56MHz时转换时间为:1μs 在72MHz时转换时间为:1.17μs 2、转换范围:0~3.6V (3.6v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.6)) 3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀) 4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有) 5、双重模式(带2个ADC的设备): 8种转换模式 6、最多有18个通道:16个外部通道 2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V) ......(略,请看参考手册哈,由于篇幅,就不过多的列出来了、、说到略、让我想起了月光宝盒诸葛亮的:略懂略懂、、其实我也是略懂略懂而已、、) 12、DMA功能(仅ADC1有) 本博客里,由于篇幅、所以就以独立模式下的单次转换为例哈、打开参考手册可以看到这段话: 单次转换模式下,ADC只执行一次转换。 该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。 一旦选择通道的转换完成: ● 如果一个规则通道被转换: ─ 转换数据被储存在16位ADC_DR寄存器中 ─ EOC(转换结束)标志被设置 ─ 如果设置了EOCIE,则产生中断。 ● 如果一个注入通道被转换: ─ 转换数据被储存在16位的ADC_DRJ1寄存器中 ─ JEOC(注入转换结束)标志被设置 ─ 如果设置了JEOCIE位,则产生中断。 然后ADC停止。 4 m, k, _! a' A/ F& T. o 5 x3 E9 f9 x- @7 D 此图形象的表明了其背后那不为人知的秘密转换关系。。虽然单凭看文字就能想象出来、但是、有图片是不是更加形象呢??? 对于以上的寄存器、在此我稍微提提:免得寄存器大神们产生怨气:好不容易等到你讲我老大ADC,却不把我这些背后的勤劳者给导出来 好了,那就恕小弟容禀: 1、ADC状态寄存器(ADC_SR) 2、ADC控制寄存器1(ADC_CR1) 3、ADC控制寄存器2(ADC_CR2) EXTSEL[2:0]:选择启动规则通道组转换的外部事件 (External event select for regular group) ALIGN:数据对齐 (Data alignment) RSTCAL:复位校准 (Reset calibration) CAL:A/D校准 (A/D Calibration) CONT:连续转换 (Continuous conversion) ADON:开/关A/D转换器 (A/D converter ON / OFF) 4、ADC采样时间寄存器1(ADC_SMPR1) SMPx[2:0]:选择通道x的采样时间 (Channel x Sample time selection) 5、ADC规则序列寄存器1(ADC_SQR1) L[3:0]:规则通道序列长度 (Regular channel sequence length) SQ1[4:0]:规则序列中的第1个转换 (1st conversion in regular sequence)(ADC规则序列寄存器3(ADC_SQR3)) 6、ADC规则数据寄存器(ADC_DR) DATA[15:0]:规则转换的数据 (Regular data) (由于寄存器过于多,我们就不在这一一列举了哈、、因为我主要是用库,所以寄存器相关的位都不具体介绍了哈、请大家参照中文手册) 在这里,向大家介绍下:数据对齐: ALIGN位用于设置对齐方式:右或左; 对于注入通道,转换结果是减去偏移量的值,可以为一个负数,在右对齐时扩展位位符号位。 那我们现在要怎么来实现呢??这个问题、相信大家在看了那么多的寄存器之后急迫想要知道的吧、、前面的只是个热身、、接下来步骤如下: 1、开启ADC1的时钟,由于ADC1是在PA1上,所以同时也要打开PA的时钟,并进行相关的配置、对于这个配置,要把PA1设置成模拟输入,为什么呢??大家打开中文参考手册可以看到 / I& ]3 W/ c+ r! f+ ^ 啊哈、、这下子清楚了吧、 2、复位ADC1,(本人觉得没必要、为什么,待会我会跟你说,留下悬念先),设置ADC1的分频因子,(记住,这里的ADC的时钟不能超过14MHZ),而且其采样周期长点会好点, ADCCLK---最快可达14MHz, 时钟来自经过分频器的PCLK2(2、4、6、8分频) 整个转换时间 = 采样时间 + 12.5个周期(固定时间) 在14MHz和采样时间位1.5周期时 转换时间:1μs (14个周期 cycles) 当ADCCLK=14MHz和1.5周期的采样时间: TCONV = 1.5 + 12.5 = 14周期 = 14×(1 / (14 × 1000000)) = 1μs 其采样周期一览表:
涉及到采样周期、这里来看看转换序列: 最多达16个转换通道且可以采样不同的顺序排列,不同的采样时间和过采样的可能性。 例如:- 转换通道:1、2、8、4、7、3、11% k( ]* @* J; q; |
- 不同的采样时间;/ J$ _8 K {& l7 c - Oversampling of channel 7。 8 A% e+ ]" x$ v6 v& I$ b 3、初始化ADC1的参数、设置ADC1的工作模式和规则序列的相关信息; 大家通过打开"stm32f10.adc.h"可以看到:
4、使能ADC并校准 注:在设置完了以上信息后,使能AD转换器,执行复位校准和AD校准(这两步校准一定要,否则数据将不准) 还有记住,每次进行校准之后都要等待校准结束,但是通过什么方式知道校准结束呢? 这里是通过获取校准状态来判断是否校准结束,相关的库函数请看代码 分别的库函数请看待会的代码。(请用比较老外的方式去看,也就是用英语啦,为什么呢?请看下文) 5、读取AD的值 当然,这里说读取AD值并不是那么的简单,以上我们只是准备好了AD,还没有设置相关的规则序列通道,采样顺序,以及采样周期,设置完之后启动AD转换就行了、然后才直接读取哈、、 相关的库函数请看代码、
到了这一步,我们已经完成了AD采集数据的任务、接下来,有人可能有时候会觉得很纳闷,为什么有些人知道要完成特定的功能,它的步骤是怎么样的、为什么我就不知道??这个问题嘛、、接下来我讲的希望能稍微帮你,也希望你能好好的借鉴、 步骤小技巧:其实也没啥的、大家知道下载库的文件的时候,里面都有包含每个模块的例子和一个模版、拿ADC这个模块来举例: 点击main.c可以看到神奇的一幕: + J* G: B( N. S0 Q, J2 o b/ F: @$ I 大家仔细看看,可以发现在官方给的历程中的步骤里并没有复位ADC的函数,个人觉得所以没有必要去复位当然复位也不是什么坏事哈、看你个人、、看到这、应该明白了我前面的说法了吧、还有、大家应该也注意到了、都是英文的注释、、所以看到这大家也清楚了,前面不是我装逼、、所以呢、其实英语对于我们来说还是很重要的、、那有人问,时钟的分频因子呢?怎么没有设置??不急哈、、请看: 对于分频因子的设置,也在这个函数里:而这个RCC_Configuration()在最开始已经使用 了、、 : Z0 A" U$ ^ Y4 c$ Y( F 所以大家要好好利用官方给的历程、说到这、你猜我词穷了吗? 答案是否定的、、我还有话要说: 做一件事要有一个目的、、才不会显得自己做的很空泛、、我写博客也一样、、我想让我自己理清思路、也希望自己在写的过程中能领悟到自己在学的时候没领悟到的知识点、、也希望能帮到跟我有一样困惑的人、、我把我不懂的理解后写下来、我也知道会有人跟我一样遇到同样不懂的地方、、所以这就是我的目的哈、、希望能帮到你们、、尽管不认识你们、、啊哈、、初学者、难免有出错、、所以、写错或理解错的请帮我指出来、臣不甚感激,今当远离,零表涕零,不知所言、、 |
X-NUCLEO-IKS4A1实现手势滑动
STM32G系列RS485自动收发控制以及自适应波特率实战
STM32G0系列ADC扫描序列模式解读
STM32固件库分享,超全系列整理
【经验分享】FPGA作为从机与STM32进行SPI协议通信---Verilog实现
【管管推荐】STM32经验分享篇
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享