Простой осциллограф на Arduino Nano (Uno) + TLC5540 + Nokia 5110

На рисунке показана схема простого осциллографа на 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» кнопками «+» и «-» можно двигать по горизонтали изображение осциллограммы (два полных экрана).

Библиотеки

Adafruit_PCD8544.zip

Adafruit_GFX.zip

// 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 кГц импульс

Добавить комментарий

Войти с помощью: