Reaktionszeit Arduino Uno oder Mega unter 10µs ? Allgemeine Tipps gefragt..

Moin zusammen,

hiermit wollte ich mein erstes Projekt starten.

Ich will ein Überwachungssystem mit Arduino realisieren.
Das System soll zwei analoge Signale, welches ich dann sehr wahrscheinlich über ADC auswerten werde/müsste, überwachen und sobald der Wert über oder unter einem vorher eingestellten Wert ist,
entweder TTL Signale ausgeben (0V -> 5V) oder andersrum den Pegel von 5V auf 0V legen.
Ganz wichtig dabei ist, dass alles unter 10µs passieren soll.

Wie sollte ich rangehen? Würde Arduino dies alles innerhalb 10µs schaffen?

Ich bin für alle Hinweise, Meinungen und Ideen dankbar!

Schöne Grüße,

s.

Das Signal auf HIGH oder LOW legen sollte der ATMEGA328 in 10µS schaffen - das sind immerhin 160 Taktzyklen. Mit digitalWrite() o.ä. wirst Du damit allerdings Probleme bekommen und wirst die Register direkt beschreiben müssen.
Allerdings ist der ADC deutlich langsamer - soll der auch in 10µS reagieren? Das wäre nicht möglich, da die conversion time zwischen 13 und 260µS beträgt.

Danke für die schnelle Antwort.

Warum sollte ich mit digitalwrite() Probleme bekommen und wie schreibe ich die Register direkt?

Mein Wunsch ist, die Zeit insgesamt kleiner als 10µs ist, wenn der falscher Wert erkannt und somit das Signal auf HIGH/LOW gelegt wird.

Woher weisst man, dass die convertion time 13µs - 260µs dauert?

Danke!

DigitalWrite() ist eine Arduino-Funktion und braucht etwa 123 Taktzyklen alleine zum Ausführen. Im Vergleich: ein Setzen des Bits eines Register mit "bitSet(DDRB,5);" braucht nur etwa 2/4 Taktzyklen, je nachdem wie man das programmiert.
Was das direkte Beschreiben von Registern bedeutet, findet man in zahlreichen Einführungen zum AVR.
Details zu dem ATMEGA328 wie die conversion time und vieles mehr findet man im Datenblatt.

vielen Dank!

könntest du mir noch eine gute Einführung zum AVR empfehlen/vorschlagen, dass ich mir sie sofort besorge.

Ich denke mal das es so nicht funktionieren wird auf der Aduino Basis. Der ADC bracht schon zu lange
Ich zitiere aus der Refrence

analogRead()
Description

Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, 0.0049 volts (4.9 mV) per unit. The input range and resolution can be changed using analogReference().

I**t takes about 100 microseconds (0.0001 s) to read an analog input**, so the maximum reading rate is about 10,000 times a second.

Da heisst das unterschreiten des Wertes siehst du nur alle 100µs also ist alles was die Geschwindigkeit des digitalWrites recht egal, da es dann ja sowieso schon Zeitverzug gibt.
Gruß
Der Dani

Bei einer solchen Reaktionszeit kannst Du keine Analogwert mit Arduino lesen und dann den Ausgang schalten.
Da ist ein einfacher OperationsVerstärker als Komparator mit einem Potentiometer als Referenzwert besser geeignet. Wenn Du's besser haben willst dann nimm eine OpAmp-Schaltung mit Hysterese

Wenn Du per Sw regelbar haben wills dann nimm einen DAC (zb MCP4921) und stelle mit diesem die Referenzspannung des Komparators ein. Den Ausgang entweder direkt auf einen LED oder auf den Interrupteingng des Arduino.

Grüße Uwe

volvodani:
Ich denke mal das es so nicht funktionieren wird auf der Aduino Basis. Der ADC bracht schon zu lange
Ich zitiere aus der Refrence

analogRead()
Description

