📄 ac6611.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <graph.h>
#include <sys/timeb.h>
struct timeb st,et;
//**********************
// program by york wang
// www.wwlab.com.cn
// 2004.4.19
//**********************
unsigned short iobase;
main()
{
long i,j,k,ii;
//----------------------------------------------------------------------
_clearscreen( _GCLEARSCREEN ) ;
printf("\nac6611 testing program wwlab (c) 2004.3.\n\n") ;
//find ac6611
printf("\nFind AC6611.......");
i=fch365(0x6611,&iobase);
if(i=0)
{
printf("Error Find AC6611 board.....\a");
exit(0);
}
printf("Find AC6611, Adr=%x...........",iobase);
printf("Press any key to continue.") ;
getch();
//testing IO
testio() ;
testad();
printf("\nPress any key to continue.") ;
getch() ;
//menu
do{
_clearscreen( _GCLEARSCREEN ) ;
printf("\n(1) ad\n");
printf("(2) da\n");
printf("(3) setting time\n");
printf("(4) DA free voltage out\n");
printf("(0) quit\n");
printf("\n\ninput your sel....");
i=getch();
switch(i)
{
case '1':
ad_test();
break;
case '2':
da_test();
break;
case '3':
ad_setting();
break;
case '4':
da_free();
break;
}
}while(i!='0');
}
// sub for sampling a/d
// sampling channel=ad_ch, ad_ch=0-15
// data return by ac6611_sam,int , =0-4095
int ac6611_sam(int ad_ch)
{
int i,j,k;
// set ch and gain
i=ad_ch & 0x1f;
outp(iobase+0x0,i);
// delay 10uS, that's 2 a/d converting
for(j=0;j<3;j++)
{
k=inp(iobase+1);
while((i=inp(iobase+0x0) & 1) !=0);
}
// rd data
i=inpw(iobase+0x2);
return(i);
}
ad_setting()
{
int i,j,k;
printf("\n\nset input = FULL.....press any key to test\n");
//setting time
//set to 0
printf("data:");
//set ch
outp(iobase,15);
outp(iobase,0);
for(i=0;i<5;i++)
{
inp(iobase+1);
do{
k=inp(iobase) & 1;
}while(k!=0);
k=(inpw(iobase+2)>>4);
printf("%d....",k);
}
getch();
}
// testing a/d
ad_test()
{
int i, j, k;
int stch,endch;
int data;
long dd;
float uv,uv5,bv;
float adg=0;
sa:
_clearscreen( _GCLEARSCREEN ) ;
printf("input start channel(0-15):");
scanf("%d",&stch);
stch=stch & 0xf;
printf("input end channel(0-15):");
scanf("%d",&endch);
endch=endch & 0xf;
sa1:
_clearscreen( _GCLEARSCREEN ) ;
printf("ac6611 testing program wwlab 2004.3.\n") ;
do{
_settextposition(3,1);
printf("st. ch=%d end ch=%d\n",stch,endch) ;
printf("_____________________________________________________________\n");
printf("CH data 5V 10V +/-5V CH data 5V 10V +/-5V");
for(i=stch;i<=endch;i++)
{
// sam data
data=ac6611_sam(i);
data=(data>>4) & 0xfff;
// convert to voltage
uv=(float)data*10000.0/4095.0;
uv5=(float)data*5000.0/4095.0;
bv=(float)(data-2048)*5000.0/2048.0;
if(i<16)
{
_settextposition(i+6,1);
printf("%2d %4d %5.1f %5.0f %5.1f",i,data,uv5,uv,bv);
}
else
{
_settextposition(i+6-16,40);
printf("%2d %4d %5.1f %5.0f %5.1f",i,data,uv5,uv,bv);
}
}
_settextposition(24,1);
printf("ESC to quit, c: test channel ");
// delay 0.1S for display speed
dl();
aver();
i=0;
if(kbhit())
{
i=getch();
if(i=='c')
{
tsch();
goto sa1;
}
if(i!=27)
goto sa;
}
}while(i!=27);
}
aver()
{
int i,j,k;
long data=0;
int max=0,min=0xfff;
int stl=1000;
k=ac6611_sam(0);
k=ac6611_sam(0);
k=ac6611_sam(0);
k=ac6611_sam(0);
for(i=0;i<stl;i++)
{
k=ac6611_sam(0)/16;
k=k & 0xfff;
data+=k;
max=(k>max)?k:max;
min=(k<min)?k:min;
}
j=(int)(data/i);
_settextposition(23,1);
printf("ch0 data max=%5d min=%5d aver=%5d delta=%5d ",max,min,j,(max-min));
}
testad()
{
int i,j,k;
float a,b;
printf("\n\n testing A/D running....");
// start a/d
k=inp(iobase+1);
// if a/d end
do{
i=inp(iobase+0) & 1;
}while(i!=0);
printf("ok!\n");
printf("\n\ntesting A/D speed.....");
ftime(&st);
// 100000 converting
for(i=0;i<20;i++)
{
for(j=0;j<1000;j++)
{
k=inp(iobase+1);
do{
k=inp(iobase) & 1;
}while(k!=0);
k=inpw(iobase+2);
}
}
ftime(&et);
i=st.time;
j=st.millitm;
a=i+(float)j/1000.0;
i=et.time;
j=et.millitm;
b=i+(float)j/1000.0;
printf("%5.1f(KHZ)\n",20.0/(b-a));
}
testio()
{
unsigned int j,i,j1, k;
int m;
printf("\n IO testing");
m=0;
k=0 ;
for( i=0; i<65535; i++ )
{
outpw(iobase+0xe, i ) ;
j1=inpw( iobase+0x1e ) ;
if( j1!=i )
{
k=1 ;
printf("\nerror DIO0-7,std data:%x read in:%x",i,j1);
if(kbhit())
{
j1=getch();
if(j1=27)
break;
}
}
m++;
if(m>200)
{
printf("*") ;
m=0;
}
}
if( k!=0 )
printf("\n\aI/O Test error!" ) ;
else
printf("\nI/O Test OK!") ;
}
dl()
{
int i,j,k;
for(i=0;i<6000;i++)
{
outpw(iobase+2,0);
while((k=inpw(iobase) & 1) !=0);
}
}
tsch()
{
int i,j,k;
int d1,d2;
d1=ac6611_sam(0);
d1=ac6611_sam(0);
k=0;
for(i=1;i<32;i++)
{
d2=ac6611_sam(i);
j=abs(d1-d2);
if(j<20)
{
k++;
printf("\n\ach:%d error",i);
}
d1=d2;
}
printf("\ntest end, press any key to countinue...");
i=getch();
}
// set ac6611 da
// ch=0 1 da channel
// data=0-4095, 12bit da data
ac6611_da(int ch, int data)
{
int i,j,k;
// change 12bit data to 16bit
k=data<<4;
switch(ch)
{
case 0:
// da ch0
outpw(iobase+0x10,k);
break;
case 1:
// da ch0
outpw(iobase+0x12,k);
break;
}
}
da_test()
{
int i,j,k;
for(k=0;k<1;k++)
{
_clearscreen(_GCLEARSCREEN);
printf("\nda ch:%1d....(0-10V)\n",k);
printf("v=0\n");
ac6611_da(k,0);
i=getch();
printf("v=10v\n");
ac6611_da(k,0xfff);
i=getch();
printf("v=5v\n");
ac6611_da(k,0x800);
i=getch();
printf("v=3.541v\n");
ac6611_da(k,1450);
i=getch();
printf("da ch:%1d....(-10v - +10V)\n",k);
printf("v=0\n");
ac6611_da(k,0x800);
i=getch();
printf("v=10v\n");
ac6611_da(k,0xfff);
i=getch();
printf("v=-9v\n");
ac6611_da(k,204);
i=getch();
printf("v=-10v\n");
ac6611_da(k,0x0);
i=getch();
}
}
da_free()
{
int i,j,k;
float uv,bv;
int ddata;
_clearscreen(_GCLEARSCREEN);
printf("\nDA tesing +:to inc V / -: to dec V");
ddata=0;
do{
i=0;
uv=ddata*10.0/4095.0;
bv=uv*2-10;
_settextposition(10,10);
printf("data:%6d V(10V):%6.3f V(+/-10V):%6.3f",ddata,uv,bv);
ac6611_da(0,ddata);
if(kbhit())
{
i=getch();
printf("%c",i);
switch(i)
{
case '+':
ddata =ddata+50;
break;
case '-':
ddata =ddata-50;
break;
}
if(ddata>4095)
ddata=4095;
if(ddata<0)
ddata=0;
}
}while(i!=27);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -