Ist der Arduino Nano schnell genug?

Hallo,
Ich möchte die Spannung von 3 Phasen eines 50Hz Drehstromnetzes zu ganz bestimmten Zeitem nach einem Triggersignal abfragen und speichern. Die Sinusspannung beträgt 0v bis 4V. D.h. 1,66ms nach dem Triggersignal die Spannung am Analogeingang A0, 4,89ms nach dem Trigger die Spannung am Analogeingang A1 und nach 8,34ms die Spannung am Analogeingang A2.
Ist der Arduino mit seinen Analogeingängen dafür schnell genug. Bzw. Was wäre die kürzeste Abtastrate ?
Danke
Henry
3-phasen-sensor

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Ich rate dazu, das Datenblatt des ATMega328P zu lesen.
Dort drin steht die Abtastrate schwarz auf weiß.
Und auch was zu beachten ist.

Hallo UKHeliBob,

Sorry, ich wusste nicht dass ich in den Deutschen Teil der Forums gehen sollte.

Und meine Frage war wohl auch etwas blöd gestellt. Ich weiss das die eigentliche Abtastrate der Analogeingänge 10.000/Sek beträgt. Aber was mich wirklich interessiert, ob die ganze Routine mit Trigger, Abfrage und Abspeichern schnell genug abgearbeitet werden kann. Macht es also Sinn diese Aufgabe mit einem Arduino Nano zu versuchen?

Danke Henry

Wäre interessant zu wissen, wie Deine Routine aussieht.
Und versuchen macht meiner Meinung nach immer Sinn - lernt man doch immer was dazu.

Die schwarz auf Weiß "13 - 260 µs" sind, wenn du analogRead(A0) auf einem Nano (atmega328P) verwendest, in der Praxis ca. 130µs.
Wenn du dich in direkte Verwendung der atmega328P-Hardware einarbeitest, kannst du z.B mit 8bit-Auflösung etwas schneller werden.
Für 50 Hz geht es also gerade so, wobei der Zeitpunkt der Messung nicht -wie in deinem Post- auf 10µs genau ist, und die drei Phasen nicht tatsächlich gleichzeitig gemessen werden.

Auch kannst du auf einem Nano kaum Daten speichern, und Seriell senden ist auch relativ langsam (250000 Baud geht). Allein dafür würde eine Auflösung auf 8bit vieles erweitern/erleichtern/beschleunigen.

Wenn man deine Frage genau liest, möchtest du ja nur 3 einzelne Messungen in zeitlichem Abstand von mehreren ms nach einem Trigger-Ereignis machen.
Das geht; die Schwierigkeit wäre, von wann genau das Ergebnis ist, wenn du die Messung zum Zeitpunkt x startest.

Hallo Klaus und Michael,

Genau genommen benötige ich nur 3 analoge Eingänge. Nach dem Triggersignal will ich innerhalb
20ms hintereinander folgendes lesen und abspeichern L3 an A0, L3 an A1, L2 an A2, dann nochmal L3 an A0, L1 an A1 und L2 an A2. Alles innerhalb dieser 20 ms. In dieser Zeit müssen also 6 Werte gelesen und in Variable geschrieben werden. Danach gibt es genug Zeit zur Auswertung und zur Ausgabe des Ergebnisses. 8bit wäre völlig ausreichend. 1/10ms Abtastratentoleranz wäre ok.

O, Gott hoffentlich habe ich mich verständlich ausgedrückt.
Henry

Mein Testprogramm sagt:

6 Messungen in 768µs

Etwas fixer würde es im FreeRunningMode gehen, aber das hakelt dann mit den 3 Kanälen.

PS:
Es hat ca 5 Minuten gedauert, aus einem Beispiel, den 6 Fachmessvorgang zu basteln.

ja, super. Dann kann ich mal den Testaufbau machen und mich ans programmieren wagen.

Danke an alle
Henry

So jetzt habe ich den Testaufbau gemacht und es super funktioniert.
Arduino ist sehr schnell und eine 50Hz Periode kein Problem.

Jetzt kommt aber die Herausforderung.
Abhängig von 6 Messungen innerhalb der 50Hz Periode wird ein Wert
errechnet. Und "zur selben Zeit" läuft ein zweiter loop der mit PWM
ein 50Hz Signal erzeugt, dessen Amplitude von dem im 1. loop
errechneten Wert abhängen soll.

Natürlich kann der Arduino nicht 2 loops gleichzeitig laufen lassen.
grafik

jetzt meine Idee. Ich mache die 6 Messungen nicht innerhalb 1 Periode
sondern ich sample z.B. In jeder Periode einen weiteren der lila Messungpunkte,
so dass ich nach 6 Perioden alle 6 Messungen habe und den Wert berechnen kann.
Ich weiss, ich darf da kein delay oder delayMicroseconds verwenden,
was ich ja bisher mache. Sondern ich muss die vergangene Zeit abfragen.

Jetzt habe ich 2 Fragen:

  1. Wie groß ist die Auflösung von currentMillis. Sind das nur volle Millisekunden,
    oder kann ich auch Bruchteile einer Millisekunde abfragen?
    gibt es beim Arduino vielleicht ein currentMicroseconds ?

  2. Wieviel Zeit habe ich im loop2 zwischen den einzelnen PWM-Pulsen.
    um den loop1 laufen zu lassen.

Sorry, wie ihr seht, habe ich nicht sehr viel Ahnung von der Programmierung,
aber man lernt immer was dazu.

Danke Henry

Du kannst nur einen loop() haben.
Es gibt micros() - bei 16 MHz-Prozessoren mit 4 µs Auflösung.

Gruß Tommy

Doku lesen!

Dann wird auch dieses besser.

Der Sketch kann aber schnell hintereinander 2 verschiedene Sachen machen so daß diese aussehen als wenn sie gleichzeitig gemacht werden.

Grüße Uwe

Schreib loop so, dass sie gar keine Zeit braucht.
Dann kannst du unendlich viel gleichzeitig machen.
:slight_smile:

millis() liefert nur ganz Zahlen. Sagt die Doku.
Lange Zeit (1024microsekunden) liefert sie dieselbe Zahl, aber manchmal überspringt sie sogar eine.
(Das sagt die Doku nicht)

Wow, zunächst mal vielen Dank an Alle für die Antworten.
Ich werde mal in mich gehen

Danke, Henry

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.