首页 上一页 1 2 3 下一页 尾页

我的采集程序哪里出问题了?帮帮忙看看 点击:2264 | 回复:54



习习

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-17 17:49:00
楼主
我用的K-811数据采集卡,但是加入8253控制采集频率后,就不能采集到数据,只是一个固定的数:(.大家帮我看看哪里出问题了?多谢了
#include "stdio"
#include "dos.h"
#include "conio.h"

main()
{
    int ch;
    int dl,dh,j,base;
    clrscr();
    base=0x300; /*基卡地址*/
    dl=inportb(base+1); /*空读低8位,清除转换标志及中断标志*/
    printf("input channle number:");
    scanf("%d",&ch);
    outportb(base,ch); /*送通道号*/
    outportb(base+0xf,0xb1); /*设定8253定时器控制字,选择计数器3,方式0*/
    outportb(base+0xe,0x0f/0x99); /*送计数初值 9999*/
    outportb(base+0xe,0x27/0x99);

    for(j=0;j<1000;j++) /*控制采样次数*/
       { 

        do{
           ; 
           }while(inportb(base)<=128); /*查询AD转换状态*/
        outportb(base+0xe,0x0f/0x99); /*再次启动8253计数*/
        outportb(base+0xe,0x27/0x99);
        dh=inportb(base+0); /*读数据*/
        dl=inportb(base+1);
        outportb(base+4,dl); /*数据送入D/A通道,进行DA转换*/
        outportb(base+5,dh);
        inportb(base+4); /*启动D/A转换*/
        
        }
}



GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-18 10:17:00
1楼
用 8253/8254 去定時 trigger ADC 時, 通常是用 Mode 3, 不會是 Mode 0.

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-18 17:48:00
2楼
谢谢!终于有人回复了 :)
哦那我看看用方式3采集试试。
还有个问题就是关于延时的,在给8253赋计数初值和控制字要不要加延时? 以及启动AD转换时要不要加延时?这个延时时间长短跟 8253的计数初值有关吗?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-19 09:50:00
3楼
8253/8254 給予初值時, 尚需等待 1~2 的 clock 進入後, 初值才會寫入, 但這跟 delay 不是同一個觀念.

Trigger ADC 開始轉換後, 您需要去檢查其 status, 待其 ready 後才能取值. 這跟 ADC 本身的轉換速度有關. 

