Forum: Mikrocontroller und Digitale Elektronik Servosignal ohne 16 Bit Timer messen => clevere Methode?


von Skinner (Gast)


Lesenswert?

Hallo zusammen,

kennt jemand eine clevere Methode ein Servosignal eines Modellbauservos 
auszumessen ohne 16Bit Timer und InputCapture? Zumindest eine cleverere 
als von mir unten beschriebene...

Hintergrund ist, ich würde für ein einfaches Vorhaben gerne einen 
AtTiny13 benutzten, weil es den im 8 Pin DIP Gehäuse gibt und er das 
klassische ISP Interface hat. Dafür hat er keinen 16Bit Timer mit ICP.

Ich habe natürlich schon selbst etwas versucht.

1.)
Einmal einfach den Timer "schnelle" Interrupts zu erzeugen und den 
Signalpin einfach abfragen => geringe Auflösung + "ein gewisses Jittern"

2.)
Einen externen Interrupt getriggert durch das Servosignal. Bei 
Signalbegin Timer und Variable "TIMER" nullen und bei Signalende TIMER = 
TCNT2,
Im Overflow eine Variable A inkrementieren.
Gesamtzeit ergibt sich dann zu TIME = A * 256 + TIMER
=> Zueinander asynchrone Ereignisse dadurch Jitter

Grützi

von Peter II (Gast)


Lesenswert?

Die Frage ist was die Tiny noch machen soll.

Man könnte auch einfach in einer schleife hochzählen, so lange der 
eingang 1 ist.

von chris (Gast)


Lesenswert?

waaaaassss da los 0.o naklar hat der nen 16bittigen Timer mit 
ICP-Eingang sie Datenblatt auf Seite2 PD6=ICP

von kürtler (Gast)


Lesenswert?

Skinner schrieb:
> kennt jemand eine clevere Methode ein Servosignal eines Modellbauservos
> auszumessen ohne 16Bit Timer und InputCapture? Zumindest eine cleverere
> als von mir unten beschriebene...

Wird nicht so das Problem sein. Eher die Messung mit dem zu kombinieren, 
daß der Tiny sonst noch machen soll.

Was soll denn noch außer der Messung laufen?

von chris (Gast)


Lesenswert?

wasssssss da los 0.o ich revidiere habe 2313 gelesen als atiny13

tschuldige

von chris (Gast)


Lesenswert?

ext Int konfigurieren auf steigende Flanke

(steigende Flanke)
Int löst aus -> Flanke auf fallend setzen -> Timer starten

(Fallende Flanke)
Int löst aus -> Flanke auf steigend setzen -> Timer stoppen

und den Rest ausserhalb der ISR vorkonfigurieren wie löschen der 
Variablen usw usf

von Cleverererer (Gast)


Lesenswert?

Skinner schrieb:
> clevere Methode?
PIC12F1840, hat einen 16bit Timer mit Input Capture, auch im DIP-8 und 
in circuit programmierbar.

von c-hater (Gast)


Lesenswert?

Skinner schrieb:

> Dafür hat er keinen 16Bit Timer mit ICP.

Der hat auch vieles andere für die Aufgabe nützliche nicht, insbesondere 
keine Taktbasis mit hinreichender Genauigkeit für die Meßaufgabe...

Also einfach dem Tiny13 adé sagen und eine Nummer größer nehmen, also 
Tiny25. Ebenfalls in DIL8 erhältlich, aber kann einen Quarz als 
Taktbasis betreiben. Er hat zwar ebenfalls nur einen 8Bit-Timer, aber 
dafür zusätzlich ein USI, was man wahlweise als "Hilfstimer" oder als 
"CaptureDevice" verwenden kann.

Übrigens: Wie willst du eigentlich deine Meßergebnisse aus dem Tiny 
wieder rausbekommen? Weil: ansonsten sind sie nutzlos, selbst wenn sie 
noch so gut sind...

von Qwerty (Gast)


Lesenswert?

Normal wäre eine Zeitmessung mit z.B. INT0, weil die Art des Interrupts 
bzw. der Flanke eingestellt werden kann. Aber mit einem 8-bit timer und 
PCINT funktioniert das genauso gut. Ob für die Zeitmessung ein 16-bit 
timer oder ein 8-bit-timer zur Verfügung steht ist unerheblich. Bei 
längeren Zeitmessungen benötigt man auch beim 16-bit timer einen 
overflow. Zu beachten mit PCINT ist, dass wirklich nur die Zeit zwischen 
steigender und fallender Flanke gemessen wird.

von Peter D. (peda)


Lesenswert?

Skinner schrieb:
> Im Overflow eine Variable A inkrementieren.
> Gesamtzeit ergibt sich dann zu TIME = A * 256 + TIMER
> => Zueinander asynchrone Ereignisse dadurch Jitter

Ohne Jitter:
Beitrag "AVR Timer mit 32 Bit"

von Chefkoch (Gast)


Lesenswert?

