wince高频率数据采集的问题

fanqiaqi   2009-9-9 16:55 楼主
我手头有一个A/D采集的模块。这个A/D是外部扩展的A/D(不是2440自带的A/D模块),这个扩展模块有12位的并行数据总线,直接挂在2440的数据总线上面。还有一个开始启动脚,一个转换完成脚,一个读使能脚。它内部没有缓存,也就意味着每转换一次,都要读里面的数据。

现在的问题是这样的:
采样频率要达到100KHz,这就涉及到具体采用什么方案的问题。我又一些方案,但是感觉不够好,主要就在实时性方面,怕100K太高了,性能不够稳定。
方案1、使用系统时钟来输出个us级的定时,通过这个来控制A/D芯片的转换。
方案2、用2440的定时器,实现采样频率的设置。这个方案貌似不够稳定。
方案3、因为采集最长时间只有60秒,我干脆写一个独占的进程,让cpu一直在这个进程中完成100k的采样,也不用中断了,直接用查询。可是又涉及到了FIFO的问题,也不好办。

目前只能想到这些了,各位有什么好的建议或是好的方案,提出来分享下。

回复评论 (16)

以串口为例子,波特率最高时115200
可是串口有64byte FIFO,所以我觉得这个100K应该要个FIFO合适。

点赞  2009-9-9 16:57
引用: 引用 1 楼 gooogleman 的回复:
以串口为例子,波特率最高时115200
可是串口有64byte FIFO,所以我觉得这个100K应该要个FIFO合适。


这个估计很难,100KHz * 60s * 2路 == 12M个采样点,即使用FIFO也很难。
点赞  2009-9-9 17:01
不懂
帮顶!
点赞  2009-9-9 17:30
频率100KHz
建议用 FPGA来控制AD来采集,这样驱动实现也简单

点赞  2009-9-9 17:30
引用: 引用 4 楼 wolong98 的回复:
频率100KHz
建议用 FPGA来控制AD来采集,这样驱动实现也简单


这个方案是不行的,现在硬件已经做好了。
点赞  2009-9-9 17:36
硬件都做好了才問, 似乎是有點慢了, 以下都要做硬體修改

1. Timer output to A/D "Convert Start" pin.

