智能车制作

标题: K60实现ADC四通道自动连续采集 无需CPU干预 [打印本页]

作者: 洋葱圈    时间: 2013-10-31 15:06
标题: K60实现ADC四通道自动连续采集 无需CPU干预
本帖最后由 洋葱圈 于 2013-10-31 15:07 编辑

之前有许多朋友询问如何使用K60的ADC实现多个通道的连续自动采集功能。其实就K60而言,他的ADC有ADC0和ADC1,每个ADCx又有A和B两组控制通道,因此最多可以实现4组ADC通道的连续自动采集,而且配合DMA和PDB,无需CPU对采集过程进行干预,我们可以直接读取内存中的转换结果!
本例程同样是基于LPLD的OSKinetis固件库开发的,代码中全部使用库函数进行开发,开发过程无需涉及任何寄存器操作。每步我们都写了详细注释,相信不了解原理的童鞋也能看个大概!


下面我还是简单叙述下实现原理:
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工作,坐享其成!

主要代码如下:
太长不贴了, 直接看程序吧各位。。。

运行结果:

[attach]51551[/attach]

例程下载:[attach]51552[/attach]
务必注意:本例程只是一个用户代码,它必须基于OSKinetis固件库来运行,因此必须放置在固件库目录下的/project目录才能正确编译,固件库地址 http://www.znczz.com/thread-207411-1-1.html




作者: 逍逍遥游    时间: 2013-10-31 15:49
赞赞~~你们那个基于3.0库的教程赶紧继续写啦,等不及了~~
作者: 洋葱圈    时间: 2013-10-31 15:59
逍逍遥游 发表于 2013-10-31 15:49
赞赞~~你们那个基于3.0库的教程赶紧继续写啦,等不及了~~

努力码字中。。。

作者: wraith    时间: 2013-10-31 16:10
这么多,有点混了
作者: 张永超    时间: 2013-10-31 16:22
写点l系列的吧
作者: 邵志伟    时间: 2013-10-31 18:17
怒求3.0教程呀。
作者: 正先生、正能量    时间: 2013-10-31 19:21
之前怎么没想到...还能这样搞。
作者: 洋葱圈    时间: 2013-10-31 21:07
张永超 发表于 2013-10-31 16:22
写点l系列的吧

KL系列?
作者: 洋葱圈    时间: 2013-10-31 21:07
邵志伟 发表于 2013-10-31 18:17
怒求3.0教程呀。

教程努力码字中,每周更新。

作者: 洋葱圈    时间: 2013-10-31 21:08
正先生、正能量 发表于 2013-10-31 19:21
之前怎么没想到...还能这样搞。

K60的功能真是其乐无穷,好多待挖掘的呢

作者: 张永超    时间: 2013-11-1 15:34
洋葱圈 发表于 2013-10-31 21:07
KL系列?

对啊

作者: 洋葱圈    时间: 2013-11-1 18:35
张永超 发表于 2013-11-1 15:34
对啊

听闻飞思卡尔官方会出KL系列底层库,我们等着就好了,肯定比第三方写的好。官方出得freedom开发板,也提供了例程包,是很好的学习材料。

作者: 逍逍遥游    时间: 2013-11-5 22:23
疑问:那个pdb的计数器周期是干什么用的?
作者: 洋葱圈    时间: 2013-11-5 23:11
逍逍遥游 发表于 2013-11-5 22:23
疑问:那个pdb的计数器周期是干什么用的?

决定ADC采集间隔

