Analog Werte (mit Interrupt?) auslesen

Hallo,
ich habe ein Positionssensor, welcher mir ein 0-5 V Sinussignal ausgibt. Aktuell
lese ich das Signal mit AnalogRead() aus, was aber schon ab einer Frequenz von
10 Hz nicht mehr genau genug ist, da abhängig von der Position ein digitaler Ausgang
geschaltet werden soll.
Konkret soll das ganze bis Frequenzen von 100 Hz funktionieren.

Wie bekomme ich eine schnellere Auswertung des AnalogEingangs hin? Habe
etwas über Interrupts gelesen, aber noch keine Idee zu Anwendung auf mein Problem.

Funktioniert es mich Interrupts, wenn ja wie? Andere Vorschläge?

Danke für eure Antworten!

Wenn die Position einem bestimmten Wert entspricht, dann kann dafür der analog-Komparator verwendet werden, der ohne Verzögerung ausgelesen werden kann und IMO auch per Interrupt auf Überschreitung reagieren kann.

Wo kommt das Signal überhaupt her? Nockenwelle, Zündung?

(deleted)

Deine Werte erscheinen mir sehr seltsam. Eine A/D-Wandlung dauert etwas, aber es sind normal nur ca. 125µS. Das sind fast 10kHz! Da sollte man keine Interrupts brauchen

Diese Methode ist schneller als das "original".
Arbeitet auf Wunsch auch mit Interrupts.
Fast 10000 10Bit Messungen im Hintergrund, pro Sekunde, auf einem UNO sind drin und das Hauptprogramm läuft dabei (fast ungestört) weiter.

Man sollte eher erst mal klären wieso das so langsam ist.

Und dann sich etwas schlau machen wie der ADC funktioniert. Interrupts machen die A/D-Wandlung selbst nicht schneller. Das geht über den Vorteiler/Prescaler. Interrupts erlauben es einem aber zwischen dem Start einer Messung und dem Auslesen des Ergebnisses andere Dinge zu tun statt auf der Ende zu warten. Wenn während der Zeit aber nur ein Digital-Pin geschaltet werden muss bringt das nichts.

Wie gesagt ist der Komparator hier vielleicht eine bessere Wahl

(deleted)

Oder ständige Ausgaben auf der seriellen Schnittstelle mit niedriger Baudrate. Das bremst auch das Programm

Hallo,

100 Messungen /s ist ja nun noch keine Herausvorderung. Natürlich hängt es davon ab was sonst noch im loop ständig bearbeitet wird. Da must Du jetzt mal systematisch auf die Suche gehen. Erst mal nach delay suchen, alle ersetzten. Schleifen suchen , müssen die sein ? wie lange laufen die ? Berechnungen float vermeiden. Hast Du ein Display drin, oft dauert die Ausgabe darauf ziemlich lang, Ausgaben auf die Serielle Schnittstelle nur zum testen.

Wenn Du mit dem Positionswert eine Fahrbewegung steuerst muss die Steuerung des Fahrbefehls ja auch schnell genug erfolgen. Es nutzt ja nicht viel wenn Du zwar alle 10ms messen kanst abr nur alle 100ms auf den Messwert reagierst. Im Ernstfall bist Du dann ja bereits übers Ziel hinaus gefahren. Natürlich hängt es auch von der Fahrgeschwindigleit ab was wirklich erforderlich ist.

Du schreibst von einem Positionsgeber der ein Sinus Signal ausgibt. Ich kenn das aus der Antriebstechnik von Encodern mit sin/cos Ausgang. Die haben aber in der Regel,so wie normale Encoder viele Impulse hat, viele Sin/cos Kurven je Umdrehung. Üblich sind da 256 /512 oder auch 1024. Die Auswertung erfolgt dann aber mittels Schmittrigger wieder als 0/1 Signal. Ich wüsste jetzt keinen Industrie Hersteller der da die Messng analog macht und die Kurven auswertet um an die Winkel zu kommen.

Heinz

(deleted)

Bei einem Sinus reicht einmaliges Messen nicht, weil jeder Wert pro Umdrehung zweimal vorkommt, dazu braucht man noch das Cosinus Signal. Und wenn dann noch mehrere Schwingungen pro Umdrehung auftreten, muß man die sowieso separat und digital mitzählen.

Dann kann man die Schwinungen direkt auf einen Zähler geben, die eingebaute Hysterese an den digitalen Eingängen reicht dafür aus. Damit läßt sich dann auch eine aktuell Drehzahl oder Geschwindigkeit berechnen. Erst wenn die Vorrichtung fast zum Stillstand kommt, kann man aus dem Sinus eine Verfeinerung der digital ermittelten Position berechnen.

Danke für die vielen Antworten.

Bei dem Positionssignal handelt es sich um ein Sinusförmiges Signal von -10V bis +10V, welches
eine Position von -20Grad bis +20Grad wiedergibt. Mit einem Spannungsteiler und einer
Additionsschaltung habe ich die -20 bis +20 auf ein Sinusförmiges Signal von 0-5V angepasst.
Ich bekomme auch bei einer Freq. von 10Hz eine genaue Position (Analogwert 0-1023), ab
schnelleren Freq. sind aber meist 20 Zähler zwischen den Werten (bspw. 820, 841, 858, etc.)

delays, etc. sind nicht im Code, Baudrate steht auf 2 000 000
eine for-Schleife die bis 96 läuft, könnte das das Problem sein?

(deleted)

Hallo,

na dann würde ich mir jetzt mal in den Loop was einbauen um die Umlaufzeit zu messen. Aber ohne das Du uns zeigst was Du hast ist das alles raten .

Heinz