Étape 6: L’Oscilloscope
Ci-dessous, vous trouverez l’esquisse de l’Oscilloscope. Avant de copier et coller le programme, nous allons examiner quelques limitations et expliquer le programme.
J’ai dû faire une bonne quantité de recherche à venir avec le code, et de nombreux extraits ont été « empruntés » provenant de plusieurs sources.
J’ai divisé le programme en plusieurs subrutines pour le rendre plus facile à comprendre. Le code est bien documenté, mais, si vous avez du mal comprendre, laissez un commentaire et je vais essayer d’expliquer il.
La bande passante Oscilloscope est limitée à 1 khz environ, mais il n’y a place à amélioration.
L’entrée est limitée à une forme d’onde 5 volts crête à crête, sauf si vous utilisez un diviseur de tension à l’entrée et aussi limitée à des formes d’onde positives de 0 à 5 volts.
J’ai utilisé un code que j’ai trouvé à: http://www.microsmart.co.za/technical/2014/03/01/advanced-arduino-adc/ pour régler la durée d’échantillonnage ADC.
Les fonctions graphiques et touch ont été modifiées et empruntées, les exemples de Henning Karlsen fournis dans ses bibliothèques.
J’ai utilisé un régulateur de tension LM 317 et une minuterie IC 555 un astable ocillator, pour créer des signaux utilisés pour tester l’entrée de l’oscilloscope.
Espoir que vous avez apprécié la lecture et nous espérons construire cette instructable. Si vous le trouvez utile, vous pouvez voter pour moi dans les concours.
Remarque : J’ai inclus l’esquisse, le UTFT et les bibliothèques UTouch dans le fichier libraries.zip pour ceux d'entre vous rencontrez des problèmes.
Copiez et collez le croquis de votre IDE Arduino
---PROGRAMME D’AIDE
/*--------------------------------------------------------------
Programme : OscopetouchLCDmega
Description : Digital Oscilloscope avec données affichées
sur couleur TFT LCD avec écran tactile
Matériel : sainsmart mega2560 carte avec 3.5" tft lcd tactile module d’affichage et kit de blindage
http://www.sainsmart.com/Home-page-View/sainsmart...
Logiciel : Développé à l’aide du logiciel Arduino 1.0.3
Ce programme nécessite la bibliothèque UTFT et la
UTouch bibliothèque de Henning Karlsen.
Web : http://www.henningkarlsen.com/electronics
Version 1.00
Date: 5 avril 2014
Auteur : johnag
--------------------------------------------------------------*/
#include
#include
Déclarer les polices que nous utiliserons
extern uint8_t SmallFont [] ;
Initialiser l’écran et toucher les fonctions
UTFT myGLCD(ITDB32S,38,39,40,41) ;
UTouch myTouch(6,5,4,3,2) ;
Déclarer des variables
char buf [12] ;
int x, y ;
int d’entrée = 0 ;
octet échantillon [320] ;
octet OldSample [320] ;
int StartSample = 0 ;
int EndSample = 0 ;
int Max = 100 ;
int Min = 100 ;
mode d’int = 0 ;
dTime int = 1 ;
tmode int = 0 ;
int Trigger = 0 ;
int SampleSize = 0 ;
int parait = 0 ;
int dgvh ;
int hpos = 50 ; Set de 0v sur grille horizontale
int vsens = 4 ; sensibilité verticale
Définir les divers Prédiviseur ADC
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) ;
---Démarrer Subrutines---
---dessiner sous boutons
void 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) ;
}
sous position écran tactile---
touch() Sub {}
tandis que (myTouch.dataAvailable())
{
myTouch.read() ;
x=myTouch.GetX() ;
y=myTouch.Gety() ;
Delay(500) ;
Si ((y > = 1) & & (y < = 50)) / / ligne de retard
{
Si ((x > = 250) & & (x < = 300)) / / bouton de temporisation
waitForIt (250, 1, 310, 50) ;
mode = mode ++ ;
{
myGLCD.setColor (255, 0, 0) ;
myGLCD.drawRoundRect (250, 1, 310, 50) ;
Sélectionnez le temps de retard
Si (mode == 0) dTime = 0 ;
Si (mode == 1) dTime = 1 ;
Si (mode == 2) dTime = 2 ;
Si (mode == 3) dTime = 5 ;
Si (mode == 4) dTime = 10 ;
Si (mode == 5) dTime = 20 ;
Si (mode == 6) dTime = 30 ;
Si (mode == 7) dTime = 50 ;
Si (mode == 8) dTime = 100 ;
Si (mode == 9) dTime = 200 ;
Si (mode == 10) dTime = 500 ;
Si mode (mode > 10) = 0 ;
}}
Si ((y > = 70) & & (y < = 120)) / / Trigger ligne
{
Si ((x > = 250) & & (x < = 300)) / / bouton de déclenchement
waitForIt (250, 55, 310, 105) ;
TMode = tmode ++ ;
{
myGLCD.setColor (255, 0, 0) ;
Sélectionnez la valeur de déclenchement de logiciel
myGLCD.drawRoundRect (250, 55, 310, 105) ;
Si (tmode == 1) déclencheur = 0 ;
Si (tmode == 2) Trigger = 10 ;
Si (tmode == 3) Trigger = 20 ;
Si (tmode == 4) Trigger = 30 ;
Si (tmode == 5) Trigger = 50 ;
Si tmode (tmode > 5) = 0 ;
}}
Si ((y > = 130) & & (y < = 180)) / / H position rangée
{
Si ((x > = 250) & & (x < = 300)) / / H position bouton
waitForIt (250, 110, 310, 160) ;
hpos = hpos ++ ;
{
myGLCD.setColor (255, 0, 0) ;
myGLCD.drawRoundRect (250, 110, 310, 160) ;
myGLCD.clrScr() ;
Buttons() ;
Si (hpos > 60) hpos = 50 ;
}}}}
---attendre pour toucher sub
void waitForIt (int x1, int y1, int x2, int y2)
{
tandis que (myTouch.dataAvailable())
myTouch.read() ;
}
---dessiner void grille
void DrawGrid() {}
myGLCD.setColor (0, 200, 0) ;
pour (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) ;
}
---Attendez d’entrée est supérieure à sup de déclencheur
trigger() Sub {}
tandis que (entrée < Trigger) {entrée = analogRead (A0) * 5/100 ;
}}
---Fin Subrutines---
void setup() {}
myGLCD.InitLCD() ;
myGLCD.clrScr() ;
myTouch.InitTouch() ;
myTouch.setPrecision(PREC_MEDIUM) ;
Buttons() ;
pinMode (0, entrée) ;
mettre en place l’ADC
ADCSRA & = ~ PS_128 ; enlever les bits définis par la bibliothèque de l’Arduino
vous pouvez choisir un Prédiviseur par en dessous.
PS_16, PS_32, PS_64 ou PS_128
ADCSRA | = PS_64 ; définir nos propres Prédiviseur
}
void loop() {}
{while(1)}
DrawGrid() ;
Touch() ;
Trigger() ;
Recueillir les données analogiques dans un tableau
StartSample = micros() ;
pour (xpos int = 0 ;
XPos < 240 ; XPos ++) {échantillon [PosX] = analogRead (A0) * 5/102 ;
delayMicroseconds(dTime) ;
}
EndSample = micros() ;
Visualisez les données analogiques recueillies de tableau
pour (xpos int = 0; xpos < 239 ;
XPos ++)
{
Effacer l’écran précédent
myGLCD.setColor (0, 0, 0) ;
myGLCD.drawLine (xpos + 1, 255-OldSample [xpos + 1] * vsens-hpos, xpos + 2, 255-OldSample [xpos + 2] * vsens-hpos) ;
Si (xpos == 0) myGLCD.drawLine (xpos + 1, 1, xpos + 1, 239) ;
Dessiner les nouvelles données
myGLCD.setColor (255, 255, 255) ;
myGLCD.drawLine (xpos, 255-Sample [PosX] * vsens-hpos, xpos + 1, 255-Sample [xpos + 1] * vsens-hpos) ;
}
Déterminer la tension crête à crête de sample
Max = échantillon [100] ;
Min = échantillon [100] ;
pour (xpos int = 0 ;
XPos < 240 ; XPos ++)
{
OldSample [PosX] = échantillon [PosX] ;
Si (échantillon [PosX] > Max) Max = échantillon [PosX] ;
Si (échantillon [PosX] < Min) Min = échantillon [PosX] ;
}
afficher le temps de l’échantillon, le temps de retard et de déclencher le niveau
myGLCD.setBackColor (0, 0, 255) ;
myGLCD.setFont (SmallFont) ;
myGLCD.setBackColor (0, 0, 255) ;
myGLCD.print ("Delay", 260, 5) ;
myGLCD.print ("", 270, 20) ;
myGLCD.print (itoa (dTime, buf, 10), 270, 20) ;
myGLCD.print ("hexahedron", 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) ;
Parait = (EndSample-StartSample) / 1000 ;
myGLCD.print ("s", 205, 210) ;
myGLCD.print ("", 280, 30) ;
myGLCD.print (itoa (parait, buf, 10), 205, 220) ;
Gamme de 0 à 64 * 78 = 4992 mV
SampleSize = (Max-Min) * 78 ;
myGLCD.print ("mvolts", 5, 210) ;
myGLCD.print (itoa (SampleSize, buf, 10), 5, 220) ;
myGLCD.print (itoa (analogRead (A0) * 4.15 / 10,23, buf, 10), 110, 220) ;
}}
---FIN PROGRAMME