您现在的位置:瑞博华网站-选购指南-使用DA输出作信号发生器 返回
使用DA输出作信号发生器
     
 

使用AD7202卡的DA输出功能 + 专用驱动程序

本功能原理,事先把期望发生波形的数据送入缓存中,然后使用板卡上的硬件定时按照缓存中的内容输出相应的信号。

 
     
 

简单程序说明

 
   
 
  声明数组
   
  把数据送入数组中
  通道1输出直流
  道2输出正弦波
   
  初始化板卡
   
  把数组送入板卡缓存
   
  启动
   
  开始采集
WORD SigMap[128*1024*2];
int i,j;

printf("正准备输出\r\n");

//计算波形
for(i = 0;i< 128 * 1024 ;i++) {
    SigMap[i] = 3000; // (3000-2048)/2047*5 = 2.325V
    SigMap[128 * 1024 + i] = 2048 + 1000 * sin(6.28 * i / 128./ 1024.);
}

if (Initial(140, 5, 1, 0) == ADCard_Error) {
    printf("初始化失败!");
    return 0;
}

if (SignalMap(SigMap) == ADCard_Error) {
    printf ("SignalMap失败!\r\n");
    return 0;
}

WaveOutput(1, 0, 0);

if (StartIntr(5, 200, 0, 4, 50000, 0, 0) == ADCard_Error ) {
    printf("StartIntr失败!\r\n");
    return 0;
}

printf("信号发生器正在输出!");

 
   
 

信号发生器功能的使用方法 

 
     
 

与 AD 采集功能相独立,本板还有灵活的信号发生器功能。信号发生器功能通过 IOCtl 接口提供,也有等价的、专用的 DLL 接口 ( 因而控件将不支持此专用接口,而只能使用通用的 IOCtl 接口 ) 。为使用信号发生器功能,先用 Initial 方法初始化整个板,再用 SignalMap( 或等价的 IOCtl 接口 ) 把波形数据下载到板上缓冲区,再用 SetupFreq( 或等价的 IOCtl 接口 ) 设置波形推进频率和滤波频率,对于周期波形信号,其信号频率可由 SignalFreq 函数求得;再用 WaveOutput( 或等价的 IOCtl 接口 ) 决定波形允许输出或停止。在工作结束时应用 WaveOutput( 或等价的 IOCtl 接口 ) 命令停止波形输出,由于本板 AD 采集与 DA 信号发生器输出采用同一时钟发生器,在数据采集的过程中信号发生器才工作,但实际输出或停止信号发生器,在采集过程中依据 WaveOutput 中设置的状态而定。各命令的详细解释如下:

1. int SignalMap(WORD * Map);

此命令把内存缓冲区 Map 中的波形数据下载到板上缓冲区中,以便下一步循环输出。对应本板, Map[0] 至 Map[131071] 为第 1 通道的 128K 波形数据,有效值范围为 0~4095 , ( 此处每点数据 s , 2048 表示电平 0) ; Map[131072+0] 至 Map[131072+131071] 为第 2 通道的 128K 波形数据,有效值范围同样为 0~4095 。函数返回 0(ADCard_Error) 表示调用失败,返回 1(ADCard_Success) 表示调用成功。

等价的 IOCtl(InSize,InBuff,OutSize,OutBuff) 接口: InSize=128*1024*2*2=524288;InBuff 所指数组中,即为 SignalMap 中的 Map 数组; OutSize=0 。

2. int SetupFreq(int PointFreq, int FilterFreq1, int FilterFreq2);

此命令设置波形输出的关键参数,即每通道波形输出频率 ( 推进频率 )PointFreq ,、通道 1 和通道 2 的低通滤波器截止频率 FilterFreq1 和 FilterFreq2 。由于此板信号发生器的时钟与 AD 采集的时钟共享,且由 AD 采集的启动参数 (StartIntr 或 StartSnapshot 命令的名义采集频率 ) 决定,且不带低通滤波器,因此,此函数实际不起任何作用,仅为不同的信号发生器板编程接口统一而保留。函数返回 0(ADCard_Error) 表示调用失败,返回 1(ADCard_Success) 表示调用成功。

等价的 IOCtl(InSize,InBuff,OutSize,OutBuff) 接口中, InSize=4*sizeof(int)=16;InBuff 所指数组中,第 1 个长整数为周期信号循环时缓冲区实际长度 ( 本板固定为 128K=128*1024=131072) ,第 2 个整数为推进频率 PointFreq ,第 3 个整数为通道 1 的滤波频率 FilterFreq1 ,第 4 个整数为通道 2 的滤波频率 FilterFreq2 ; OutSize=0 。

3. int WaveOutput(int Enabled, int Amp1, int Amp2);

此命令决定波形是否实际输出, Enabled = 0 表示将禁止输出 ( 波形不再变化 ) , =1 表示在数据采集的过程中真正输出设定的信号波形。函数返回 0(ADCard_Error) 表示调用失败,返回 1(ADCard_Success) 表示调用成功。

等价的 IOCtl(InSize,InBuff,OutSize,OutBuff) 接口中, InSize=5;InBuff 所指数组中,第 1 个字节存放 Enabled ,第 2 、 3 字节作为短整数存放 Amp1 ,第 4 、 5 字节作为短整数存放 Amp2 ; OutSize=0 。

4. float SignalFreq(int PointFreq, int RepeatNum, int BuffLen);

此命令给出输出波形的实际频率。 PointFreq 为命令 2 的 SetupFreq 中的 PointFreq 参数 ( 此值应该使用 AD 采集的名义频率值 ) , RepeatNum 说明波形为周期波形时, BuffLen 个点 ( 本板 BuffLen=128*1024) 的缓冲区中周期波形共有几个周期。此函数将返回真正的信号频率。

等价的 IOCtl(InSize,InBuff,OutSize,OutBuff) 接口中, InSize=3*sizeof(int)=12 ; Buff 所指数组中,第 1 长整数存放 BuffLen ,第 2 长整数存放 PointFreq ,第 3 长整数存放 RepeatNum ; OutSize=sizeof(float)=4 , OutBuf 指向一个 float 变量,存放求出的信号频率。

5. int WaveGenConfInfo(int * DABit, int * AmpMax, int * WaveChnNum, int * WavePointBufLen);

此命令返回所使用的信号输出板的性能指标。 DABit 为所使用的 DA 芯片的位数,可能为 8 、 12 、 16 等 ( 本板将返回 12) ; AmpMax 为内置的程控放大器的最大放大倍数,可能为 256 、 128 等值 ( 本板返回的值无意义 ) ; WaveChnNum 为本板支持的信号通道数,可能为 1 、 2 等值 ( 本板将返回 2) ; WavePointBufLen 为每通道信号的最大点数,可能为 64K 、 128K 等值 ( 本板将返回 128K=128*1024=131072) 。函数调用成功将返回 ADCard_Success ,失败将返回 ADCard_Error 。

等价的 IOCtl(InSize,InBuff,OutSize,OutBuff) 接口中, InSize=0 , OutSize=4*sizeof(int)=12 ; OutBuff 所指数组中,第 1 长整数将返回 DABit ,第 2 长整数将返回 AmpMax ,第 3 长整数将返回 WaveChnNum ,第 4 长整数将返回 WavePointBufLen 。

 
     
  返回