查看: 1800|回复: 0
打印 上一主题 下一主题

【NUCLEO-F767ZI】最强3ADC交替采样+DMA(5.4MSa/s)

[复制链接] qrcode

24

主题

24

帖子

74

积分

注册会员

Rank: 2

积分
74
楼主
跳转到指定楼层
发表于 2016-8-5 11:55 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ihalin 于 2016-8-5 12:04 编辑

一通道3ADC交替采样+DMA传输数据  速度高达 5.4MSa/s这是我见过的最强MCU自带ADC了。
NUCLEO-F767ZI自带3个ADC ,在系统时钟216MHZ 的情况下 ADC时钟 4分频 的到27MHZ的时钟ADCCLK=PCLK2/4=108/4=27MHZ
交替模式下 2个ADC 转换之间的延迟是5个时钟周期
总体的转化周期是15/3=5个周期
ADC 时钟是27MHZ
所以  采样率是27/5=5.4MSa/s


F767手册上介绍

F767是带有3个12位的ADC,它有高达19多路复用的通道,使它可以测量来自16个外部源的信号,两个内部来源。
下面介绍一下一通道的3ADC交替采样的原理

在多重 ADC 模式下,通过 ADC1 主器件到 ADC2 和 ADC3 从器件的交替触发或同时触发来
启动转换,具体取决于 ADC_CCR 寄存器中的 MULTI[4:0] 位所选的模式
注: 在多重 ADC  模式下,配置外部事件触发转换时,应用必须设置为仅主器件触发而禁止从器件
触发,以防止出现意外触发而启动不需要的从转换。
可实现以下四种模式:
注入同步模式
常规同步模式
交替模式
交替触发模式
也可按以下方式组合使用上述模式:
注入同步模式 + 常规同步模式
常规同步模式 + 交替触发模式

三重 ADC  模式
出现外部触发之后:
ADC1 立即启动
经过几个 ADC 时钟周期延迟后 ADC2 启动
在 ADC2 转换经过几个 ADC 时钟周期的延迟后 ADC3 启动
交替模式下 2 个转换之间的最小延迟通过 ADC_CCR 寄存器中的 DELAY 位进行配置。但是,
如果某个 ADC 的互补 ADC 仍在对其输入进行采样,则该 ADC 无法启动转换(在给定时间
内,只有一个 ADC 能够对输入信号采样)。在这种情况下,延迟时间为采样时间 + 2 个 ADC
时钟周期。例如,如果这三个 ADC 的 DELAY = 5 个时钟周期,且采样时间为 15 个时钟周
期,则 ADC1、ADC2 和 ADC3 之间的转换延迟为 17 个时钟周期。
如果 ADC1、ADC2 和 ADC3 上的 CONT 位均置 1,则这些 ADC 所选常规通道会连续进行
转换。
注: 如果转换序列中断(例如 DMA  传输结束时),则必须首先通过在独立模式下进行配置来将多
重 ADC  定序器复位(位 DUAL[4:0] = 00000 ),然后才可以对交替模式进行编程。
在此模式下,每当出现 2 个可用数据项时,就会生成一个 DMA 传输请求(如果 ADC_CCR
寄存器中的 DMA[1:0] 位等于 0b10)。此请求首先会将存储在 ADC_CDR 32 位寄存器低位
半字中的第一批转换数据传输到 SRAM,然后将存储在 ADC_CDR 高位半字中的第二批转换
数据传输到 SRAM。具体顺序如下:
第 1 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
第 2 个请求:ADC_CDR[31:0] = ADC1_DR[15:0] | ADC3_DR[15:0]
第 3 个请求:ADC_CDR[31:0] = ADC3_DR[15:0] | ADC2_DR[15:0]
第 4 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]

简要:
AD 转换包括采样阶段和转换阶段,在采样阶段才对通道数据进行采集;而在转换阶
段只是将采集到的数据进行转换为数字量输出,此刻通道数据变化不会改变转换结果。独
立模式的 ADC采集需要在一个通道采集并且转换完成后才会进行下一个通道的采集。双
重或者三重 ADC的机制使用两个或以上 ADC同时采样两个或以上不同通道的数据或者使
用两个或以上 ADC交叉采集同一通道的数据。双重或者三重 ADC模式较独立模式一个最
大的优势就是转换速度快。
       介绍三重 ADC交替模式,三重 ADC交替模式是针对同一通道的使用三个 ADC
交叉采集,就是在 ADC1 采样完等几个时钟周期后 ADC2 开始采样,此时 ADC1处在转换
阶段,当 ADC2 采样完成再等几个时钟周期后 ADC3就进行采样此时 ADC1 和 ADC2 处在
转换阶段,如果 ADC3 采样完成并且 ADC1已经转换完成那么就可以准备下一轮的循环,
这样充分利用转换阶段时间达到增快采样速度的效果。AD 转换过程见图 30-6,利用 ADC
的转换阶段时间另外一个 ADC 进行采样,而不用像独立模式必须等待采样和转换结束后
才进行下一次采样及转换。
-----------------------------------多重 ADC 模式下的 DMA 请求(我选用DMA模式2)-------------------------------
DMA  模式 2:每发送一个 DMA 请求(两个数据项可用),就会以字的形式传输表
示两个 ADC 转换数据项的两个半字。
在双重 ADC 模式下,发出第一个请求时会传输 ADC2 和 ADC1 的数据(ADC2 数
据占用高位半字,ADC1 数据占用低位半字),依此类推。
在三重 ADC 模式下,将生成三个 DMA 请求:发出第一个请求时,会传输 ADC2 和
ADC1 的数据(ADC2 数据占用高位半字,ADC1 数据占用低位半字)。发出第二
个请求时,会传输 ADC1 和 ADC3 的数据(ADC1 数据占用高位半字,ADC3 数
据占用地位半字)。发出第三个请求时,会传输 ADC3 和 ADC2 的数据(ADC3
占用高位半字,ADC2 数据占用地位半字),依此类推。
DMA 模式 2 用于交替模式和常规同步模式(仅适用于双重 ADC 模式)。
示例:
a)  双重交替模式:每当有 2 个数据项可用时,就会生成一个 DMA 请求:
第 1 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
第 2 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
b)  三重交替模式:每当有 2 个数据项可用时,就会生成一个 DMA 请求
第 1 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
第 2 个请求:ADC_CDR[31:0] = ADC1_DR[15:0] | ADC3_DR[15:0]
第 3 个请求:ADC_CDR[31:0] = ADC3_DR[15:0] | ADC2_DR[15:0]
第 4 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]

在F767的datasheetz中介绍 GPIO PC2 是ADC1 ADC2 ADC3的第12通道
这里我选用GPIO PC2口

DMA2数据流0 通道 0



下面开始配置了
代码:
ADC配置:
adc.txt

main:
mian.txt


下面是串口输出的:



一通道3ADC交替采样+DMA传输数据  速度高达 5.4MSa/s这是我见过的最强MCU自带ADC了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表