打印

K60可以实现ADC的自动采集么?DMA怎么使用呢

[复制链接]
2292|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
yesherecn| | 2016-7-23 11:32 | 只看该作者
就K60而言,他的ADC有ADC0和ADC1,每个ADCx又有A和B两组控制通道,因此最多可以实现4组ADC通道的连续自动采集,而且配合DMA和PDB,无需CPU对采集过程进行干预,我们可以直接读取内存中的转换结果!

使用特权

评论回复
板凳
playergatsby| | 2016-7-23 23:04 | 只看该作者
yesherecn 发表于 2016-7-23 11:32
就K60而言,他的ADC有ADC0和ADC1,每个ADCx又有A和B两组控制通道,因此最多可以实现4组ADC通道的连续自动采 ...

这样的话,想要停止采样的时候,应该如何停止呢?

使用特权

评论回复
地板
jouney316| | 2016-7-24 10:19 | 只看该作者
yesherecn 发表于 2016-7-23 11:32
就K60而言,他的ADC有ADC0和ADC1,每个ADCx又有A和B两组控制通道,因此最多可以实现4组ADC通道的连续自动采 ...

我想要单次转换,不需要连续的,用DMA是否可以呢?

使用特权

评论回复
5
Dennis-Zhou| | 2016-7-25 19:07 | 只看该作者
jouney316 发表于 2016-7-24 10:19
我想要单次转换,不需要连续的,用DMA是否可以呢?

要开启DMA读取数据,AD必须连续转换,不能单次的

使用特权

评论回复
6
l科科1987| | 2016-7-26 09:58 | 只看该作者
简单说下基本的原理吧:
Step 1.配置ADC模块,配置A组和B组控制通道均为硬件触发,使能DMA请求。并使能相关输入通道。
Step 2.配置DMA模块,分别用2个DMA通道来控制ADC0和ADC1的DMA传输,并配置DMA源地址为ADC结果寄存器,配置主循环计数2次,因为要分别传输R[A]和R[B]结果寄存器的值。
Step 3.配置PDB模块,使用软件触发或其他外设触发均可,例程中位软件触发。关键步骤是要配置PDB的ADC预触发模式,使能通道0和通道1的预触发,并配置为Back to Back模式,这样才能让ADC的COCO转换完成标志自动触发下一个AD转换!
Step 4.触发PDB工作,坐享其成!

使用特权

评论回复
7
dongbaohui| | 2016-7-27 18:01 | 只看该作者
DMA有三种工作模式:无效模式、正常模式、和周期触发模式。
周期触发模式:触发源是PIT(周期定时器中断),这种模式仅仅适用与DMA Channel 0 -- DMA Channel 3。
正常工作模式:触发源是由DMAMUX_CHCFG_REG的SOURCE[0:5]决定的,它们之间的映射关系野火的ADC驱动中DMA_sources枚举已经定义好了。触发源包含很多,有UART、SPI、ADC、FTM、PDB、CPM、I2C、IO口触发,以及 Always On(一直使能,DMA Request完全由Peripheral Request决定,但是这个Peripheral Request,我不知道它是怎么来的,从这里我就开始理解不清楚了) 。其中看到例程中用的最多是IO口触发了,这个比较好理解。但是触发源还可以ADCn等触发,这个我也不理解了。

使用特权

评论回复
8
liutongda| | 2016-7-28 17:49 | 只看该作者
DMA采集不放到中断里的话,采集的时候不会被中断打断吗?这样的话出来的数据就不连续了吧?

使用特权

评论回复
9
enginezhong| | 2016-7-28 18:40 | 只看该作者
liutongda 发表于 2016-7-28 17:49
DMA采集不放到中断里的话,采集的时候不会被中断打断吗?这样的话出来的数据就不连续了吧? ...

不会的,DMA相当于一个小型的cpu,专门用来做数据的搬运,因此不会被中断所打断的

使用特权

评论回复
10
冰是睡着的冰|  楼主 | 2016-12-21 16:10 | 只看该作者
l科科1987 发表于 2016-7-26 09:58
简单说下基本的原理吧:
Step 1.配置ADC模块,配置A组和B组控制通道均为硬件触发,使能DMA请求。并使能相关 ...

谢谢你,讲的太详细了,最后就是这么搞定的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

213

帖子

0

粉丝