Stap 6: De oscilloscoop
Hieronder vindt u de schets voor de oscilloscoop. Voordat we kopiëren en plakken van het programma, laten we enkele beperkingen controleert en verklaart het programma.
Ik heb te doen een behoorlijke hoeveelheid onderzoek om te komen met de code, en veel fragmenten hebben "geleend" van verschillende bronnen.
Ik onderverdeeld het programma in verschillende subrutines om het gemakkelijker te begrijpen. De code is goed gedocumenteerd, maar als je problemen hebt begrijpen, laat een reactie en ik zal proberen uit te leggen.
De oscilloscoop bandbreedte is beperkt tot ongeveer 1 khz, maar er is ruimte voor verbetering.
De ingang is beperkt tot een 5 volt piek tot piek golfvorm, tenzij u een scheidingslijn spanning bij de ingang, en ook beperkt tot positieve golfvormen van 0 tot 5 volt.
Ik gebruikte sommige code die ik gevonden op: http://www.microsmart.co.za/technical/2014/03/01/advanced-arduino-adc/ aan de ADC monster tijd aanpassen.
De grafische en touch functies werden bewerkt, en geleend, van de Henning Karlsen voorbeelden in zijn bibliotheken.
Ik gebruikte een spanningsregelaar LM 317, en een 555 timer IC als een astable ocillator, maken de signalen gebruikt voor het testen van de oscilloscoop input.
Hoop dat je genoten hebt van het lezen en hopelijk bouwen dit instructable. Als u het nuttig vinden, please vote voor me in de wedstrijden.
Opmerking: Ik opgenomen de sKetch, de UTFT en de bibliotheken van de UTouch in het libraries.zip bestand voor degenen onder u problemen.
Kopiëren en plakken van de schets aan de Arduino IDE
---START PROGRAMMA
/*--------------------------------------------------------------
Programma: OscopetouchLCDmega
Omschrijving: Digitale oscilloscoop met gegevens weergegeven
op kleur TFT LCD-scherm met touchscreen
Hardware: sainsmart mega2560 bord met 3,5-inch tft lcd aanraking module weergeven en schild kit
http://www.sainsmart.com/Home-Page-View/sainsmart...
Software: Ontwikkeld met behulp van de Arduino 1.0.3 software
Dit programma vereist de UTFT-bibliotheek en de
UTouch bibliotheek van Henning Karlsen.
Web: http://www.henningkarlsen.com/electronics
Versie 1.00
Datum: 5 April 2014
Auteur: johnag
--------------------------------------------------------------*/
#include
#include
Verklaren welke lettertypen die we zullen gebruiken
extern uint8_t SmallFont [];
Initialiseren van scherm en touch functies
UTFT myGLCD(ITDB32S,38,39,40,41);
UTouch myTouch(6,5,4,3,2);
Variabelen declareren
char buf [12];
int x, y;
int Input = 0;
byte monster [320];
byte OldSample [320];
int StartSample = 0;
int EndSample = 0;
int Max = 100;
int Min = 100;
int modus = 0;
int rekenwijze = 1;
int tmode = 0;
int Trigger = 0;
int SampleSize = 0;
int SampleTime = 0;
int dgvh;
int hpos = 50; set 0v op horizontaal raster
int vsens = 4; verticale gevoeligheid
Definiëren van verschillende ADC prescaler
Const unsigned char PS_16 = (1 << ADPS2);
Const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
Const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
Const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
---Start Subrutines---
---tekenen knoppen sub
ongeldig buttons() {}
myGLCD.setColor (0, 0, 255);
myGLCD.fillRoundRect (250, 1, 310, 50);
myGLCD.fillRoundRect (250 55, 310, 105);
myGLCD.fillRoundRect (250 110, 310, 160);
myGLCD.fillRoundRect (250, 165, 310, 215);
}
---touchscreen positie sub
ongeldig touch() {}
terwijl (myTouch.dataAvailable())
{
myTouch.read();
x=MyTouch.getX();
y=MyTouch.getY();
delay(500);
Als ((y > = 1) & & (y < = 50)) / / vertraging van rij
{
Als ((x > = 250) & & (x < = 300)) / / vertraging knop
waitForIt (250, 1, 310, 50);
modus = wijze ++;
{
myGLCD.setColor (255, 0, 0);
myGLCD.drawRoundRect (250, 1, 310, 50);
Selecteer vertragingstijden
Als (modus == 0) rekenwijze = 0;
Als (modus == 1) rekenwijze = 1;
Als (modus 2 ==) rekenwijze = 2;
Als (modus == 3) rekenwijze = 5;
Als (modus == 4) rekenwijze = 10;
Als (modus == 5) rekenwijze = 20;
Als (modus == 6) rekenwijze = 30;
Als (modus == 7) rekenwijze = 50;
Als (modus == 8) rekenwijze = 100;
Als (modus == 9) rekenwijze = 200;
Als (modus == 10) rekenwijze = 500;
Als (modus > 10) modus = 0;
}}
Als ((y > = 70) & & (y < = 120)) / / activeren van rij
{
Als ((x > = 250) & & (x < = 300)) / / Trigger knop
waitForIt (250 55, 310, 105);
tmode = tmode ++;
{
myGLCD.setColor (255, 0, 0);
Selecteer Software trigger waarde
myGLCD.drawRoundRect (250 55, 310, 105);
Als (tmode == 1) Trigger = 0;
Als (tmode == 2) Trigger = 10;
Als (tmode == 3) Trigger = 20;
Als (tmode == 4) Trigger = 30;
Als (tmode == 5) Trigger = 50;
Als (tmode > 5) tmode = 0;
}}
Als ((y > = 130) & & (y < = 180)) / / H rij positie
{
Als ((x > = 250) & & (x < = 300)) / / H positie knop
waitForIt (250 110, 310, 160);
hpos = hpos ++;
{
myGLCD.setColor (255, 0, 0);
myGLCD.drawRoundRect (250 110, 310, 160);
myGLCD.clrScr();
Buttons();
Als (hpos > 60) hpos = 50;
}}}}
---wachten voor aanraking sub
VOID waitForIt (int x1, int y1, int x2, int y2)
{
terwijl (myTouch.dataAvailable())
myTouch.read();
}
---tekenen raster sub
VOID DrawGrid() {}
myGLCD.setColor (0, 200, 0);
voor (dgvh = 0; dgvh < 5; dgvh ++) {}
myGLCD.drawLine (dgvh * 50, 0, dgvh * 50, 240);
myGLCD.drawLine (0, dgvh * 50, 245, dgvh * 50);
}
myGLCD.drawLine (245 0, 245, 240);
myGLCD.drawLine (0, 239, 245, 239);
myGLCD.setColor (255, 255, 255);
myGLCD.drawRoundRect (250, 1, 310, 50);
myGLCD.drawRoundRect (250 55, 310, 105);
myGLCD.drawRoundRect (250 110, 310, 160);
myGLCD.drawRoundRect (250, 165, 310, 215);
}
---Gewacht op invoer groter dan trigger sub van
ongeldig trigger() {}
terwijl (Input < Trigger) {Input = analogRead (A0) * 5/100;
}}
---Einde Subrutines---
VOID Setup {}
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
Buttons();
pinMode (0, INPUT);
instellen van de ADC
ADCSRA & = ~ PS_128; verwijderen van de bits ingesteld door Arduino library
u kunt een prescaler van onderen.
PS_16, PS_32, PS_64 of PS_128
ADCSRA | = PS_64; onze eigen prescaler instellen
}
void loop {}
while(1) {}
DrawGrid();
Touch();
trigger();
De analoge gegevens verzamelen in een array
StartSample = micros();
voor (int xpos = 0;
xpos < 240; xpos ++) {monster [xpos] = analogRead (A0) * 5/102;
delayMicroseconds(dTime);
}
EndSample = micros();
De verzamelde analoge gegevens uit array weergeven
voor (int xpos = 0; xpos < 239;
xpos ++)
{
Vorige weergave wissen
myGLCD.setColor (0, 0, 0);
myGLCD.drawLine (xpos + 1, 255-OldSample [xpos + 1] * vsens-hpos, xpos + 2, 255-OldSample [xpos + 2] * vsens-hpos);
Als (xpos == 0) myGLCD.drawLine (xpos + 1, 1, xpos + 1, 239);
Tekenen van de nieuwe gegevens
myGLCD.setColor (255, 255, 255);
myGLCD.drawLine (xpos, 255-monster [xpos] * vsens-hpos, xpos + 1, 255-monster [xpos + 1] * vsens-hpos);
}
Bepalen van monster spanning piek tot piek
Max = monster [100];
Min = monster [100];
voor (int xpos = 0;
xpos < 240; xpos ++)
{
OldSample [xpos] = monster [xpos];
Als (monster [xpos] > Max) Max = monster [xpos];
Als (monster [xpos] < Min) Min = monster [xpos];
}
weergeven van de tijd van de steekproef, de vertragingstijd en trigger niveau
myGLCD.setBackColor (0, 0, 255);
myGLCD.setFont (SmallFont);
myGLCD.setBackColor (0, 0, 255);
myGLCD.print ("vertraging", 260, 5);
myGLCD.print ("", 270, 20);
myGLCD.print (itoa (rekenwijze, buf, 10), 270, 20);
myGLCD.print ("Trig.", 260, 60);
myGLCD.print ("", 270, 75);
myGLCD.print (itoa (Trigger, buf, 10), 270, 75);
myGLCD.print ("H Pos.", 260, 120);
myGLCD.print (itoa (hpos, buf, 10), 270, 135);
myGLCD.setBackColor (0, 0, 0);
SampleTime = (EndSample-StartSample) / 1000;
myGLCD.print ("Sec.", 205, 210);
myGLCD.print ("", 280, 30);
myGLCD.print (itoa (SampleTime, buf, 10), 205, 220);
Bereik van 0 tot 64 * 78 = 4992 mV
SampleSize (Max-Min) = * 78;
myGLCD.print ("mVolt", 5, 210);
myGLCD.print (itoa (SampleSize, buf, 10), 5, 220);
myGLCD.print (itoa (analogRead (A0) * 4.15 / 10.23, buf, 10), 110, 220);
}}
---EINDE PROGRAMMA