Forum: Mikrocontroller und Digitale Elektronik Auf Signal mit wechselnder Periode reagieren


von Felix R. (felixxx)


Lesenswert?

Hallo zusammen,
Ich bin Felix, neu hier und beiße mir gerade an einem kleinen Problem 
die Zähne aus:
Und zwar möchte ich einen Attiny104 benutzen (weil es da das tolle 
Entwicklungsboard für gibt) um folgendes zu tun:
-Die Periode eines Zahnrades (~50 Hz) mithilfe eines Hallsensors 
bestimmen. Dafür nehme ich den Timer0 im Normalmodus und einen Input 
Capture Interrupt. Das geht auch, soweit ich das beurteilen kann.
-Ein RC-Servosignal einlesen. Dafür habe ich vor, den Externen Interrupt 
zu nehmen und dann TCNT0 zu lesen. Nicht optimal, aber die Input Capture 
ist ja belegt. Gibt es bessere Alternativen?
-Innerhalb der Periode einen Ausgang zwei mal an- und wieder 
ausschalten, zu Zeitpunkten die vom Servosignal abhängen. Diese 
Zeitpunkte berechne ich im Hauptprogramm. Es ist nicht besonders 
kritisch, wenn die neu berechneten Zeitpunkte erst bei der nächsten 
Umdrehung verwendet werden. Dafür habe ich zwei Ansätze versucht, die 
ich aber beide nicht hinbekomme:

Den Output Compare Interrupt verwenden. Gibt es da einen Trick, um die 
vier Schaltzeiten in das Output Compare Register zu schreiben und das 
ein- und ausschalten zu unterscheiden?

Alternativ habe ich versucht, im Hauptprogramm den Timer zu lesen, die 
Schaltzeiten zu berechnen und dann eine Fallunterscheidung zu machen. 
Das scheint aber zu langsam zu sein?

Welchen dieser Ansätze haltet ihr für sinnvoller? Bin ich total auf dem 
Holzweg? Oder ist das für einen Attiny104 zu viel zu tun und ich brauche 
einen dickeren uC?

Liebe Grüße,
Felix

von c-hater (Gast)


Lesenswert?

Felix R. schrieb:

> zu nehmen und dann TCNT0 zu lesen. Nicht optimal, aber die Input Capture
> ist ja belegt. Gibt es bessere Alternativen?

Natürlich: Erste Maßnahme: Funktion tauschen, Das blöde Zahnrad läßt 
sich deutlich einfacher erfassen als der PWM-Wert. Also nutzt man 
natürlich die Hardware für den komplizierteren Teil.

> Den Output Compare Interrupt verwenden. Gibt es da einen Trick, um die
> vier Schaltzeiten

Welche "vier Schaltzeiten"? Was sollen die tun? Wie hängt das doofe 
Zahnrad mit der PWM zusammen?

> Welchen dieser Ansätze haltet ihr für sinnvoller? Bin ich total auf dem
> Holzweg?

Sieht definitiv so aus. Du verstehst nichtmal dein eigenes Problem...

von Felix R. (felixxx)


Lesenswert?

c-hater schrieb:
> Natürlich: Erste Maßnahme: Funktion tauschen, Das blöde Zahnrad läßt
> sich deutlich einfacher erfassen als der PWM-Wert. Also nutzt man
> natürlich die Hardware für den komplizierteren Teil.

Ja, das werde ich mal versuchen.

> Welche "vier Schaltzeiten"? Was sollen die tun? Wie hängt das doofe
> Zahnrad mit der PWM zusammen?

Ich möchte halt bei bestimmten Positionen des Zahnrades den Ausgang 
schalten. Dazu gehe ich davon aus, dass die Drehzahl sich von einer zur 
nächsten Umdrehung kaum ändert. Wenn der Magnet auf dem Zahnrad sich am 
Hallsensor vorbei dreht, berechne ich die neue Periodendauer. Nachdem 
z.B. die halben Periodendauer rum ist, weiß ich, dass der Magnet eine 
halbe Umdrehung vom Sensor entfernt ist. Dann möchte ich den Ausgang 
schalten. Idealerweise hätte ich einen Winkelsensor, aber das erscheint 
mir hardwaremäßig komplizierter als mein Ansatz.
Das ganze soll bei einem sehr kleinen Modellhubschrauber die 
Taumelscheibe ersetzen, indem die Paddelstange mit einem Magneten 
versehen wird und über eine Spule (die wird mit dem Ausgang gesteuert) 
bei bestimmten Rotorpositionen ausgelenkt wird. Die Spule und der Magnet 
müssen dann nicht mechanisch verbunden sein, was den Aufbau einfacher 
und damit kleiner macht. Falls da jemand etwas mit anfangen kann ;)
>> Welchen dieser Ansätze haltet ihr für sinnvoller? Bin ich total auf dem
>> Holzweg?
>
> Sieht definitiv so aus. Du verstehst nichtmal dein eigenes Problem...
Kann sein. Oder meine Beschreibung was suboptimal. Mea culpa...