作者: 逍逍遥游    时间: 2013-11-6 15:58
洋葱圈 发表于 2013-11-5 23:11
决定ADC采集间隔

  //3.配置PDB触发参数
  //初始化PDB工作参数
  pdb_init_struct.PDB_CounterPeriodMs = 1000;   //PDB计数器周期设置
  pdb_init_struct.PDB_LoadModeSel = LOADMODE_0; //加载模式设置
  pdb_init_struct.PDB_ContinuousModeEnable = FALSE;     //禁用连续工作模式
  pdb_init_struct.PDB_TriggerInputSourceSel = TRIGGER_PIT0;     //配置触发源为PIT0
  //初始化PDB
  LPLD_PDB_Init(pdb_init_struct);
  //配置PDB触发ADC参数:触发ADC0模块、使能A组通道预触发、触发延时0
  LPLD_PDB_AdcTriggerCfg(ADC0, PRETRIG_EN_A, 0);

  //4.配置PIT触发周期
  //初始化PIT参数
  pit0_init_struct.PIT_Pitx = PIT0;     //选择PIT0
  pit0_init_struct.PIT_PeriodMs = 500;  //PIT0计数周期500ms
  //初始化PIT0
  LPLD_PIT_Init(pit0_init_struct);  
这是另外一个关于pdb adc的例程
疑问如下
此处pdb是用pit触发,500毫秒触发一次,然后pdb再过1000毫秒触发一次adc吗?


作者: 洋葱圈    时间: 2013-11-6 19:56
逍逍遥游 发表于 2013-11-6 15:58
//3.配置PDB触发参数
  //初始化PDB工作参数
  pdb_init_struct.PDB_CounterPeriodMs = 1000;   //PD ...

PDB和PIT计数器是同时工作的,这里你可以忽略PDB周期,PDB触发时间由PIT决定

作者: 逍逍遥游    时间: 2013-11-6 20:07
洋葱圈 发表于 2013-11-6 19:56
PDB和PIT计数器是同时工作的,这里你可以忽略PDB周期,PDB触发时间由PIT决定

也就是说只按照pit的周期来?pit先触发pdb,然后pdb直接触发adc采集?

延时的意思是不是pit先触发pdb,然后pdb延时一段时间触发adc?
那pdb不是可编程延时模块吗,通过什么算法让pdb延时触发adc采集?
求教····

作者: 洋葱圈    时间: 2013-11-6 22:05
逍逍遥游 发表于 2013-11-6 20:07
也就是说只按照pit的周期来?pit先触发pdb,然后pdb直接触发adc采集?

延时的意思是不是pit先触发pdb, ...

你的理解是正确的,原理的话你得去啃技术文档。

作者: 逍逍遥游    时间: 2013-11-6 22:14
洋葱圈 发表于 2013-11-6 22:05
你的理解是正确的,原理的话你得去啃技术文档。

好的  谢谢啦
作者: 刘小涛    时间: 2013-11-8 17:14
请问老师光电的CCD需要用到比较器模块么?
作者: 逍逍遥游    时间: 2013-11-12 16:06
求助:那个printf输出用什么可以检测到啊?那个serialpanel软件哪儿有啊?
作者: 洋葱圈    时间: 2013-11-12 17:42
逍逍遥游 发表于 2013-11-12 16:06
求助:那个printf输出用什么可以检测到啊?那个serialpanel软件哪儿有啊?

串口调试助手

作者: zzh11011    时间: 2013-11-20 17:18
洋葱圈 发表于 2013-11-1 18:35
听闻飞思卡尔官方会出KL系列底层库,我们等着就好了,肯定比第三方写的好。官方出得freedom开发板,也提供 ...

freedom有提供例程吗???还有底层库什么时候会出啊??要死了现在准备从K60换成KL...不知来得及不?T_T

作者: 洋葱圈    时间: 2013-11-20 18:30
zzh11011 发表于 2013-11-20 17:18
freedom有提供例程吗???还有底层库什么时候会出啊??要死了现在准备从K60换成KL...不知来得及不?T_T ...

你要是死在K60,那KL没准也得死。。。踏踏实实搞定一款吧。。。
作者: zzh11011    时间: 2013-11-21 16:11
洋葱圈 发表于 2013-11-20 18:30
你要是死在K60,那KL没准也得死。。。踏踏实实搞定一款吧。。。

不是,是因为k60学校有人做了,不想在校赛自相残杀,所有有换芯片的意向

作者: gufeng    时间: 2014-1-22 14:00





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2