اسيلوسکوپ

omidmet

عضو جدید
شايد شما هم از اون دسته افرادي هستيد ، که مايلند يک مدار اسيلوسکوپ داشته باشند ، که قابليت اتصال و نمايش شکل موج ورودي را روي کامپيوتر داشته باشه . مداري که تصميم به توضيح در موردش رو دارم از طريق پورت پرينتر به کامپيوتر وصل ميشه . نرم‌افزار اين اسيلوسکوپ به زبان 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 هشت بیتی استفاده شده این مشکل مرتفع شده است.
من در این برنامه سعی کردم با ایجاد تصویر یک فلش در جدول گلایف و نوشتن کدهای برنامه، این فلش را به سمت پایین حرکت دهم. پس شما هم با ما همراه باشید تا با یکی دیگر از افکتهای زیبا و پر کاربرد در تابلو روان آشنا گردیم.
در مقاله قبلی با ایجاد حرکت به سمت بالا به خوبی آشنا شدیم و از آنجایی که در این مبحث حرکت را در جهت خلاف آن یعنی به سمت پایین میخواهیم انجام دهیم، لذا کدهای برنامه بسیار مشابه حالت پیشین است و در مواردی بسیار کوچک تفاوت خواهد داشت. در حرکت به پایین شیفت اطلاعات به سمت راست باعث ایجاد حرکت به سمت بالا می‌گشت و در اینجا شیفت به سمت چپ باعث حرکت به پایین خواهد شد. جهت درک موضوع به برنامه زیر توجه کنید.


/*
*******************************
* Hossein Lachini *
* Web Site : www.HLachini.Com *
* E-mail : eLachini@Gmail.Com *
* Mobile : +98 912 381 2060 *
*******************************
*/

#include<dos.h>
#include<time.h>
#include<stdio.h>
#include <graphics.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#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<number;i++)
{
outportb(cont,0x05^0x0b);
outportb(cont,0x04^0x0b);
e=(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=(inportb(stat)^0x80)&0xf0;
outportb(data,0x01);
b=(inportb(stat)^0x80)&0xf0;
outportb(data,0xff);
}
for(i=0;i<number;i++)
{
a=a>>4;
c=a+b;
c=c*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 \n",grapherrormsg(error));
//reports error when
//graphics is not set
printf("\n -----------------------------------");
printf("\n --- http://www.HLachini.com ---");
printf("\n --- E-mail: eLachini@Gmail.com --- ");
printf("\n --- ************************* ---");
printf("\n --- Mobile:+98 912 381 2060 ---");
printf("\n --- Hossein Lachini ---");
printf("\n -----------------------------------");
printf("\n\nPRESS 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!=0x08)
{
lineto(c*times,((may/2)-a1));
}
else
{
lineto(c*times,((may/2)+a1));
}}
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 \n",grapherrormsg(error));
printf("\n -----------------------------------");
printf("\n --- http://www.HLachini.com ---");
printf("\n --- E-mail: eLachini@Gmail.com ---");
printf("\n --- ************************* ---");
printf("\n --- Mobile:+98 912 381 2060 ---");
printf("\n --- Hossein Lachini ---");
printf("\n -----------------------------------");
printf("\n\nPRESS 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 : H_Lachini@YahoO.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();
}





من برای شما سورس برنامه و فایل اجرائی بهمراه فایل EGAVGA.BGI را درون یک فایل زیپ قرار دادم . برای دانلود این فایل که حجم آن 38.7 کیلوبایت هست اینجا کلیک کنید.
دقت کنید که فایل اجرایی بایستی همراه با فایل EGAVGA.BGI در یک مسیر قرار داشته باشند . در غیر اینصورت برنامه اجرا نخواهد شد.

Í
جهت دانلود فایلهای فوق اینجا کلیک کنید.

[URL="http://www.avax-dl.ir/OSC.zip"]حجم فایل : 38.7 کیلو بایت

فرمت فایل Zip

[/URL] برخی دوستان که این مدار را ساختند با من تماس گرفتند که برنامه درست کار نمیکند که پس از دادن برخی توضیحات مشکل اجرای برنامه مرتفع شد. از این جهت من برخی نکات را یادآوری می نمایم.
- این برنامه چون مستقیما با سخت افزار سر و کار دارد لذا در ویندوزهای 2000 و Xp و بالاتر اجرا نمیشود. لذا من توصیه میکنم که این برنامه در ویندوز 98 یا 95 یا حتی DOS اجرا گردد.
- این برنامه در هر بار اجرا یک نمونخ از سیگنال ورودی دریافت کرده و آنرا نمایش میدهد لذا جهت نمایش اطلاعات تازه تر حتما باید حرف "A" را بر روی کیبورد بزنید.

;););););););)
 

پیوست ها

  • PC-Osilloscope.jpg
    PC-Osilloscope.jpg
    21 کیلوبایت · بازدیدها: 0
بالا