![لاجیک آنالایزر با رزبری پای 1 07](https://blog.eca.ir/wp-content/uploads/2017/01/07-780x470.png)
لاجیک آنالایزر با رزبری پای
لاجیک آنالایزر چیست? لاجیک آنالایزر جهت تست مدارای لاجیک(منطقی) یا دیجیتال مورد استفاده قرار میگیرد. جهت عیب یابی مدارات دیجیتال نیاز به دستگاهی هست که دسترسی به تعداد زیادی از خطوط داشته باشد. اسیلوسکوپ نیز قادر به نمایش این سیگنال ها است اما لاجیک آنالایزر قادر به نمایش زمانبندی نسبی بین تعداد زیادی از سیگنال ها میباشد. همچنین لاجیک آنالایزر قادر به رد یابی(trace) سیگنال های منطقی نیز میباشد.در مدارات لاجیک میزان پیچیدگی بالا میرود برای همین بهترین دستگاه جهت مقایسه سیگنال ها و تراک کردن آن ها ،آنالایزور های لاجیک است.
پروژه لاجیک آنالایزر ساده با رزبری پای و ذخیره اطلاعات در اکسل
مسلم است که بعد از تست های اولیه، به جای کلید از منبع پالس استفاده می شود!! LED هم برای تشخیص سطح ولتاژ یک، قرار داده شده است.
کد پروژه : ابتدا یه برنامه می نویسیم که زمان تغییر و استقرار سطوح منطقی پالس رو در یه فایل اکسل ذخیره کنه
//g++ -o lat lat.cpp -lwiringPi #include <wiringPi.h> #include <iostream> #include <fstream> #include "vector" #include <stdio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> using namespace std; vector<long> a; int i=0; double p=0; void interrupt(void) { a.push_back(micros()); i++; } int kbhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if(ch != EOF) { ungetc(ch, stdin); return 1; } return 0; } int main(void) { wiringPiSetup(); pinMode(7,INPUT); pullUpDnControl(7,PUD_DOWN); wiringPiISR(7,INT_EDGE_BOTH,&interrupt); while(!kbhit()) { ofstream la("logictime.xls"); for(int i=1;i<a.size();i++) { la << a[i]-a[i-1]<<'\t'; } } //la.close(); return 0; }
نتیجه کد بالا، یک فایل اکسل با محتوای زمان پالس ها است ( بر حسب میکرو ثانیه ) :
که خانه های فرد، مربوط به زمان سطح منطقی یک و خانه های زوج، مربوط به زمان سطح منطقی صفر را نشان می دهد. در بخش بعدی، این تغییرات سطح ولتاژ رو به صورت گرافیکی نشان می دهیم.
ابتدا یه برنامه ساده برای رسم تغییر سیگنال تولیدی توسط یک کلید فشاری می نویسیم؛ یه فایل cpp بسازید و کد زیر رو بنویسید و ذخیره کنید :
//g++ la.cpp -o la $(pkg-config --libs opencv) -l wiringPi #include <wiringPi.h> #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "iostream" #include "stdio.h" using namespace std; using namespace cv; volatile int i=0; Mat img = Mat::ones(512,512,CV_32FC1); void interrupt(void) { i++; img = Mat::ones(512,512,CV_32FC1); if(i%2==1) line(img,Point(10,400),Point(400,400),Scalar(0,0,0)); else line(img,Point(10,20),Point(400,20),Scalar(0,0,0)); } void zero(cv::Mat img) { line(img,Point(10,400),Point(400,400),Scalar(0,0,0)); imshow("signal",img); waitKey(1); img = Mat::ones(512,512,CV_32FC1); } void one(cv::Mat img) { line(img,Point(10,20),Point(400,20),Scalar(0,0,0)); imshow("signal",img); waitKey(1); img = Mat::ones(512,512,CV_32FC1); } Mat image,gray; int main(void) { wiringPiSetup(); pinMode(7,INPUT); pullUpDnControl(7,PUD_DOWN); wiringPiISR(7,INT_EDGE_BOTH,&interrupt); while(waitKey(100)<3) { printf("%d\n",i); imshow("signal",img); } destroyWindow("signal"); return 0; }
برنامه بالا، پس از هر بار تغییر وضعیت کلید ( لبه بالا رونده و پایین رونده )، تابع مربوط به روال وقفه خارجی فراخوانی میشه که در اون، به متغیر i یک واحد اضافه میشه و بنا بر وضعیت موجود، خط صفر یا یک رو در ماتریس img رسم می کنه. و در حلقه اصلی برنامه هم، مقدار i و همچنین تصویر موجود در ماتریس img رو نمایش میده.
پروژه لاجیک آنالایزر ساده با رزبری پای و نمایش نموداری اطلاعات
برنامه زیر هم کامل شده برنامه بالاست برای رسم شکل پالس های اعمالی به پایه مذکور است :
//g++ la2.cpp -o la2 $(pkg-config --libs opencv) -l wiringPi #include <wiringPi.h> #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "iostream" #include "stdio.h" #include "vector" using namespace std; using namespace cv; vector<long> a; int i=0; Mat img = Mat::ones(512,512,CV_32FC1); double p=0; void interrupt(void) { img = Mat::ones(512,512,CV_32FC1); a.push_back(micros()); i++; p = 512.0/(a[(a.size()-1)] - a[0]); Point a1 = Point(0,100); Point a2; for(int t=0;t<a.size();t++) { if(t%2==0) { a2.x=a1.x+15; a2.y=100; line(img,a1,a2,Scalar(0,0,0)); line(img,Point(a1.x,400),a1,Scalar(0,0,0)); a1=a2; a1.y=400; } else { a2.x=a1.x+15; a2.y=400; line(img,a1,a2,Scalar(0,0,0)); line(img,Point(a1.x,100),a1,Scalar(0,0,0)); a1=a2; a1.y=100; } } } Mat image,gray; int main(void) { wiringPiSetup(); pinMode(7,INPUT); pullUpDnControl(7,PUD_DOWN); wiringPiISR(7,INT_EDGE_BOTH,&interrupt); while(waitKey(100)<3) { for(int j=0;j<a.size();j++) { cout<<"a[j+1] : "<<a[j+1]<<endl; cout<<"512/a[end]-a[0] :"<<512.0/(a[a.size()-1]-a[0])<<endl; } printf("%d\n",i); imshow("signal",img); } destroyWindow("signal"); return 0; }
ویدیوی عملکرد برنامه
منبع: DMF313. ir