相對的, 8253 的 trigger 速度不能比 ADC 的轉換速度還高, 太高時, trigger 信號應該是會 lost!

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-20 15:11:00
4楼
  首先谢谢GaryLin 的帮助!
  不过看了还是不非常明白:(.比较笨 不要介意,嘿嘿。
  我们的8253的定时通道3的clock 是采集卡上提供的时钟。 您的意思是说 要等待一会在给8253赋初值是吗?
  还有触发器的速度不能比adc的转换速度高,是指要保证采集的间隔时间(或者说在启动ad后并保持adc工作的时间)要大于ad转换时间吗?关于这一点,我这里采用的是8253的方式0,计数到0之后,输出高电平保持不变,反相后启动ad转换,直到ad转换结束后,重新给初值,8253才输出低电平,ad转换关闭。我的程序中在每次 ad转换结束后都查询转换状态,如果结束了就重新给8253初值,这个应该能够保证在ad转换结束后才开始下一次采集吧?
  

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-20 15:13:00
5楼
还有阿用了方式3 还是不行阿!采不到数据,采到的都是一个固定的数,4.99:(. 还显示了10000个!

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-20 19:24:00
6楼
給 8253 初值後, 要再多等 2 clock, 該 8253 才會處於 Ready.

您用 mode 0 (down count) 去 trigger ADC, 程序必需反覆設定, 這樣很麻煩, 而時間會有誤差(程序上).
用 mode 3 (pulses generation) 是相對簡單的方式, 只要設定一次, 即可固定時間(hardware 上) 去 trigger ADC.

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-21 09:36:00
7楼
哦这样子那我在8253赋初值后 等待1~2个colck。试一试 :)
采用mode3的话,要在计数到0,out输出电平极性改变得过程中,保证实现采样,保持,以及数据的读取吧。那这个时间怎么保证哪?
 

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-21 13:18:00
8楼
Mode 3 會不停的輸出 pulses, 每個 pulse 都會對 ADC trigger 一次. 所以, 您直接檢查 ADC 的狀態即可, 由 ready 變成 busy 表示開始轉換, 由 busy 變成 ready 表示該次轉換結束.
因此, 您對 8253 的設定, 必須確認其 pulse 的輸出頻率是低於 ADC 轉換速度的.

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-21 14:18:00
9楼
可是我现在的卡上只能查询到转换结束的状态标志
AD转换的状态如下:
D7 D6 D5 D4 D3 D2 D1 D0
0  *  *  *  *  *  *  *  表示没有或正在转换
1  *  *  *  *  *  *  *    转换结束
所以我只能查询到 转换结束的标志,对于AD转换开始无法查询到。
还有您说的ADC转换速度 就是AD转换时间的倒数吧? 
我这儿的AD转换时间为10us,采用8253集准时钟为2MHz,那么mode3的话,选计数初值为至少大于40,再根据信号频率50Hz,以及香浓定理,选10倍的采样频率,则计数初值为4000,对吧?

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-21 14:22:00
10楼
那这个频率对于adc转换速度来说会不会太小了阿?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-21 16:31:00
11楼
Busy 與 Ready 是相反的.
等他 busy, 再等他 ready, 表示轉完信號.
再看到 busy, 又等到 ready, 表示另一筆信號又轉完了!

取樣率 500Hz (=2ms), 2MHz/500Hz = 4000. 是的!
(Trigger 速度 2ms 一次, 慢於 ADC 轉換速度 10us. OK)

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-22 11:40:00
12楼
哦 非常谢谢GaryLin 前辈的指导,:) 我去实验室调试看看但愿成功 。不过有问题的话 还得向你请教呀,呵呵。

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-26 10:22:00
13楼
还有问题要请教 GaryLin前辈:
您提到的 給8253 初值後, 要再多等 2 clock, 該 8253 才會處於 Ready. 那这个在程序中我们要怎么样做才行?给一个延时使延时时间刚好大于等于 2个8253的clock 时间,这样子行吗?请赐教:)

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-26 10:54:00
14楼
在一般的應用中, clock 是 always 在輸入的, 應該可以略過那兩個 clock 不管, 這不影響您的數據採集. 

但若您的 clock 是用特別的控制方式產生的(說一動,做一動), 那您就得記得多給它 2 個 clock, 以免一直等不到它開始動作!

您的採集程序可以 work 了嗎?

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-26 15:57:00
15楼
现在好像还不行,能采集到数据,但是显示的采集结果不大理想。本来按照 10倍的频率采的话,一个周期内应该是10个采集点,但是我的结果却是下面这个样子的:
 2.000000,2.000000.......   2.000000 (好像是连续的20多个吧)
 2.823000,2.823000.......   2.823000 (好像是连续的20多个吧)

 ....................................
 -1.180000,-1.180000........-1.180000 (好像是连续的20多个吧)总共有10个数, 这10个数呈规律性变化,但是每个点会显示好多次。
 不知道是怎么回事!!是那里出了问题您帮我分析一下吧?

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-26 16:01:00
16楼
采集卡的 clock 应该是总是输入的,因为那个采集卡没有提供让用户对clock进行操作的端口。我想应该算是连续不停的吧?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-26 16:26:00
17楼
同樣的數據多抓了約 20 次, 很可能是您的程序沒有等待 ADC 進行下一次的轉換. 也就是對同一次的轉換結果重覆讀取了! 您必須等它再次進入 busy 的狀態, 並等它再次回到 ready 的狀態時, 才能取一筆數據.

另種可能是外部信號在該時間內確實沒有變動, 所以您抓到相同的數據.

晴川

  • 精华:3帖
  • 求助:0帖
  • 帖子:48帖 | 352回
  • 年度积分:0
  • 历史总积分:676
  • 注册:2005年12月21日
发表于:2006-04-26 16:27:00
18楼
是不是你的循环周期比较长,与采集频率不相符

习习

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 38回
  • 年度积分:0
  • 历史总积分:103
  • 注册:2005年10月13日
发表于:2006-04-26 16:28:00
19楼
我刚看过采集卡的说明书,上面有个基准时钟:2MHz,占空比30%,是不是这个占空比 的问题? 

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2006-04-26 16:32:00
20楼
啥是占空比? 不懂!
 

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 下一页 尾页