Reads the value from the specified analog pin. The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, 0.0049 volts (4.9 mV) per unit. The input range and resolution can be changed using analogReference().

I**t takes about 100 microseconds (0.0001 s) to read an analog input**, so the maximum reading rate is about 10,000 times a second.

Da heisst das unterschreiten des Wertes siehst du nur alle 100µs also ist alles was die Geschwindigkeit des digitalWrites recht egal, da es dann ja sowieso schon Zeitverzug gibt.
Gruß
Der Dani

Es lässt sich aber noch etwas beschleunigen: http://www.mafu-foto.de/blog/viewpost/85

@MaFu,

danke für den Hinweis!

Könnte man den Schwellwert dann per SW anstatt ein Poti einstellen?

@uwefed
Was mach denn der Interrupt Eingang des Arduino? Ich habe bisschen darüber gelesen, aber leider bin
nicht schlau geworden. Was ich will, ist ja, dass Arduino TTL-Signale (0V->5V, oder 5V->0V) ausgibt, aber trotzdem im Betrieb bleibt.

sloomy:
@MaFu,

danke für den Hinweis!

Könnte man den Schwellwert dann per SW anstatt ein Poti einstellen?

Mit dem Patch funktioniert analogRead() wie bisher auch, nur schneller. Also ja.
Da trotzdem nur max. 58.000 Auslesungen pro Sekunde möglich sind, schaffst Du das Soll von 10µs aber auch nicht.

@mafu was bewirkt deine Änderung den genau. Schnelleres auslesen klar, geht das auf kosten von irgendwas anderem (genauigkeit zu Beispiel) und warum ist das dann nicht orginal in der IDE?
Danke für die Infos.
Gruß
Der Dani

Hatte diese Anpassung mal im Netz gefunden, allerdings mit wenig Angaben dazu. Nach meinen Informationen wird damit der Divisor für die Auslesefrequenz geändert. Als Nebenwirkung kann sein, dass der gemessene Wert etwas stärker rauscht.
Mann kann da noch stärker drehen und noch etwas mehr Tempo rausholen. Aber dann geht meines Wissens die Auflösung auf 8 Bit runter.
Wenn ichs zeitlich schaffe, mach ich demnächst ein paar Tests in dieser Richtung.

Was ist das für ein System bei dem Du unter 10us reagieren musst?

In 160 Takten kann man reagieren wenn man ein wenig zusätzliche analoge Beschaltung an den Arduino dranklatscht. Aber das ist schon ziemlich sportlich. Bevor man sowas anfängt sollte man auch mögliche Alternativen kennen.

Nur so: der ADC kann auch Interrupts auslösen. Die Sache mit der Auflösung ist aber nicht unkritisch. Andererseits brauchst Du das vermutlich überhaupt nicht wenn Du eh nur auf einen Schwellwert losgehst. Die Frage ist nur: was genau willst Du erreichen? Kannst Du da mehr Details liefern?

sloomy:
Ich will ein Überwachungssystem ... realisieren.
Das System soll zwei analoge Signale ...auswerten, überwachen und sobald der Wert über oder unter einem vorher eingestellten Wert ist,
entweder TTL Signale ausgeben (0V -> 5V) oder andersrum den Pegel von 5V auf 0V legen.
Ganz wichtig dabei ist, dass alles unter 10µs passieren soll.

Wie sollte ich rangehen? Würde Arduino dies alles innerhalb 10µs schaffen?

Ich bin für alle Hinweise, Meinungen und Ideen dankbar!

Wie Uwe schon vorgeschlagen hat. Mit opamp / Schmitt-Trigger hast du keine Zeitprobleme. Der Arduino kann per DAC digital vorgegebene Vergleichswerte erzeugen, und die Alarmsignale weiterverarbeiten.