Hallo und danke für die Antworten.

Ich denke der Tip mit dem Tiny25 wird´s bringen. Der hat ja sogar 2 (!) 
8Bit Timer, auf beiden OC'n' Ausgänge und wie gesagt wurde, lässt sich 
mit dem USI ein 12Bit Timer bauen.

Firma dankt!!

von Cyblord -. (cyblord)


Lesenswert?

Skinner schrieb:
> Hintergrund ist, ich würde für ein einfaches Vorhaben gerne einen
> AtTiny13 benutzten, weil es den im 8 Pin DIP Gehäuse gibt und er das
> klassische ISP Interface hat. Dafür hat er keinen 16Bit Timer mit ICP.

Auf den Tiny85 trifft das auch alles zu und der ist nicht Asbach Uralt, 
hat mehr Timer, ist besser, schneller, schöner, höher, weiter usw.

von Peter D. (peda)


Lesenswert?

Chefkoch schrieb:
> lässt sich
> mit dem USI ein 12Bit Timer bauen.

Da Du die 12Bit aber nicht atomar lesen kannst, ist es das gleiche 
Problem, wie bei Erweiterung mit dem Overflow-Interrupt.
Du mußt daher auch eine ähnliche Lösung verwenden.

: Bearbeitet durch User
von Chefkoch (Gast)


Lesenswert?

Stimmt, ich kann die 12 Bit micht atomar lesen - ABER (wer hätts 
gedacht^^)

Der Timer 0 würde dann ohnehin mit nem Prescaler von 8 laufen, wodruch 
sicher der absolute Jitter reduziert.
Vorallem aber brauche ich nur noch den Interrupt on PinChange und nicht 
mehr zusätzlich den Overflowinetrrupt. Wenn die sich überlagern entsteht 
ja der Jitter, da es sich um zueinander asynchrone Ereignisse handelt.
Da ich bei den EINEM Interrupt eine ziemlich konstante Einstiegszeit 
haben werde, habe ich einen Offset in der Messung und keinen dynamischen 
Jitter.

Steigende Flanke => Timer0 nullen / USI => warten => warten => noch mehr 
warten => Fallende Flanke => Timer0 lesen/USI lesen => Ergebnis = 
USI*256+Timer0

von Karl H. (kbuchegg)


Lesenswert?

Chefkoch schrieb:

> Vorallem aber brauche ich nur noch den Interrupt on PinChange und nicht
> mehr zusätzlich den Overflowinetrrupt. Wenn die sich überlagern entsteht
> ja der Jitter, da es sich um zueinander asynchrone Ereignisse handelt.

Was mir nicht eingeht:
Ja, natürlich hast du da einen Jitter. Aber in Relation zu der Länge 
eines Servopulses ist der so minimal, dass ich mir nicht vorstellen 
kann, das sich der bemerkbar macht. So genau können doch Servos als 
mechanisches System gar nicht positionieren.

von Micha H. (mlh) Benutzerseite


Lesenswert?

Karl Heinz schrieb:
> Jitter. Aber in Relation zu der Länge
> eines Servopulses ist der so minimal

Genau das. Ebenso sind die 16bit Auflösung total überzogen.
Vor vielen Jahren entwickelte ich mal einen Servosteller mit 9bit, also 
8bit Timer + 1bit in Software. Das war vollkommen ausreichend und fand 
für viele Jahre etliche zufriedene Käufer. Ganz grob überschlagen machen 
9bit ca. 0,2° Auflösung am Servo, da kommt die Mechanik nicht mit.


Nachtrag: Wow. Ich sehe gerade das Teil wird noch immer verkauft, das 
ist ja schon nicht mehr wahr...

: Bearbeitet durch User
von kürtler (Gast)


Lesenswert?

Micha H. schrieb:
> Genau das. Ebenso sind die 16bit Auflösung total überzogen.
> Vor vielen Jahren entwickelte ich mal einen Servosteller mit 9bit, also
> 8bit Timer + 1bit in Software. Das war vollkommen ausreichend und fand
> für viele Jahre etliche zufriedene Käufer. Ganz grob überschlagen machen
> 9bit ca. 0,2° Auflösung am Servo, da kommt die Mechanik nicht mit.

Ich finde, daß da noch irgendwie eine Zeiteinhit zum Bit gehört. So, wie 
das da steht, eröffnet es mehr Fragen als Antworten. :(

von Micha H. (mlh) Benutzerseite


Lesenswert?

kürtler schrieb:
> Ich finde, daß da noch irgendwie eine Zeiteinhit zum Bit gehört.

Da hast Du recht. Ich maß nur den High-Puls, also das was sich zwischen 
1 und 2ms abspielt, oder wenn man großzügig ist 0,8-2,5ms.
Die Low-Zeit ist ja eh unkritisch, bzw. ist durch das Eingangssignal 
vorgegeben.
Also nochmal großzügig gerundet 3ms / 500 = 6µs pro Bit.

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.