怎么用汇编编9114的采集程序 点击:957 | 回复:7



别再吃鸽

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-26 10:12:00
楼主
我想每隔0.50ms对PCI-9114ADG的每个通道(单端32通道)各采一个样点,该怎么做呀? 不知道能不能用汇编做呢?抛开PCIS-DASK或汇编与pcis-dask一起结合使用。 不管大虾小虾,给我解决了问题的,都是好虾。 各虾们快给我出谋划策吧,求你了。 我发现PCIS-DASK里边没有那个现成的函数适用呀,如AI_ContScanChannels. 我该怎么办呀?



GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-12-25 13:45:00
1楼
板卡上应该有 Timer 可用, 设定该 Timer 使其每 0.5ms 产生一次 Interrupt, 在 ISR() 中取其 AD 值. 一般的 AD 卡都支持这样的方式. 此块卡应该只有一颗 ADC 吧! 所以每个通道之采样不可能同步, 只能轮流采样 (在 ISR 中取完 AD 值后, 再设定下一个通道, 下次 ISR 进来后就可以取新的通道 AD 值). 单纯用 assembly 也行啊! 只是比较麻烦. 您必须自行去找出板卡的 I/O address, 依其说明书去规划该 AD card.

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-25 15:01:00
2楼
我的开发环境是Win98,VC++ 6.0。 PCI-9114ADG的确是单ADC.要获取该板卡的I/O Address倒不难, 我自编读写,单字节,单字,双字的端口操作函数 inportb,inportw,inportd/outportb,outportw,outportd后, 用这些函数已经能返回I/O Address,问题是接下来的汇编采集代码 老采不回来数据。 烦大虾们给我说说用汇编编制采集过程的步骤好吗? 还有,我的意思是每0.50ms采集一帧数据(0至31道每通道采一个 样点),这一帧数据是连续无间断的采集得到的。 这该怎么做?

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-25 15:11:00
3楼
PCI-9114ADG的一些指标如下: 特性 32位PCI总线,即插即用 32通道单端或16通道差动输入 16位高分辨率A/D转换器 双极性模拟量输入范围 卡上带有可存储1KWords数据的FIFO 通道自动扫描功能选择 最高250KHz采样频率 可编程增益:1、2、4、8 <--PCI-9114(A)DG 两种触发模式:软件触发与定时器触发 16个高驱动能力隔离数字量输出通道 16个隔离数字量输入通道 紧凑型半长卡结构 DB-37连接器用于模拟量输入 两个20-pin接头用于数字量I/O

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-12-25 18:43:00
4楼
VC 里面就有 _inp(), _outp()... 之类的函数可用了, 您不需自己再写一次. AD 的基本运作是... 给一个 Trigger 信号 (_outp), Check 状态(_inp), Get 数据(_inp). 只要依说明书上的 register offset address 去 access 即可. 并不需用到 assembly. 这些细节应该可以请 yoyo1101 老师补充说明. 改变 channel 或 gain code 后, 得 delay 一段时间待其 ready, 才可去 trigger ...; 每个通道的设定/delay/trigger/delay/get data... 都会有时间差存在. 比较麻烦的是, VC 写的 Appliation 不可处理 ISR(). 若要用 interrupt 的话, 还是得用 ADLink 的套件, 不然就得自己写 kernel mode driver 了!

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-25 21:10:00
5楼
GaryLin大虾,你说的ADLink的套件是指什么呢?--PCIS-DASK吗? 我之所以自编端口操作函数,是因为我是跟别人合作开发的,合作者 用的是Borland C++ Builder 6.0,我先在VC6.0下测试,OK后再转移 到BCB 6.0下面。 对于我的采集要求:每0.50毫秒采一帧样点(单端0--31通道每道一个 样点),你觉得用板载的计数器1和计数器2可行吗?

别再吃鸽

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 29回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2003年11月20日
发表于:2003-12-25 21:17:00
6楼
还有就是采集一帧样点(单端0--31通道每道一个样点), 能不能用通道自动扫描功能来实现呢? 采集的一帧数据共32个样点,咱能不能先放在FIFO里面,等这一帧 数据全部转换完毕后,再一次性把它从FIFO里面取走放到自定义缓冲 区呢?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2003-12-26 10:12:00
7楼
1/250KHz = 3.9us 每次改变 channel 的 settling time 粗估 8us, 共 31 channel, 所以 (3.9+8) * 31 = 368.9us (小于 0.5ms) 简单的来看是 OK 的.

热门招聘
相关主题

官方公众号

智造工程师