von c-hater (Gast)


Lesenswert?

Felix R. schrieb:

> Ich möchte halt bei bestimmten Positionen des Zahnrades den Ausgang
> schalten.

Das ist eine vollkommen schwachsinnige Formulierung der Intention. Sehr 
wahrscheinlich: weil dir selber nicht klar ist, was du eigentlich 
erreichen willst...

> Dazu gehe ich davon aus, dass die Drehzahl sich von einer zur
> nächsten Umdrehung kaum ändert.

Kann sein, kann nicht sein. Wer will das wissen, ohne es zumindest 
gemessen zu haben...

> Das ganze soll bei einem sehr kleinen Modellhubschrauber die
> Taumelscheibe ersetzen

Nun fängt es an konkret zu werden. Darauf kann man aufbauen. Kannst du 
aufbauen...

Als erstes solltest du dir die Frage stellen, warum du eigentlich 
irgendwelche PWM-Werte vermessen mußt...

Das ist doch SCHWACHSINN. Die PWM-Werte gibt es nur deshalb, weil 
damit irgendwelche Motore angesteuert werden müssen. Interessent für 
dein Problem ist aber das (die) Signale, die letztlich zu diesen 
PWM-Signalen umgesetzt werden...

von Felix R. (felixxx)


Lesenswert?

c-hater schrieb:

> Das ist doch SCHWACHSINN. Die PWM-Werte gibt es nur deshalb, weil
> damit irgendwelche Motore angesteuert werden müssen. Interessent für
> dein Problem ist aber das (die) Signale, die letztlich zu diesen
> PWM-Signalen umgesetzt werden...

Die PWM-Werte kommen aus dem Empfänger. Ist doch viel einfacher, dieses 
komische Servosignal zu lesen als einen eigenen Empfänger zu bauen ;) Es 
gibt ein Summensignal, in dem alle 9 oder so Kanäle drin sind, aber das 
erscheint mir viel komplizierter, als nur die beiden benötigten Kanäle 
zu nehmen.


>Kann sein, kann nicht sein. Wer will das wissen, ohne es zumindest
>gemessen zu haben...
Zumindest bei anderen Helis kommt das ungefähr hin. Und ob die Näherung 
gut genug ist, sehe ich ja wenn es läuft. Wenn nicht, muss halt ein 
Korrekturfaktor aus dem Gassignal oder so etwas her. Auf jeden Fall habe 
ich keinen passenden einfachen Winkelsensor gefunden.

Aber um mal auf meine eigentliche Frage zurückzukommen:
In ca. 20 ms vier Timerwerte vergleichen, vier mal einen Pin schalten, 
einen Input Capture machen und etwas rechnen - klappt das auf der 
Hardware oder brauche ich was stärkeres?

von Peter D. (peda)


Lesenswert?

Ich kenne den Attiny104 nicht, aber bei den meisten AVRs kann man das 
Input Capture auf alle ADC-Eingänge routen. Beim ATtiny24 kann man so 
z.B. 8 Eingänge über ICP einlesen, beim ATmega48 in SMD sogar 10 
(ADC0..7, ICP1, AIN0).

von HildeK (Gast)


Lesenswert?

Kannst du mal erklären, warum du die Drehzahl der Taumelscheibe 
benötigst? Ist es nicht egal, an welcher Position die verstellt wird, 
wenn sie verstellt werden muss?

Felix R. schrieb:
> Aber um mal auf meine eigentliche Frage zurückzukommen:
> In ca. 20 ms vier Timerwerte vergleichen, vier mal einen Pin schalten,
> einen Input Capture machen und etwas rechnen - klappt das auf der
> Hardware oder brauche ich was stärkeres?

Auch ich kenne den Tiny104 nicht, aber auf jedem anderen kleinen Tiny 
würde ich sagen: ja, das ist kein Problem.

von c-hater (Gast)


Lesenswert?

Felix R. schrieb:

> Es
> gibt ein Summensignal, in dem alle 9 oder so Kanäle drin sind, aber das
> erscheint mir viel komplizierter, als nur die beiden benötigten Kanäle
> zu nehmen.

Ist es aber nicht. 1x PPM (und darum handelt es sich 
höchstwahrscheinlich) einzulesen ist viel einfacher als 2x PWM. Schlicht 
deshalb, weil man nur einmal die zur Erfassung gut geeignete Hardware 
(also die ICP-Funktionalität) benötigt und damit alle PWM-Kanäle aus dem 
Signal rausfischen kann. Die, die einen nicht interessieren, wirft man 
halt einfach weg. Ein paar Daten wegwerfen ist viel einfacher als eine 
zweiten ICP-fähigen Timer zu beschaffen...

Aber unabhängig davon habe ich immer noch nicht dein Endziel kapiert. 
Was soll die Sache eigentlich bewirken?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.