86/9/19
3:31 ع
شاید شما هم از اون دسته افرادی هستید ، که مایلند یک مدار اسیلوسکوپ داشته باشند ، که قابلیت اتصال و نمایش شکل موج ورودی را روی کامپیوتر داشته باشه . مداری که تصمیم به توضیح در موردش رو دارم از طریق پورت پرینتر به کامپیوتر وصل میشه . نرمافزار این اسیلوسکوپ به زبان C هست و در محیط Turbo C نوشته شده.
i
جهت دیدن نقشه در اندازه بزرگتر بر روی آن کلیک کنید.
سیگنال ورودی به یک یکسوساز تمام موج شامل 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[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<number;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 \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[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 \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 در یک مسیر قرار داشته باشند . در غیر اینصورت برنامه اجرا نخواهد شد.
?
جهت دانلود فایلهای فوق اینجا کلیک کنید.
حجم فایل : 38.7 کیلو بایت
فرمت فایل Zip
برخی دوستان که این مدار را ساختند با من تماس گرفتند که برنامه درست کار نمیکند که پس از دادن برخی توضیحات مشکل اجرای برنامه مرتفع شد. از این جهت من برخی نکات را یادآوری می نمایم.
- این برنامه چون مستقیما با سخت افزار سر و کار دارد لذا در ویندوزهای 2000 و Xp و بالاتر اجرا نمیشود. لذا من توصیه میکنم که این برنامه در ویندوز 98 یا 95 یا حتی DOS اجرا گردد.
- این برنامه در هر بار اجرا یک نمونخ از سیگنال ورودی دریافت کرده و آنرا نمایش میدهد لذا جهت نمایش اطلاعات تازه تر حتما باید حرف "A" را بر روی کیبورد بزنید.