شايد شما هم از اون دسته افرادي هستيد ، که مايلند يک مدار اسيلوسکوپ داشته باشند ، که قابليت اتصال و نمايش شکل موج ورودي را روي کامپيوتر داشته باشه . مداري که تصميم به توضيح در موردش رو دارم از طريق پورت پرينتر به کامپيوتر وصل ميشه . نرمافزار اين اسيلوسکوپ به زبان C هست و در محيط Turbo C نوشته شده.
توضيح مدار
سيگنال ورودي به يک يکسوساز تمام موج شامل op-amp هاي A1,A2 و يک مدار آشکار کننده عبور از صفر(Zero Crossing detector)که توسط LM3914 ساخته شده اعمال ميگردد. در نيم سيکلهاي مثبت D3 روشن و D4 خاموش است. در نتيجه op-amp هاي A1,A2 بصورت معکوس کننده ولتاژ عمل مينمايند و با توجه به اينکه
R2=R3=R4=R5=R6=R=330Ω
مقدار ضريب تقويت اين دو op-amp يک است. لذا خروجي op-amp ، A2 (پين 7 آي سي) برابر با ولتاژ ورودي (Vi) است. در نيم سيکل منفي D3 خاموش و D4 روشن است. لذا بازدن يک KCL در پايه 2 ، op-amp ، A1 با فرض اينکه ولتاژ اين پايه را V بناميم خواهيم داشت :
Vi/R + V/(2R) + V/R = 0
V = -(2/3)Vi
و در نهايت ولتاژ خروجي (Vo) در پايه 7 op-amp ، A2 از رابطه زير بدست مي آيد :
Vo = ( 1 + R/2R ) V = ( 1 + R/2R ) (-2Vi/3) = -Vi
پس در نيم سيکلهاي منفي سيگنال خروجي مثبت خواهد بود. آشکار کننده عبور از صفر جهت مشخص کردن اينکه سيکل مثبت يا منفي است طراحي شده. اگر اين قسمت درست عمل نکند باعث عدم نمايش صحيح سيگنال ورودي ، بر روي کامپيوتر خواهد شد. مدار آشکار ساز عبور از صفر وجود نيم سيکل منفي را با يک کردن پين 15 کانکتور پورت پرينتر به PC اطلاع ميدهد.در واقع مدار آشکار ساز عبور از صفر از طريق بيت D3 پورت وضعيت (379Hex) با کامپيوتر در ارتباط است .
خروجی یکسوساز تمام موج به ورودی مدار نمونه گیر (Sample and Hold) شامل A3,A4,IC6,T1 و خازن C3 اعمال میشود.این مدار از سیگنال ورودی در زمان های معین نمونه برداری کرده و جهت تبدیل به فرمت دیجیتال در اختیار ADC قرار میدهد.
زمانیکه بیس ترانزیستور از طریق پین 1 (بیت D0 از پورت 37A ) کانکتور پورت پرینتر صفر شود ، هدایت ترانزیستور قطع شده و ولتاژ کلکتور آن بالا میرود. بالا رفتن ولتاژ کلکتور ترانزیستور T1 باعث بسته شدن کلید داخل IC6 میشود. در نتیجه سیگنال آنالوگ ورودی به خازن اعمال شده و آنرا به اندازه سطح ولتاژ سیگنال شارژ میکند.
هنگامیکه کلید مجددا باز شد توسط اعمال سطح ولتاز منطقی یک ، از پین 1 پورت پرینتر به بیس ترانزیستور T1 ، ولتاژ ذخیره شده در خازن از طریق بافر (A1) به پین 6 آی سی ADC0804 جهت تبدیل به فرمت دیجیتال داده میشود. هرچه تعداد نمونههای گرفته شده از شکل سیگنال ورودی بیشتر باشد ، شکل موج بدست آمده دقیقتر خواهد بود.
ADC0804 دارای یک مدار تولید کننده پالس ساعت داخلی است ، واز طریق قطعات بیرونی که به آن متصل میشوند مقدار آن قابل تعیین است. با توجه به مقادیر R1=10k و C4=150pf زمان تبدیل مقدار آنالوگ به دیجیتال تقریبا 100 میکرو ثانیه است.
از آنجایی که از طریق پورت پرینتر فقط میتوان در هر لحظه 4 بیت اطلاعات را خواند. لذا با استفاده از آی سی 74244 که بصورت مالتی پلکسر 2 به 1 هشت بیتی استفاده شده این مشکل مرتفع شده است.
برنامه اسیلوسکوپ
من برای شما سورس برنامه و فایل اجرائی بهمراه فایل EGAVGA.BGI را درون یک فایل زیپ قرار دادم . برای دانلود این فایل که حجم آن 38.7 کیلوبایت هست اینجا کلیک کنید.
دقت کنید که فایل اجرایی بایستی همراه با فایل EGAVGA.BGI در یک مسیر قرار داشته باشند . در غیر اینصورت برنامه اجرا نخواهد شد.
/* PROGRAM FOR PC OSCILLOSCOPE */
/*by M.M.VIJAI ANAND B.E (E.E.E) C.I.T */
#include
#include
#include
#include
#include
#include
#include
#define data 0x0378
#define stat 0x0379
#define cont 0x037
void graphics(int[],int[]); //FUNCTION TO DISPLAY GRAPH AND WAVEFORM
void settings(); //FUNCTION TO CHANGE THE SETTINGS(TIME AND VOLTAGE)
long int samp=7000; //PLEASE CHECK THESE VALUES WHEN CONVERSION IS
// NOT PROPER(+-3000)
float scale=1;
float times=1;
char again=’a’;
int number=800;
void main()
{
int i,j,k,a[1700],b[1700],c[1700],e[1700]; //This value 1700 is given when we want to compress the waveform
//done when we compress the time scale
long int b1;
clrscr();
settings();
while(again==’a’)
{
for(i=0;i
outportb(cont,0x05^0x0b);
outportb(cont,0x04^0x0b);
e[i]=(inportb(stat)^0x80)&0x08;
for(b1=0;b1<=samp;b1++) //sampling time is approximately 50 µsec
{}
outportb(cont,0x05^0x0b);
outportb(cont,0x01^0x0b);
outportb(cont,0x05^0x0b);
while((inportb(cont)&0x08)==0x00) //converstion time is approximately 100 µsec
{}
outportb(data,0xf0);
a[i]=(inportb(stat)^0x80)&0xf0;
outportb(data,0x01);
b[i]=(inportb(stat)^0x80)&0xf0;
outportb(data,0xff);
}
for(i=0;i
a[i]=a[i]>>4;
c[i]=a[i]+b[i];
c[i]=c[i]*0.0196*45/scale;
}
graphics(c,e);
}
}
void graphics(int a1[],int e1[])
{
int gd=DETECT,gm,max,may,a,b,c,im,error,get=5;
char str[10],*st=”-“,d;
clrscr();
initgraph(&gd,&gm,””); //use default bgi path
error=graphresult();
if(error != grOk)
{
printf(“Graphics error %s “,grapherrormsg(error));
//reports error when
//graphics is not set
printf(” ———————————–“);
printf(” — http://www.HLachini.com —“);
printf(” — E-mail: eLachini@Gmail.com —“);
printf(” — ************************* —“);
printf(” — Mobile:+98 912 381 2060 —“);
printf(” — Hossein Lachini —“);
printf(” ———————————–“);
printf(” PRESS ANY KEY TO EXIT”);
getch();
exit(1);
}
setbkcolor(LIGHTCYAN);
setcolor(MAGENTA);
settextstyle(2,0,5);
max=getmaxx();
may=getmaxy();
may=may-20;
outtextxy(0,may,”OSCILLOSCOPE [http://www.HLachini.com]”);
settextstyle(0,0,1);
setcolor(BLUE);
outtextxy(max-200,may+2,”press ‘a’ for next sample”);
setcolor(BROWN);
outtextxy(max-200,may+10,”press any key to exit”);
setcolor(GREEN);
settextstyle(0,0,0);
for(a=0;a<=may;a+=get)
{line(0,a,800,a);
}
for(a=0;a<=max;a+=get)
{
line(a,0,a,may);
}
setcolor(BROWN);
setlinestyle(0,3,0);
line(max/2,0,max/2,may);
line(0,may/2,max,may/2);
setcolor(RED);
for(a=0,c=0;a<=max;a+=50,c++)
{
putpixel(a,may/2,BLUE);
itoa((a-c*30)*times/2,str,10);
outtextxy(a+3,may/2+3,str);
}
for(b=(may/2)-45,c=1;b>=0;b-=45,c++)
{
itoa((c*scale),str,10);
putpixel((max/2),b,BLUE);
outtextxy((max/2)+3,b+3,str);
}
for(b=(may/2)+45,c=1;b<=800;b+=45,c++)
{
itoa((c*scale),str,10);
strcat(st,str);
putpixel((max/2),b,BLUE);
outtextxy((max/2)+2,b+2,st);
strcpy(st,”-“);
}
setcolor(MAGENTA);
outtextxy(max-80,may/2+30,”time(msec)”);
settextstyle(0,1,0);
outtextxy((max/2)-10,0,”volt(s)”);
setlinestyle(0,0,0);
setcolor(RED);
moveto(0,may/2);
for(b=0,c=0;b<=number;c+=1, b++)
{
if(e1[b]!=0x08)
{
lineto(c*times,((may/2)-a1[b]));
}
else
{
lineto(c*times,((may/2)+a1[b]));
}}
again = getch();
closegraph();
restorecrtmode();
}
void settings()
{
int gd=DETECT,gm,error,max,may,b;
char c,d,e[2],m,*n;
times=1;
initgraph(&gd,&gm,””); //default bgi directory path
error=graphresult();
if(error != grOk)
{
printf(“Graphics error %s “,grapherrormsg(error));
printf(” ———————————–“);
printf(” — http://www.HLachini.com —“);
printf(” — E-mail: eLachini@Gmail.com —“);
printf(” — ************************* —“);
printf(” — Mobile:+98 912 381 2060 —“);
printf(” — Hossein Lachini —“);
printf(” ———————————–“);
printf(” PRESS ANY KEY TO EXIT”);
getch();
exit(1);
}
max=getmaxx();
setbkcolor(LIGHTBLUE);
settextstyle(1,0,0);
setcolor(BROWN);
outtextxy(max/2-90,10,”www.HLachini.com”);
outtextxy(max/2-90,20,”Hossein Lachini”);
outtextxy(max/2-120,30,”E-mail : eLachini@Gmail.com”);
outtextxy(max/2-120,40,”Mobile : +98 912 381 2060″);
outtextxy(max/2-60,50,”SETTINGS”);
line(0,60,800,60);
setcolor(MAGENTA);
settextstyle(1,0,1);
outtextxy((max/4)-70,80,”Voltage Scale”);
settextstyle(0,0,0);
setcolor(BROWN);
outtextxy(10,120,”DEFAULT :”);
outtextxy(10,130,” 1 unit = 1 volt”);
setcolor(RED);
outtextxy(10,170,”TYPE ‘C’ TO CHANGE AND ‘D’ TO DEFAULT”);
c=getch();
if(c==’c’)
{
outtextxy(10,200,”TYPE 1 for 1 unit = 2 volt”);
outtextxy(10,240,”TYPE 2 for 1 unit = 4 volt”);
outtextxy(10,300,”TYPE 3 for user defined”);
switch(getch())
{
case ‘1’ :
{ scale=2;
break;
}
case ‘2’ :
{scale = 4;
break;
}
case ‘3’:
{
outtextxy(10,340,”TYPE VALUES FROM 1 TO 9 (minimize) or m to (magnify)”);
d=getch();
if(d==’m’)
{
outtextxy(10,360,”TYPE a (1 unit = 0.5 volt) or b (1 unit = 0.25 volt)”);
switch(getch())
{
case ‘a’:
{
scale=0.5;
break;
}
case ‘b’:
{
scale=0.25;
break;
}
}
}
else
{ e[0]=’0′;
e[1]= ‘0’;
e[2]=d;
scale=atoi(e);
break;
}
}
}
}
setcolor(BROWN);
outtextxy(10,380,”TYPE C TO CHANGE TIME SETTINGS”);
m=getch();
if( m==’c’)
{
cleardevice();
outtextxy(10,20,”X AXIS 1 unit= 10msec CHANGE TO x(10msec)”);
outtextxy(10,40,”TYPE ‘a’ IF x IS (2 to 9) ,’b’ IF x IS (10 to 99) AND ‘c’ IF x IS (.5 TO .9)”);
switch(getch())
{
case ‘a’:
outtextxy(10,60,”x value is ….”);
n[0]=getch();
times=atoi(n);
itoa(times,n,10);
outtextxy(10,70,n);
break;
case ‘b’:
outtextxy(10,60,”x value is ….”);
n[0]=getch();
n[1]=getch();
times=atoi(n);
itoa(times,n,10);
outtextxy(10,70,n);
break;
case ‘c’:
outtextxy(10,60,”x value is…”);
getch();
n[0]=getch();
times=atoi(n)*0.1;
outtextxy(10,70,”scale decremented”);
break;
}
number=800;
if(times<1)
{number=number/times;
}
getch();
}
closegraph();
restorecrtmode();
}
من در سایت نرمافزاری را جهت دانلود قرار دادم که با نصب آن در محیط ویندوز صاحب یک اسیلوسکوپ تمام عیار خواهید شد . این اسیلوسکوپ جهت دریافت سیگنال از ورودی کارت صدا استفاده میکند. جهت دانلود این نرمافزار اینجا کلیک کنید .
ict.maker.mihanblog.com