Arduino Mega: Wie genau sind Zyklen möglich?

Hallo,

bin ganz frisch im Forum, aber schon ein begeisterter Arduino Bastler.

Es ergab sich recht schnell, dass ich meinen Kollegen vorgeschlagen habe, dass wir in unserer Hardwaretestumgebung ein Gerät auf Arduinobasis als Ersatz für unsere bisherigen Zyklusgeneratoren einsetzen könnten.

Der Zyklusgenerator muss ein zyklisches Signal bereitstellen, also zB alle 2 Sekunden ein Signal für 2ms einschalten.

Da der Mega ja 54 digitale I/O hat, so dachte ich mir das, können wir ohne Probleme bis zu 40 unabhängige Testsignale mit verschiedenen Zykluszeiten anbieten, wobei die I/O Ports erst Optokoppler bedienen und die Optokoppler dann ein stärkeres Signal an das Erfassungsgerät liefern.

Hier schon einmal die erste Frage:
Funktioniert das soweit schon einmal wie ich mir das denke?

Nun weiter zum nächsten Punkt, die Signale müssen mit einer Genauigkeit von 1ms geschaltet und auch mitgezählt werden können.
Wie genau kann das der Arduino Mega ohne Zusatzgeräte?
Da habe ich irgendwie noch gar keine Vorstellung von.

Falls der Mega das nicht alleine schafft, hilft mir ein AD9835 Signal Generator?
(Sorry für den Werbelink, habe das Teil nur in Shops gefunden.)

Nun hoffe ich einfach mal auf ein paar Informationen, ob das so umsetzbar ist, wie ich mir das denke.

Danke schon einmal im Vorraus!

Gruß

Ich denke schon, dass die Genauigkeit ausreichen wird. Kannst du noch kurz beschreiben, wie du die Daten für den Zyklus auf den Mikrocontroller bringen willst? Werden das festgelegte Zeiten oder sollen sie in irgendeiner Form durch ein User Interface (Display, Taster o.ä.) manuell gesetzt werden?
Ob es gelingen wird 40 Ausgänge zu schalten, hängt im Wesentlichen von der Qualität der Programmierung ab. Wir geben dazu gern Hilfestellung. Grundlegend solltest du dir das Beispiel BlinkWithoutDelay ansehen, das bietet eine gute Basis für einen einzelnen Ausgang. Bei weiteren Ausgängen kann man den Sketch dann um Arrays erweitern, das Array enthält die Daten der einzelnen zu schaltenden Pins.

Zur schnelleren Ansteuerung der Ausgänge kann direkt auf die Ausgangsports zugegriffen werden und 8 Ausgänge auf einmal geändert werden:

http://www.arduino.cc/playground/Learning/PortManipulation

Genaueres der Ports des Mega in Datenblatt des ATmega2560

Die Genauigkeit hängt von der Programmierung ab. Der Takt ist 100ppm (mit Quarz) bzw 0,1% wenn der Arduino einen Resonator hat

Grüße Uwe

@sth77
wenn ich es richtig verstanden habe soll der Mega keine Zyklusdaten verarbeiten, sondern der Mega soll die
Daten in entsprechender Genauigkeit bereitstellen, also z.B. alle 2sec ein Signal für 1ms bereitstellen.

Meine Idee war es, ein Ethernet Shield drauf zu setzen und in einem kleinen Webserver dann einstellen zu können, wie häufig ein Signal kommen soll.

Ich möchte dann beispielsweise ein Signal alle 2 Sekunden, ein anderes alle 8 Sekunden und ein drittes Signal alle 15 Sekunden haben.

Damit werden verschiedene Maschinen simuliert, die immer wenn sie ein Teil produzieren ein Signal ausgeben.

Mit dem Blink without delay habe ich schon einmal rumgespielt, das macht in etwa das was wir wollen, wir brauchen es eben nur x-fach multipliziert mit verschiedenen delays, so dass man jedes Signal einzeln konfigurieren und ein- oder aus-schalten kann.

An die I/O Ports kommen Optokoppler, die es mir dann erlauben dem Gerät dass die Impulse zählt mehr Spannung zu geben, als der Arduino das kann (und den Arduino gegen die größere Spannung zu sichern).

Ich fürchte dass ich mit der grösse des Programms an die Grenzen stoße, da hilft aber auch die direkte Port Manipulation wenn ich das richtig sehe.

Es müssen nicht direkt zu Anfang 40 Signale sein, ich fange an mit 8 und nehme dann nach und nach weitere 8er Gruppen dazu. Wenn ich 24 Signale sauber und stabil zusammen bekomme, bin ich schon einmal glücklich.

