Arduino Input Høj-Lav

Fra HTX Arduino
Spring til navigation Spring til søgning

En Arduino har grænser for, hvor den skifter mellem et logisk højt og lavt input. Hvilket kan bruges under programmering af en Arduino til at konvertere strøm til en digital værdi. Der skal være en bestemt spænding til stede før en Arduino anser inputtet, den modtager som 1 eller 0.

Grænsen kan findes ved at lave en opstilling, hvor Arduinoen viser spændingen ved et skift fra HØJ til LAV eller omvendt, ved at printe spændingen i den serielle monitor.


Datablad

Tabellen er taget fra databladet[1] og viser hvornår et input med sikkerhed er LAV eller HØJ.

Når inputspændingen er indenfor -0.5 og 0.2 eller 0.3 gange forsyningsspændingen, afhængig af forsyningsspændingens størrelse, er den LAV.

Når inputspændingen er indenfor 0.6 eller 0.7 gange forsyningsspændingen og forsyningsspændningen + 0.5, er den HØJ.

Det er et meget bredt spekter at input-niveauet angiver, men typisk vil skiftet ligge omkring 0.5 gange forsyningsspændingen.

Der er angivet at der sidder en schmitt-trigger i indgangen på alle digitale input, dog med undtagelse af oscillator-indgangen, som ikke er tilgængelig på en Arduino. Databladet fortæller dog minimalt om hvilke spændinger den skifter på, der er dog angivet lidt omkring den serielle indgang som vist her:

Udsnit fra databladet, der viser hysteresen på den serielle indgang
Udsnit fra databladet, der viser hysteresen på den serielle indgang

I databladet ses det at hysteresen er 0.05*Vcc, og med en Arduino der arbejder på 5V bliver det til 0.25V, hvilket eftervises længere nede på siden.

Test kode

Billedet viser et diagram over den opstilling der er brugt.

Pin 8 er det digitale input. Der er også koblet et voltmeter til inden den digitale indgang, for at måle inputspændingen. Der er også herfra koblet en ledning ned til den første analoge indgang på Arduinoen, denne måler også hvor meget strøm, der er inden indgang.

Koden til denne opstilling:

//definere input pins nummer 
int inputD = 8;
int inputA = A0;
//denne variabel indeholder den sidste digitale værdi, og nuværende hvis det er ligeefter skiftet.
boolean lastDigitalValue = false;
//sætter arduinoen op, så den kan læse værdierne af pinene, og kommunikere med computeren.
void setup() { Serial.begin(9600);
  pinMode(inputD, INPUT);
  pinMode(inputA, INPUT);
}
void loop() { //den digitale værdi læses og gemmes til senere brug.
  boolean digitalValue = digitalRead(inputD) == HIGH;

  //den analog værdi gemmes til hvis der nu er skift hvilket ville kunne være tilfældet, hvis den først blev læst,
  //så der er mindst chance for at den skifter inden at den sendes til computeren,
  //da der kan være lidt forsinkelses fordi der sker lidt før der sendes.
  //den er conventere desuden fra analog værdi(0-1023) til volt(den er kallibreret efter et volt meter, hvor 1023(analog værdi) = 5V).
  float analogValue = ((float) analogRead(inputA))/1023*5.104;

  //tjekker om den digitale værdi er skiftet siden sidst.
  if(digitalValue != lastDigitalValue){
    //fortæller om det er op eller ned gang, altså fra LOW til HIGH eller omvendt.
    if(lastDigitalValue) Serial.print("Change at(1->0): ");
    else Serial.print("Change at(0->1): ");

    //analog værdi tilføjes til stringen.
    Serial.print(analogValue);
    Serial.print("V\n");

    //den sidste digitale værdi opdateres.
    lastDigitalValue = digitalValue;
  }
}

Kode fra Daniel Aarup Hasselund og Ole Van Santen's Arduino aflevering

Den ovenstående kode's output vil se således ud:

Ud fra dette kan det ses at en Arduino har input hysterese da skiftet fra højt til lavt ikke ligger samme sted som fra lavt til højt.

Hysterese

At det har en hysterese vil sige at systemet er afhængigt af om en variable er stigende eller aftagende. I forbindelse med arduinoens input kan dette hjælpe med at forhindre at et input ligger og svinger mellem højt og lavt hvis den for eksempel kun lige er oppe og være høj.

