Go Down

Topic: Arduino Zeit zwischen Aufgaben messen (Read 4218 times) previous topic - next topic

michael_x

#15
Aug 27, 2015, 02:22 pm Last Edit: Aug 27, 2015, 05:41 pm by michael_x Reason: Nachtrag, Typo
Dann schau mal das Beispiel allein an, und erkenne dass millis() nie angehalten wird,
Die Differenz millis() - startzeit kann natürlich, wenn die Zeit es erlaubt, auch während der Messung ermittelt und angezeigt werden.

Und wenn du unbedingt willst, kannst du loop() auch nur alle 100 ms laufen lassen (Schade, aber ist ja dein sketch) Lieber würde ich noch einen zweiten Zeitmerker nehmen, der dir mit der gleichen Methode
if (millis() - letzteAnzeige > 100)  { ... } sagt, wann das Display wieder aktualisiert werden soll.


Nachtrag: Glaub nicht, dass nur weil du mit float rechnest, 3.16 auch 3.16V wären. Krieg lieber raus, welcher Wert (0 .. 1023) deiner 4.965 entspricht.

Um einen LCD Balken zu zeichnen, braucht man keine float-Berechnung.

makertom

Vielen Dank für deine Mühe. Morgen will ich mich etwas mit deinen Tipps auseinandersetzen.

ardubu

du hast Teile von dem Sketch von michael_x übernommen, aber die Variablendeklaration vergessen.
Ändere in deinem Sketch wert in value und setze am Anfang von loop
Code: [Select]
static bool running;
            static unsigned long startzeit; 
            static bool starttrigger = true; // mit Reset geht's los, danach ist unklar
ein, dann müsste es fehlerfrei kompelieren.

Wenn du einen Sketch ins Forum kopieren willst, benutze bitte </> oben links über den Smilies.

ardubu

#18
Aug 27, 2015, 11:34 pm Last Edit: Aug 27, 2015, 11:38 pm by ardubu
beim betrachten deines Sketches sind mir noch ein paar Dinge aufgefallen:
Quote
int analogInput = 0;
pinMode(analogInput, INPUT);
value = analogRead(4);
Du defenierst analogInput als A0, liest dann aber A4 ein.
Quote
vout = (value * 5.0) / 1024.0 + 0.00; // see text
      vin = vout ;//((R1+R2)/R2)*8.75/8.54;
Bei einem 10Bit ADC gehen die Werte von 0 bis 1023, also müsstest du durch 1023 teilen.
Wofür steht das + 0.00?
Du setzt vin=Vout ohne Bedingung, also könntest du gleich vin = (value * 5.0) / 1023.0; nehmen
Quote
float R1 = 100000.0; // Wiederstand R1 (100K)
   float R2 = 10000.0; // Wiederstand R2 (10K)   
Du definierst R1 + R2, benutzt sie aber in deinem Sketch nicht.
Quote
lcd.begin(16, 4);
Du initialisierst dein Display mit 16 Zeichen und 4 Zeilen, rufst aber 20 x lcd.write auf.

makertom

@ ardubu; michael_x

Vielen dank für eure Hilfe. Jetzt funktioniert das Programm endlich! :D

Danke auch an alle anderen die geholfen haben.

michael_x

Quote
also müsstest du durch 1023 teilen
falsch.

Du hast in 10 Bit 1024 mögliche Werte ( 0 .. 1023 ).

Ein einfach verständliches Beispiel ohne Rundungsfehler:
Wenn du das in nur 16 Ergebnisse umrechnen willst, multiplizierst du es mit 16  und teilst durch 1024, erhältst den richtigen Wert im Bereich 0 .. 15.

Klar, in float wirst du ohne Aufrunden nie den Wert 5.0000 erhalten, wenn du mit 5.00 / 1024  multiplizierst, und das wollen die meisten bei "Vollausschlag" sehen.

ardubu

Quote
falsch.
ich glaube da irrst du. Es sind zwar 1024 Werte, aber der erste Wert ist 0 und damit bleiben von o bis zum Ende nur 1023 Werte über. Versuche einmal 3V mit 2 Bit darzustellen, dann hat jede Sufe 1V.

 



 
   3V        --   4. Wert
               |
   2V      --     3. Wert
             |
   1V    --       2. Wert
           |
   0V  --         1. Wert

michael_x

Quote
Versuche einmal 3V mit 2 Bit darzustellen, dann hat jede Sufe 1V.
Eben. (Sind übrigens eher 4V, wenn du 2 bit hast und jede Stufe 1V entsprechen soll)

bei einem 10 Bit ADC (0 - 1023) ist die Richtige Umrechnung wert >> 8  ( oder * 4 / 1024 )  macht daraus 2 Bit mit den möglichen Werten 0 1 2 3. Jeder Bereich ist dann gleich groß.


DrDiettrich

Aus dem ATmega Datenblatt:
Quote
The ADC converts an analog input voltage to a 10-bit digital value through successive approximation.
The minimum value represents GND and the maximum value represents the voltage on the AREF pin minus 1 LSB.
Das entspricht dem üblichen ADC Design, ist definitiv nicht Arduino spezifisch. Eine Eingangsspannung von exakt AREF würde 1024 entsprechen, doch dieser Wert liegt außerhalb des 10 Bit Bereichs (0-1023).

Genau das selbe Verhalten findet man beim DAC, und ein solcher ist ja Teil des ADC. Ein DAC Ausgang kann nie seine AREF erreichen, seine maximale Ausgangsspannung bleibt immer eine Stufe (LSB) drunter.

Go Up