2. Either one
2.1 DMA (You must connect A/D "Convert Done" pin to CPU DMA request pin) (I'm sure is the 2440 DMA support external memory bus. Please confirm it first.)
2.2 A/D "Convert Done" to CPU GPIO and read A/D data in GPIO ISR(or IISR is better) routine.

Paul, Chao @ Techware
点赞  2009-9-9 18:03
又见paul_chao。
点赞  2009-9-9 18:36
引用: 引用 6 楼 paul_chao 的回复:
硬件都做好了才問, 似乎是有點慢了, 以下都要做硬體修改

1. Timer output to A/D "Convert Start" pin.

2. Either one
2.1 DMA (You must connect A/D "Convert Done" pin to CPU DMA request pin) (I'm sure is the 2440 DMA support external memory bus. Please confirm it first.)
2.2 A/D "Convert Done" to CPU GPIO and read A/D data in GPIO ISR(or IISR is better) routine.

Paul, Chao @ Techware


对于wince来说,实现us级的定时中断,会不会有点勉强?
这个问题我还不能确定,不过挺关键的。
点赞  2009-9-9 18:59
以CE的实时性来说,做到楼主这个us级别的实时操作很难。
没有硬件的FIFO来做buffer,丢数据是必然的。
就以目前的硬件来说,做到最好的现状就是使用硬件timer来绑定AD采样中断,并启用以最高优先级的IST来“抓紧时间”读数据。
点赞  2009-9-14 15:22
引用: 引用 6 楼 paul_chao 的回复:
硬件都做好了才問, 似乎是有點慢了, 以下都要做硬體修改

1. Timer output to A/D "Convert Start" pin.

2. Either one
2.1 DMA (You must connect A/D "Convert Done" pin to CPU DMA request pin) (I'm sure is the 2440 DMA support external memory bus. Please confirm it first.)
2.2 A/D "Convert Done" to CPU GPIO and read A/D data in GPIO ISR(or IISR is better) routine.

Paul, Chao @ Techware


Paul, chao老兄个的意见我认为可行,2440 DMA模块可以支持外部数据总线,如下:
1. Both source and destination are in the system bus
2. The source is in the system bus while the destination is in the peripheral bus
3. The source is in the peripheral bus while the destination is in the system bus
4. Both source and destination are in the peripheral bus

我打算从硬件修改,采用DMA模式采集数据。

因为我的数据是12bits,共有2路模拟信号,采样频率是100KHz,采样时间60秒,那么就需要 2byte * 100K * 60 * 2 = 24M byte的空间。
不知道这么大的数据量,是否能够满足?或是有其他的特殊要求?
点赞  2009-9-15 04:11
引用: 引用 9 楼 songtitan 的回复:
以CE的实时性来说,做到楼主这个us级别的实时操作很难。
没有硬件的FIFO来做buffer,丢数据是必然的。
就以目前的硬件来说,做到最好的现状就是使用硬件timer来绑定AD采样中断,并启用以最高优先级的IST来“抓紧时间”读数据。


这个方案是客户做到一半的东西,我估计之前的工程师是抄袭别人的。我看到过采用我想通方案的例子,可以实现这功能。只是别人没有使用才做系统,100K的采样频率,当然可以实现了。
点赞  2009-9-15 04:14
引用: 引用 10 楼 congyue123 的回复:
引用 6 楼 paul_chao 的回复:
硬件都做好了才問, 似乎是有點慢了, 以下都要做硬體修改

1. Timer output to A/D "Convert Start" pin.

2. Either one
2.1 DMA (You must connect A/D "Convert Done" pin to CPU DMA request pin) (I'm sure is the 2440 DMA support external memory bus. Please confirm it first.)
2.2 A/D "Convert Done" to CPU GPIO and read A/D data in GPIO ISR(or IISR is better) routine.

Paul, Chao @ Techware



Paul, chao老兄个的意见我认为可行,2440 DMA模块可以支持外部数据总线,如下:
1. Both source and destination are in the system bus
2. The source is in the system bus while the destination is in the peripheral bus
3. The source is in the peripheral bus while the destination is in the system bus
4. Both source and destination are in the peripheral bus

我打算从硬件修改,采用DMA模式采集数据。

因为我的数据是12bits,共有2路模拟信号,采样频率是100KHz,采样时间60秒,那么就需要 2byte * 100K * 60 * 2 = 24M byte的空间。
不知道这么大的数据量,是否能够满足?或是有其他的特殊要求?


我错了,2440不支持外部数据总线的DMA操作。
ISR方式的延迟也很大,不能达到100K的采样要求。
看来得从硬件上作修改才可以了,我打算加个FIFO,各位有什么建议?
点赞  2009-9-15 05:07
引用: 引用 12 楼 congyue123 的回复:

我错了,2440不支持外部数据总线的DMA操作。
ISR方式的延迟也很大,不能达到100K的采样要求。
看来得从硬件上作修改才可以了,我打算加个FIFO,各位有什么建议?


2410 user's manual chapter 8, first page

1. Both source and destination are in the system bus

?????

Paul, Chao @ Techware
点赞  2009-9-15 11:36
引用: 引用 13 楼 paul_chao 的回复:
引用 12 楼 congyue123 的回复:

我错了,2440不支持外部数据总线的DMA操作。
ISR方式的延迟也很大,不能达到100K的采样要求。
看来得从硬件上作修改才可以了,我打算加个FIFO,各位有什么建议?


2410 user's manual chapter 8, first page

1. Both source and destination are in the system bus

?????

Paul, Chao @ Techware


嗯,但是DMA每个通道的请求源,也就是2410 user's manual chapter 8, second page中的表格中,并没有外部总线。
还望指正。

点赞  2009-9-15 12:45
引用: 引用 13 楼 paul_chao 的回复:
引用 12 楼 congyue123 的回复:

我错了,2440不支持外部数据总线的DMA操作。
ISR方式的延迟也很大,不能达到100K的采样要求。
看来得从硬件上作修改才可以了,我打算加个FIFO,各位有什么建议?


2410 user's manual chapter 8, first page

1. Both source and destination are in the system bus

?????

Paul, Chao @ Techware


我明白了,之前是我理解的错误。

现在的打算启用DMA的模式,硬件上是可以实现的。在软件上还有不明白的地方。

DMA模块是独立于CPU的,那是不是外部数据总线在出发DMA的时候,就很快了,不会像中断那么长时间的延迟了。我的理解是,从开始出发DMA,到开始读数据,时间间隔在10ns左右,不知道正确与否。
点赞  2009-9-16 10:05
做出来了ma ?说说
点赞  2009-10-13 13:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复