Her er et eksempel hvor der øverst vises en graf med input og output uden en hysterese og nederst er der en graf hvor man kan se input og output med hysterese. Som man kan se kommer outputtet af det ustabile input til at svinge meget uden en hysterese hvor at det samme input med en hysterese er meget mere stabilt.

Supplerende målinger

For at tjekke at flere forskellige Arduinoer opfører sig på samme måde er der lavet en ekstra opstilling, som måler egenskaberne for schmitt-triggerens hysterese.

Opstillingen er lavet med en modstand og en kondensator, hvor en udgang styrer modstanden høj eller lav, og det vil så op- eller af-lade kondensatoren. Kondensatoren har så forbindelse til en digital og en analog indgang. Koden oplader så kondensatoren indtil den digitale indgang skifter til høj, og på det tidspunkt udskrives spændingen udregnet fra den analoge måling. Når det er sket sættes udgangen lav, så kondensatoren aflades indtil den digitale indgang bliver lav, hvor den analoge måling udskrives. Dette gentages fortløbende.

Kredsløbet ser ud som vist her:

Kredsløb til måling af hysteresen på et Arduino input
Kredsløb til måling af hysteresen på et Arduino input

Koden til måling af hysteresen

Til måling af hysteresen er der lavet følgende kode:

byte pin = 7;

void setup() {
  // put your setup code here, to run once:
  pinMode(12, OUTPUT);
  digitalWrite(12, LOW);
  delay(1000);
  Serial.begin(1000000);
}

int analog;
float volt;
boolean digital;

void laes() {
  analog = analogRead(A0);
  digital = digitalRead(pin);
}

void loop() {
  if (Serial.available()) {
    pin = Serial.parseInt();
    Serial.println(pin);
    while (Serial.available()) {
      char ch = Serial.read();
    }
  }
  digitalWrite(12, HIGH);
  laes();
  while(! digital) {
    laes();
  }
  volt = (float) analog * 5.0 / 1024.0;
  Serial.print("Vutl\t");
  Serial.println(volt);
  digitalWrite(12, LOW);
  laes();
  while(digital) {
    laes();
  }
  volt = (float) analog * 5.0 / 1024.0;
  Serial.print("Vltl\t");
  Serial.println(volt);
}

Den første del af koden i loop er lavet til at man kan skifte det digitale input man måler på. Man gør det ved at skrive pin-nummeret ind i Serial Monitor

Resultater af målinger på indgangenes hysterese

Der er målt på 3 forskellige Arduino UNOer, hvor det kun er den første, hvor alle input er målt igennem.

  Klon 1 Original Klon 2
Pin Vltl Vutl   Vltl Vutl   Vltl Vutl
2 2,23 2,51   2,21 2,56   2,31 2,51
3 2,24 2,52            
4 2,24 2,53            
5 2,21 2,50   2,21 2,53   2,29 2,51
6 2,20 2,52            
7 2,20 2,51   2,19 2,55   2,24 2,55
8 2,21 2,49            
9 2,15 2,43            
10 2,17 2,44            
11 2,13 2,44   2,16 2,47   2,22 2,46
13 2,10 2,43   2,15 2,43   2,20 2,43
A1 (15) 2,17 2,46   2,15 2,53   2,22 2,51
A2 (16) 2,14 2,46            
A3 (17) 2,16 2,47            
A4 (18) 2,14 2,47            
A5 (19) 2,14 2,46   2,14 2,52   2,20 2,50

Som det ses på målingerne, så er der små variationer, både i hysteresens størrelse og i hvor de ligger i spændingsområdet, men det er ganske små variationer, og det ligger fint inden for det forventede.

Referencer


Arduino Elektrisk
Arduino Input Input - Input Høj-Lav - Input Strøm-Spænding - Input med intern Pull Up - Analogt - Analogt Input - Analog indgang - Arduino Reference Input - Input Tidsforhold - Specielle Input
Arduino Output Output - Output Høj-Lav - Output Strøm-Spænding - Analogt Output - Output Tidsforhold
Arduino Tidsforhold Arduino Reset Tid - Arduino setup() Tid - Arduino loop() Tid - Arduino Interrupt Tid - Arduino Tidsforhold Variabeltyper - Arduino Tidsforhold Sprogstrukturer - Input Tidsforhold - Output Tidsforhold - Serielle Tidsforhold