Pages: [1] 2   Go Down
Author Topic: Reaktionszeit Arduino Uno oder Mega unter 10µs ? Allgemeine Tipps gefragt..  (Read 2060 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 6
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 6
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vielen Dank!

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

Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1127
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich denke mal das es so nicht funktionieren wird auf der Aduino Basis. Der ADC bracht schon zu lange
Ich zitiere aus der Refrence
Quote
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().

It 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
« Last Edit: January 28, 2013, 03:23:14 pm by uwefed » Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 257
Posts: 21466
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich denke mal das es so nicht funktionieren wird auf der Aduino Basis. Der ADC bracht schon zu lange
Ich zitiere aus der Refrence
Quote
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().

It 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
Logged

_______
Manfred

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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.
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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.
« Last Edit: January 29, 2013, 07:28:26 am by MaFu » Logged

_______
Manfred

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1127
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

_______
Manfred

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3480
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Check out my experiments http://blog.blinkenlight.net

Germany
Offline Offline
Faraday Member
**
Karma: 56
Posts: 3001
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ? smiley-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
« Last Edit: January 31, 2013, 03:43:34 am by michael_x » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für eure Rückmeldungen und Fragen.. smiley

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? 

Logged

Pages: [1] 2   Go Up
Jump to: