6.数据寄存器
ADC 转换后的数据根据转换组的不同,规则组的数据放在 ADC_DR 寄存器内,注入组的数据放在 JDRx 内。
位31:16保留,必须保持在复位值。
位15:0 RData[15:0]:规则数据转换
这些位是只读的。它们包含上次转换的规则通道的转换结果。数据左对齐或右对齐。STM32的ADC 是 12 位转换精度,而数据寄存器是 16 位,所以 ADC在存放数据的时候就有左对齐和右对齐区分。如果是左对齐,AD 转换完成数据存放在 ADC_DR 寄存器的[4:15]位内;如果是右对齐,则存放在 ADC_DR 寄存器的[0:11]位内。具体选择何种存放方式,需通过 ADC_CR2 的 11 位 ALIGN 设置。
在规则组中,含有 16 路通道,对应着存放规则数据的寄存器只有 1 个,如果使用多通道转换,那么转换后的数据就全部挤在 ADC_DR 寄存器内,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉,所以当通道转换完成后就应该把数据取走,或者开启 DMA 模式,把数据传输到内存里面,不然就会造成数据的覆盖。 最常用的做法就是开启 DMA 传输。如果没有使用 DMA 传输,我们一般通过 ADC 状态寄存器 ADC_SR 获取当前 ADC 转换的进度状态,进而进行程序控制。
而在注入组中,最多含有 4 路通道,对应着存放注入数据的寄存器正好有 4个,不会跟规则寄存器那样产生数据覆盖的问题。
7.ADC中断
ADC可生成中断:在ADC通电后,当ADC准备就绪时(标记ADRDY),规则组转换结束时(标志EOC),在规则组转换序列结束时(标志EOS),注入组转换结束时(Flag Jeoc),注入组转换序列结束时(Flag Jeos),发生模拟看门狗检测时(标记AWD1、AWD2和AWD3),当采样阶段结束时(标志EOSMP),发生数据溢出时(标志OVR),当注入的序列上下文队列溢出时(标记JQOVF)
通道采样时间
每个通道可以用不同的采样时间进行采样,采样时间可使用ADC_SMPR1和ADC寄存器中的SMP[2:0]位进行编程。因此可以选择
在以下采样时间值中:
•SMP=000:2.5 ADC时钟周期
•SMP=001:6.5 ADC时钟周期
•SMP=010:12.5 ADC时钟周期
•SMP=011:24.5 ADC时钟周期
•SMP=100:47.5 ADC时钟周期
•SMP=101:92.5 ADC时钟周期
•SMP=110:247.5 ADC时钟周期
•SMP=111:640.5 ADC时钟周期
ADC 要完成对输入电压的采样需要若干个 ADC_CLK 周期,计算公式:
TCONV = 采样时间 + 12.5 (ADC 周期)
例子:
当fadc_clk=80 MHz且采样时间为2.5 ADC时钟周期时:tconv=(2.5+12.5)ADC时钟周期=15 ADC时钟周期,T=1/f,15*(1/80M)=187.5 ns(对于快速通道)
ADC采样数值与实际电压值转换
STM32的ADC是12位逐次逼近型的模拟数字转换器,也就是说ADC模块读到的数据是12位的数据。。二进制的12位可表示0-4095个数,也就是说转换器通过采集转换所得到的最大值是4095,111111111111 = 4095,0v-3.3v平均分成4096份。给出任意X坐标值,求Y值
DMA(Direct Memory Access,直接内存存取) ,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA是直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU任何干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
|