Ich bin mir nicht sicher, wie viele I/O Ports ich mit dem Ehternetshield (ich wollte den mit dem SD-Card Slot nehmen) verliere, auch deswegen wäre das erste Ziel 8 saubere Signale hinzubekommen, danach 16 und so weiter.

Wichtig ist halt auf 1ms genau schalten zu können.

Auf jeden Fall schon einmal vielen Dank für die Hilfe! :smiley:

Das Ethernet Shiled mit SD braucht 5 Ausgänge
Grüße Uwe

Also mit der Genauigkeit wird das kein Problem mit den Signalen auch nicht mit 40 Signalen die du ausgeben musst. Wenn du Probleme mit der Menge der Ausgänge mit den Arduino Mega hast kann ich dir diesen hier empfehlen Arduino/Genuino - Watterott electronic (hat 70I/Os). Es ist zwar noch der alte Chip drauf aber du kommst mit deinem Progrämmchen nicht an die 126kB. und mit einer kleinen Änderung der IDE kommst du auch ohne Probleme an die zusätzlichen pins

Ich habe ja keine Ahnung aber ich sehe da ein anderes Problem.
Du willst 1ms genauigkeit haben, gut das bekommst du vielleicht hin aber:
Sollen die immer alle Zyklisch zueinander laufen?
Oder abhängig voneinander sein?

Anders gesagt:
Bedenke bei deiner Programmierung das du vielleicht einen Ausgang zwar zyklisch in einem kurzen Rythmus takten willst der aber vielleicht nicht schon als erster kommen soll.
Was ich meine das dein erster "Delay" vielleicht länger sein soll als die folgenden.
Und zur laufzeit die Taktzeiten verändern macht keinen Sinn weil du es nicht hin bekommst auf 1ms genau diesen Takt zu starten.

ich versuche ein Bespiel:

1: .....!.....!.....!.....!.....!.....!.....!.....!.....!.....!
2: .......!.....!.....!.....!.....!.....!.....!.....!.....!.....!
3: .......!..!..!..!..!..!..!..!..!..!..!..!..!..!..!..!..!..!..!

zu 1: alle 5 Sekunden einen Takt
zu 2. auch alle 5 Sekunden einen Takt allerdings erst 2 Sekunden nach 1
zu 3. alle 3 Sekunden einen Takt synkron zu 2

Wenn du jetzt zur Laufzeit einen Wert veränderst wird er sich ja dann ändern wenn du es abschickst.
Und abschicken auf 1ms genau kannste vergessen.
Deshalb verstehe ich die verändern während des Betriebs nicht.

Ich hoffe Du verstehst was ich meine

Also, die Zähler haben keine Abhängigkeit untereinander.

Zähler 1 muss nur möglichst immer den gleichen Abstand zwischen seinen Signalen haben, Zähler 2 ist ganz unabhängig von Zähler 1, aber muss auch immer den gleichen Abstand innerhalb seiner Signale haben.

Das nun irgendwann Zähler 1 und 2 zufällig im gleichen Moment an gehen sollen, ist vermutlich unvermeidlich, da ist dann die Frage, wie viel Verzögerung dadurch entsteht.

Dass jetzt bei 8 Zählern zufällig alle gleichzeitig schalten müssen wird vermutlich nicht vor kommen.

Die Pausen zwischen den Signalen des gleichen Zählers ändert sich nicht, es soll nur möglich sein, einen Zähler zu starten, auch wenn ein anderer noch läuft.

Jeder Tester bekommt meinetwegen 6 Zähler die er unabhängig von den Zählern der anderen Tester steuern muss, aber es ist nicht nötig, dass ich einen Zähler im Lauf umkonfiguriere.

Dann frisch ans Werk und mal ein bisschen programmiert. :wink: Die Chancen stehen gut, dass was aus dem Projekt wird...
Einen Mega hab ich zwar nicht, um das Projekt komplett nachvollziehen zu können, aber mit einem Uno und dem Netzwerkshield könnte ich ggf. auch mal ein paar Messungen zur Laufzeitermittlung beisteuern.

Also ich würde dafür die mstimer2 library nehmen. Im Prinzip so wie hier Persistence of Vision | Blinkenlight, nur daß die Daten nicht aus dem Speicher kommen sondern immer neu berechnet werden. Solange Du nur 1ms auflösen mußt hast Du jeweils ~16000 Systemtakte Zeit für die jeweiligen Berechnungen, das sollte normalerweise locker reichen.