На рисунке показана схема простого осциллографа на Arduino Nano (Uno) состоящего из платы Arduino, LCD дисплей 84×48 Nokia 5110 и быстродействующего 8-и битного АЦП TLC5540.
TLC5540 — представляет собой быстродействующий 8 битный АЦП, который осуществляет преобразование с производительностью до 40 MSPS. Тактовые импульсы для АЦП поступают с 9 цифрового выхода Arduino. Частота тактовых импульсов 8 МГц. Полоса пропускания осциллографа до 500 кГц (четыре периода на экран), но фактически полоса пропускания до 1 МГц с большим искажением формы сигнала.
Осциллограф содержит несколько значений периодов развертки — 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01, 0.005 0.002 мс (14 пределов). Максимальное напряжение (только положительное) АЦП TLC5540 2.28 В (перегруз до напряжения питания), поэтому на входе АЦП необходим делитель напряжения. Показанный на схеме делитель напряжения позволяет осциллографу работать с сигналом уровня TTL. Порт PORTC Aduino имеет контакты А0…А5, хотя АЦП TLC5540 8 бит, можно использовать только 6 бит порта Arduino, поэтому два младших бита АЦП TLC5540 не используются. В итоге в процессе преобразования аналогового напряжения в цифровое значение можно получить числа от 0 до 63.
Управление осциллографом очень простое, кнопками «+» и «-» можно менять период развертки, а кнопка «HOLD» «замораживает» изображение, в режиме «HOLD» кнопками «+» и «-» можно двигать по горизонтали изображение осциллограммы (два полных экрана).
Библиотеки
// D3 D4 D5 D6 D7 D8 == A0 A1 A2 A3 A4 A5 #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <SPI.h> Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);//CLK,DIN,DC,CE,RST |||| VCC +3.3 V , BL ++ 200 OM ++ 3.3 V int i,w=1,x,y,raz,hold,hh,sek,fff; float times; int h0,h1; byte data[255],arr_max=0,arr_min=255,arr_sum; void setup(){Serial.begin(9600); pinMode(12,INPUT); /// +++ pinMode(10,INPUT); /// --- pinMode(11,INPUT); /// hold display.begin();display.clearDisplay();display.display(); display.setContrast(70); // установка контраста display.setTextSize(1); // установка размера шрифта display.setTextColor(BLACK); // установка цвета текста pinMode(9, OUTPUT); TCCR1A = 0x40;TCCR1B = 0x09;OCR1A = 0; } void loop(){ ////////////////////// КНОПКИ ///////////////////////////////////////////////////////////////////////////////////////////////// if(digitalRead(11)==HIGH){hold++;hh=0;if(hold>1){hold=0;}delay(200);} if(digitalRead(12)==HIGH&&hold==1){hh++;if(hh>84){hh=84;}delay(200);} if(digitalRead(10)==HIGH&&hold==1){hh--;if(hh<0){hh=0;}delay(200);} if(digitalRead(12)==HIGH&&hold==0){raz++;hh=0;w=1;if(raz>13){raz=13;}delay(200);} if(digitalRead(10)==HIGH&&hold==0){raz--;hh=0;w=1;if(raz<0){raz=0;}delay(200);} ////////////////////// ИЗМЕРЕНИЕ ///////////////////////////////////////////////////////////////////////////////////////////// if(hold==0){ if(times>0.02){i=0;sinn();while(i<167){data[i]=PINC;delayMicroseconds(sek);i++;};i=0;} if(times==0.02){i=0;sinn();while(i<167){data[i]=PINC;i++;}i=0;} if(times<=0.01){ sinn(); data[0]=PINC;data[1]=PINC;data[2]=PINC;data[3]=PINC;data[4]=PINC; data[5]=PINC;data[6]=PINC;data[7]=PINC;data[8]=PINC;data[9]=PINC; data[10]=PINC;data[11]=PINC;data[12]=PINC;data[13]=PINC;data[14]=PINC; data[15]=PINC;data[16]=PINC;data[17]=PINC;data[18]=PINC;data[19]=PINC; data[20]=PINC;data[21]=PINC;data[22]=PINC;data[23]=PINC;data[24]=PINC; data[25]=PINC;data[26]=PINC;data[27]=PINC;data[28]=PINC;data[29]=PINC; data[30]=PINC;data[31]=PINC;data[32]=PINC;data[33]=PINC;data[34]=PINC; data[35]=PINC;data[36]=PINC;data[37]=PINC;data[38]=PINC;data[39]=PINC; data[40]=PINC;data[41]=PINC;data[42]=PINC;data[43]=PINC;data[44]=PINC; data[45]=PINC;data[46]=PINC;data[47]=PINC;data[48]=PINC;data[49]=PINC; data[50]=PINC;data[51]=PINC;data[52]=PINC;data[53]=PINC;data[54]=PINC; data[55]=PINC;data[56]=PINC;data[57]=PINC;data[58]=PINC;data[59]=PINC; data[60]=PINC;data[61]=PINC;data[62]=PINC;data[63]=PINC;data[64]=PINC; data[65]=PINC;data[66]=PINC;data[67]=PINC;data[68]=PINC;data[69]=PINC; data[70]=PINC;data[71]=PINC;data[72]=PINC;data[73]=PINC;data[74]=PINC; data[75]=PINC;data[76]=PINC;data[77]=PINC;data[78]=PINC;data[79]=PINC; data[80]=PINC;data[81]=PINC;data[82]=PINC;data[83]=PINC;data[84]=PINC; data[85]=PINC;data[86]=PINC;data[87]=PINC;data[88]=PINC;data[89]=PINC; data[90]=PINC;data[91]=PINC;data[92]=PINC;data[93]=PINC;data[94]=PINC; data[95]=PINC;data[96]=PINC;data[97]=PINC;data[98]=PINC;data[99]=PINC; data[100]=PINC;data[101]=PINC;data[102]=PINC;data[103]=PINC;data[104]=PINC; data[105]=PINC;data[106]=PINC;data[107]=PINC;data[108]=PINC;data[109]=PINC; data[110]=PINC;data[111]=PINC;data[112]=PINC;data[113]=PINC;data[114]=PINC; data[115]=PINC;data[116]=PINC;data[117]=PINC;data[118]=PINC;data[119]=PINC; data[120]=PINC;data[121]=PINC;data[122]=PINC;data[123]=PINC;data[124]=PINC; data[125]=PINC;data[126]=PINC;data[127]=PINC;data[128]=PINC;data[129]=PINC; data[130]=PINC;data[131]=PINC;data[132]=PINC;data[133]=PINC;data[134]=PINC; data[135]=PINC;data[136]=PINC;data[137]=PINC;data[138]=PINC;data[139]=PINC; data[140]=PINC;data[141]=PINC;data[142]=PINC;data[143]=PINC;data[144]=PINC; data[145]=PINC;data[146]=PINC;data[147]=PINC;data[148]=PINC;data[149]=PINC; data[150]=PINC;data[151]=PINC;data[152]=PINC;data[153]=PINC;data[154]=PINC; data[155]=PINC;data[156]=PINC;data[157]=PINC;data[158]=PINC;data[159]=PINC; data[160]=PINC;data[161]=PINC;data[162]=PINC;data[163]=PINC;data[164]=PINC; data[165]=PINC;data[166]=PINC;data[167]=PINC;data[168]=PINC;data[169]=PINC; data[170]=PINC;data[171]=PINC;data[172]=PINC;data[173]=PINC;data[174]=PINC; data[175]=PINC;data[176]=PINC;data[177]=PINC;data[178]=PINC;data[179]=PINC; data[180]=PINC;data[181]=PINC;data[182]=PINC;data[183]=PINC;data[184]=PINC; data[185]=PINC;data[186]=PINC;data[187]=PINC;data[188]=PINC;data[189]=PINC; data[190]=PINC;data[191]=PINC;data[192]=PINC;data[193]=PINC;data[194]=PINC; data[195]=PINC;data[196]=PINC;data[197]=PINC;data[198]=PINC;data[199]=PINC; data[200]=PINC;data[201]=PINC;data[202]=PINC;data[203]=PINC;data[204]=PINC; data[205]=PINC;data[206]=PINC;data[207]=PINC;data[208]=PINC;data[209]=PINC; data[210]=PINC;data[211]=PINC;data[212]=PINC;data[213]=PINC;data[214]=PINC; data[215]=PINC;data[216]=PINC;data[217]=PINC;data[218]=PINC;data[219]=PINC; data[220]=PINC;data[221]=PINC;data[222]=PINC;data[223]=PINC;data[224]=PINC; data[225]=PINC;data[226]=PINC;data[227]=PINC;data[228]=PINC;data[229]=PINC; data[230]=PINC;data[231]=PINC;data[232]=PINC;data[233]=PINC;data[234]=PINC; data[235]=PINC;data[236]=PINC;data[237]=PINC;data[238]=PINC;data[239]=PINC; data[240]=PINC;data[241]=PINC;data[242]=PINC;data[243]=PINC;data[244]=PINC; data[245]=PINC;data[246]=PINC;data[247]=PINC;data[248]=PINC;data[249]=PINC; data[250]=PINC;data[251]=PINC;data[252]=PINC;data[253]=PINC;data[254]=PINC;data[255]=PINC; }}i=0; display.clearDisplay(); display.setCursor(0,0); //////////////////////// РАЗВЕРТКА ////////////////////////////////////////// switch(raz){ case 0: times=50;sek=1800;fff=0;break; case 1: times=20;sek=750;fff=0;break; case 2: times=10;sek=400;fff=0;break; case 3: times=5;sek=200;fff=0;break; case 4: times=2;sek=80;fff=0;break; case 5: times=1;sek=37;fff=0;break; case 6: times=0.5;sek=18;fff=0;break; case 7: times=0.2;sek=6;fff=0;break; case 8: times=0.1;sek=3;fff=4;break; case 9: times=0.05;sek=1;fff=6;break; case 10: times=0.02;fff=10;break; case 11: times=0.010;fff=-1;break; case 12: times=0.005;fff=-1;break; case 13: times=0.002;fff=4;break; } ///////////////////////////// ВЫВОД НА ЭКРАН //////////////////////////////////////// display.print(times,3);display.print(" mS "); if(hold==1){display.print("HOLD ");} if(hold==0){display.print(" 1V ");} setka(); if(raz<11||raz==12){while(i<167){i++;display.drawLine(i-hh, 47-data[i],i-hh, 47-data[i+1], BLACK);}i=0;} if(raz==11){while(i<254){i++;display.drawLine(i/2-hh, 47-data[i],i/2-hh, 47-data[i+1], BLACK);}i=0;} if(raz==13){while(i<255){i++;display.drawLine(i*2-hh, 47-data[i],i*2-hh+1, 47-data[i+1], BLACK);}i=0;} display.display(); arr(); Serial.println(arr_max); } void sinn(){ while(PINC>arr_max){h0++;if(h0>10000){break;}}h0=0; while(PINC>arr_max-10){h0++;if(h0>10000){break;}}h0=0; while(PINC<arr_max){h1++;if(h1>10000){break;}}h1=0; } void arr(){ for(i=0;i<255;i++){arr_min = min(arr_min, data[i]);} for(i=0;i<255;i++){arr_max = max(arr_max, data[i]);} arr_max=arr_max+arr_min; if(arr_max>30){arr_max=20;} if(arr_max<20){arr_max=10;} } void setka(){ for(y=8;y<47;y=y+8){ for(x=0;x<83;x=x+4){ display.drawPixel(x, y, BLACK);}} for(x=0;x<83;x=x+26-fff){ for(y=10;y<47;y=y+4){ display.drawPixel(x, y, BLACK);}} }
500 кГц синус |
||
1 МГц синус |
1 МГц импульс |
500 кГц импульс |