Aber: was für Signale sollen das sein, wie misst du sie so schnell, und was soll das Alarmsignal so schnell machen ? Du meinst nicht aus Versehen Millisekunden ? :wink:
Eine LED Reaktion von 20 ms ist "sofort" und eine laute Hupe kann man z.B. genausogut 200 ms später starten. Eine SMS oder Mail hat locker 20 sec Zeit ( ausser bei der Funktionsvorführung, da kämen 5 sec gut an. )
Selbst wenn es drauf ankommt, schnell ein Ventil zu schliessen, sollten Millisekunden keine Rolle spielen, oder du bist auf einer ganz falschen Baustelle, jedenfalls für dein "erstes Projekt".

edit: Richtig zitieren ist wichtig in Dissertationen, sinnvoll ist es auch hier

Danke für eure Rückmeldungen und Fragen.. :slight_smile:

Also, es sollen auf keinen Fall Alarmsignale oder SMSen verschickt werden, das alles ist irrelevant da das System in der Regel nicht alleine steht sondern unter menschl. Überwachung arbeitet. Nur kenne ich kaum jemanden, welcher im Notfall unter 10µs (ist leider nicht 10ms gemeint ) das System zum stoppen bringen könnte.

Es sollten halt schnell genug TTL Signale zu den einzelnen Komponenten ausgegeben können, welche selber einen sog. Fehlereingang haben ( Interrupt Eingang vielleicht, werden beide Begriffe für den selben Zweck genutzt? ).

Als Eingang kommen analoge Werte (Schwellenwerte) und andere TTL Signale von den Komponenten, welche ausgegeben werden, wenn die Geräte intern einen Fehler haben und nicht und meinen, nicht gut zu funktionieren. Sobald der Sollwert nicht stimmt oder so ein "Fehler"-TTL-Signal ankommt, muss Arduino ( im Idealfall) unter 10µs reagieren, damit alle Komponenten über Ihren TTL-Fehler-Eingägne Bescheid wissen (Arduino gibt z.b. ein digitales HGH aus) und selber ausschalten können.

Wichtig ist es erstmal nicht, wie lange dann die Komponenten einzeln ( es sei ein Ventil, oder ein Relais usw.) brauchen.
Die Frage ist, wie realisiere ich es ein System ( mit Arduino), welches als Eingangsignal auf Analoge Signale ( per Schwellwert/Sollwert -was ich aber digital einstellen will, nicht per Poti) und TTL Signale sehr schnell (am besten unter 10µs) reagiert, welces aber per SW konfiguerbar ist, und als Antwort drauf wieder Analoge (PWM? ) und Digitale (HIGH, LOW) Signale ausgeben kann.

Ich dachte, sowas wäre perfekt mit Arduino zu realisieren?

sloomy:
@MaFu,

danke für den Hinweis!

Könnte man den Schwellwert dann per SW anstatt ein Poti einstellen?

@uwefed
Was mach denn der Interrupt Eingang des Arduino? Ich habe bisschen darüber gelesen, aber leider bin
nicht schlau geworden. Was ich will, ist ja, dass Arduino TTL-Signale (0V->5V, oder 5V->0V) ausgibt, aber trotzdem im Betrieb bleibt.

Bei einem Interrupt wird die Interruptfunktion aufgerufen.

Wenn nur ein TTL Signal notwendig ist dann reicht der bereits vorgeschlagene Komparator mit einem Operationsverstärker.

Grüße Uwe

sloomy:
Die Frage ist, wie realisiere ich es ein System ( mit Arduino), welches als Eingangsignal auf Analoge Signale ( per Schwellwert/Sollwert -was ich aber digital einstellen will, nicht per Poti) und TTL Signale sehr schnell (am besten unter 10µs) reagiert, welces aber per SW konfiguerbar ist, und als Antwort drauf wieder Analoge (PWM? ) und Digitale (HIGH, LOW) Signale ausgeben kann.

Ich dachte, sowas wäre perfekt mit Arduino zu realisieren?

Arduino ist geeignet aber nicht in der Zeit die Dir vorschwebt also schlußendlich ungeeignet.
Grüße Uwe

