با کامپیوترمان اسکوپ بسازیم

0
1447

شاید شما هم از اون دسته افرادی هستید ، که مایلند یک مدار اسیلوسکوپ داشته باشند ، که قابلیت اتصال و نمایش شکل موج ورودی را روی کامپیوتر داشته باشه . مداری که تصمیم به توضیح در موردش رو دارم از طریق پورت پرینتر به کامپیوتر وصل میشه . نرم‌افزار این اسیلوسکوپ به زبان 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 (پین ۷ آی سی) برابر با ولتاژ ورودی (Vi) است. در نیم سیکل منفی D3 خاموش و D4 روشن است. لذا بازدن یک KCL در پایه ۲ ، op-amp ، A1 با فرض اینکه ولتاژ این پایه را V بنامیم خواهیم داشت :

 Vi/R + V/(2R) + V/R = 0

V = -(2/3)Vi

و در نهایت ولتاژ خروجی (Vo) در پایه ۷ op-amp ، A2 از رابطه زیر بدست می آید :

 Vo = ( 1 + R/2R ) V = ( 1 + R/2R ) (-2Vi/3) = -Vi

   پس در نیم سیکل‌های منفی سیگنال خروجی مثبت خواهد بود. آشکار کننده عبور از صفر جهت مشخص کردن اینکه سیکل مثبت یا منفی است طراحی شده. اگر این قسمت درست عمل نکند باعث عدم نمایش صحیح سیگنال ورودی ، بر روی کامپیوتر خواهد شد. مدار آشکار ساز عبور از صفر وجود نیم سیکل منفی را با یک کردن پین ۱۵ کانکتور پورت پرینتر به PC  اطلاع میدهد.در واقع مدار آشکار ساز عبور از صفر از طریق بیت D3 پورت وضعیت (۳۷۹Hex) با کامپیوتر در ارتباط است .

    خروجی یکسوساز تمام موج به ورودی مدار نمونه گیر (Sample and Hold) شامل A3,A4,IC6,T1 و خازن C3 اعمال می‌شود.این مدار از سیگنال ورودی در زمان های معین نمونه برداری کرده و جهت تبدیل به فرمت دیجیتال در اختیار ADC قرار میدهد.

    زمانیکه بیس ترانزیستور از طریق پین ۱ (بیت D0 از پورت ۳۷A ) کانکتور پورت پرینتر صفر شود ، هدایت ترانزیستور قطع شده و ولتاژ کلکتور آن بالا میرود. بالا رفتن ولتاژ کلکتور ترانزیستور T1 باعث بسته شدن کلید داخل IC6 میشود. در نتیجه سیگنال آنالوگ ورودی به خازن اعمال شده و آنرا به اندازه سطح ولتاژ سیگنال شارژ میکند.

    هنگامیکه کلید مجددا باز شد توسط اعمال سطح ولتاز منطقی یک ، از پین ۱ پورت پرینتر به بیس ترانزیستور T1 ، ولتاژ ذخیره شده در خازن از طریق بافر (A1) به پین ۶ آی سی ADC0804 جهت تبدیل به فرمت دیجیتال داده میشود. هرچه تعداد نمونه‌های گرفته شده از شکل سیگنال ورودی بیشتر باشد ، شکل موج بدست آمده دقیقتر خواهد بود.

    ADC0804 دارای یک مدار تولید کننده پالس ساعت داخلی است ، واز طریق قطعات بیرونی که به آن متصل میشوند مقدار آن قابل تعیین است. با توجه به مقادیر R1=10k و C4=150pf زمان تبدیل مقدار آنالوگ به دیجیتال تقریبا ۱۰۰ میکرو ثانیه است.

از آنجایی که از طریق پورت پرینتر فقط می‌توان در هر لحظه ۴ بیت اطلاعات را خواند. لذا با استفاده از آی سی ۷۴۲۴۴ که بصورت مالتی پلکسر ۲ به ۱ هشت بیتی استفاده شده این مشکل مرتفع شده است.

برنامه اسیلوسکوپ

من برای شما سورس برنامه و فایل اجرائی بهمراه فایل EGAVGA.BGI را درون یک فایل زیپ قرار دادم . برای دانلود این فایل که حجم آن ۳۸٫۷ کیلوبایت هست اینجا کلیک کنید.

دقت کنید که فایل اجرایی بایستی همراه با فایل 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

دیدگاه خود را بیان کنید

لطفا پیام خود را وارد نمایید
لطفا نام خود را در این قسمت وارد نمایید