Moin,

ein Mikrocontroller besteht vereinfacht gesagt aus vielen Registern, deren einzelne Werte (= Bits) man auf 1 oder 0 setzen kann.
Um einen Pin am Arduino UNO (=ATMEGA328) auf Ausgang zu setzen, heißt die Funktion in der Arduino IDE (im setup() deklarieren):

pinMode(pinNr, OUTPUT);

wenn man direkt das Register und in diesem Fall das Register für z.B. den PORT B, Pin 5 (beim Arduino also digital Pin 13) auf Ausgang setzen will, dann heißt der Befehl:

bitSet(DDRB,5);

eine andere Schreibweise wäre

DDRB |= (1<<5);

oder

DDRB |= _BV(5);

DDRB = The Port B Data Direction Register

Damit setzt man das Bit 5 von DDRB auf 1 und damit den Ausgang Port B 5 auf 1. Beim Arduino entspricht das dem Pin 13 (digital).

ATEMGA328 zu Arduino Pin-Map:

Will man nun den Pin 13 auf HIGH (oder logisch 1) schalten, dann heißt es in der Arduino IDE

digitalWrite (13, HIGH);

analog, wenn man das Register direkt beschreiben will

bitSet(PORTB,5);

oder

PORTB |= (1<<5);

oder

PORTB |= _BV(5);

PORTB – The Port B Data Register

Damit setzt man das Bit 5 in PORTB auf 1 und damit den Ausgang auf HIGH (bei einem 5V-Arduino UNO also z.B. auf 5V). Der ATMEGA328 braucht in diesem konkreten Fall

für den digitalWrite()-Befehl 66 Taktzyklen, also 66 * 62,5ns = 4.125 ns oder 4µs.
für das direkte Beschreiben der Register (bitSet()) 2 Taktzyklen (Stichwort: SBI) oder 2 * 62,5ns oder 125ns

(62,5ns wenn der ATMEGA328 mit 16 MHz = 16.000.000 Schwingungen/ Sekunde getaktet ist. 1 Sekunde/ 16.000.000 = 0.0000000625 = 62,5 ns pro Taktzyklus).

Ein direktes Beschreiben der Register beschleunigt die Verabeitung dieses einzelnen Befehls also um den Faktor 33.

Vorteil des direkten Beschreiben der Register ist demnach zum einen das i.d.R. schnellere Verarbeiten der Befehle und auch der (teilweise weitaus) geringere Platzbedarf im Flash-Speicher des Arduino.

Also bei den Reaktionszeiten ist wie gesagt ein Komparator die bessere Wahl. Der Arduino kann ja NACH der Abschaltung dann noch weitere Alarmierungen vornehmen die nicht so zeitkritisch sind.

Problematischer sehe ich es wenn ein Sicherheitssystem von jemand konstruiert wird der nicht einmal die Grundlagen dafür beherscht, aber das mußt Du selber wissen.

Den Satz finde ich sehr schade..Schließendlich will ich somit ja einsteigen und die Grundlagen lernen! Dafür ist die Forum doch hier da, und nicht dafür, dass man fertig gemacht wird, oder gleich wie bei meiner anderen Frage, dass ich eine kostenpflichtige Lösung bevorziehen soll!

Aber herzlichen Dank für den Hinweis mit dem Komperatoren, uwefed! Den habe ich mir auch zum Herzen genommen, und das werde ich auch berücksichtigen und in der Richtung weiterlesen, mich weiter erkundigen, recherchieren.

Keiner kommt auf diese Welt mit den Kenntnissen aus dem Mutterleib, die bringen wir uns selber bei. Und wenn euch da nach einem Leitfaden frage, hoffe ich und freue ich mich sehr auf so eine geniale, viel erklärende und AUFklärende Antwort von markbee..

Vielen Dank, markbee, noch einmal für die detaillierte Erklärung.