Forum: Mikrocontroller und Digitale Elektronik [STM32F0] Problem mit ungenauem Timer (RX Signal)


von Speedy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich habe ein Problem mit einem STM32F051. Ich möchte ein RX Signal 
einlesen und will dazu den Timer 3 im Modus "PWM Input" laut Datenblatt 
nutzen.
Also zwei Capture Kanäle über die Slave Funktion gekoppelt und auf einen 
einzigen Input Capture Eingang gelegt.

Im Prinzip funktioniert es, aber die Werte weichen relativ stark von der 
Realität ab. Speise ich ein 1ms Signal ein (Signal ist per Oszi 
verifiziert) dann bekomme ich irgendwas im Breich 910 als Hi-Time (CCR1) 
angezeigt, und 18200 als Periode (CCR2). Obwohl diese ebenfalls bei 
ziemlich exakt 20ms liegt.

Ich nutze zwar den HSI, aber auch testweise mit externem Quarz ändert 
sich nichts. Systemtakt 8MHz. Timer-Prescaler ist auf 8, also sollte 1 
Timertick = 1µS entsprechen.

Diese Ungenauigkeit kann ich mir nicht erklären. Selbst mit einem AVR 
und internem Takt habe ich ein RX Signal extrem genau vermessen können.

Testweise habe ich sogar einen STM32F030 versucht->gleiches Ergebnis.
Ich denke ich habe noch irgendeine Einstellung vergessen oder es gibt 
noch eine Timer-Eigenschaft die ich nicht kenne.

Der Quellcode hängt an.

von Dr. Sommer (Gast)


Lesenswert?

Was ist ein RX-Signal? Etwas das eigentlich von einer seriellen 
Schnittstelle kommt?

Speedy schrieb:
> Obwohl diese ebenfalls bei
> ziemlich exakt 20ms liegt.
Wie gemessen? Es ist ja relativ nah dran.

Speedy schrieb:
> Selbst mit einem AVR
> und internem Takt habe ich ein RX Signal extrem genau vermessen können.
Genau das selbe Signal?

Speedy schrieb:
> Der Quellcode hängt an.
Ist nicht vollständig, daher wertlos.

von Speedy (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Was ist ein RX-Signal? Etwas das eigentlich von einer seriellen
> Schnittstelle kommt?
Ein Servo-Signal (PPM, 1-2ms DutyCycle, 20ms Periode).
>
> Speedy schrieb:
>> Obwohl diese ebenfalls bei
>> ziemlich exakt 20ms liegt.
> Wie gemessen? Es ist ja relativ nah dran.
Oszi. Und nein 10% sind nicht nahe dran. Der gesamte Ausfahrbereich 
liegt zwischen 1000µS und 2000µS. Da sind 100µS Fehler alles andere als 
nahe dran.

>
> Speedy schrieb:
>> Selbst mit einem AVR
>> und internem Takt habe ich ein RX Signal extrem genau vermessen können.
> Genau das selbe Signal?
Nein aber dutzende Servosignale von dutzenden Empfängern und 
Servotestern.

>
> Speedy schrieb:
>> Der Quellcode hängt an.
> Ist nicht vollständig, daher wertlos.
Er ist vollständig. Was feht ist der startup code und das linkerscript.
Die RCC Konfiguration machen ich allerdings für diesen Test in der 
main.c und das ist somit auch sichtbar.

von Dr. Sommer (Gast)


Lesenswert?

Speedy schrieb:
> Er ist vollständig.

Komisch. Bei mir sagt der Compiler, dass "init" nicht definiert ist. Und 
ich sehe auch nirgendwo eine Ausgabe der Werte des Timers. Guckst du mit 
Röntgenblick in die Capture Register und liest sie somit 100% sicher 
korrekt aus?

Speedy schrieb:
> Oszi.
Sicher dass die Pegel stimmen, und man auf die 1ms nicht nur kommt wenn 
man alles größer als 0.5V aus "high" zählt, oder so?

> timBase.TIM_Prescaler=8;
Fällt mir gerade auf - das teilt den Takt durch 9, nicht 8.

von Speedy (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Speedy schrieb:
>> Er ist vollständig.
>
> Komisch. Bei mir sagt der Compiler, dass "init" nicht definiert ist.
-> Das ist sicher im Startup code. Aber der ist 1:1 aus der StdPeriphLib 
übernommen. Natürlich ist trotzdem nicht auszuschließen das darin was 
schief läuft.

> Und
> ich sehe auch nirgendwo eine Ausgabe der Werte des Timers. Guckst du mit
> Röntgenblick in die Capture Register und liest sie somit 100% sicher
> korrekt aus?
Per Debugger. Ich pausiere und schaue mir die Register CCR1 und CCR2 an.

>> timBase.TIM_Prescaler=8;
> Fällt mir gerade auf - das teilt den Takt durch 9, nicht 8.
Oha, na wenn das mal keine Volltreffer ist.
Wieso teilt das durch 9? Ich habe heute Stundenlang die Clocks und 
Prescaler von dem Ding studiert.
Danke für den Hinweis.

von Speedy (Gast)


Lesenswert?

Speedy schrieb:
>
> Wieso teilt das durch 9? Ich habe heute Stundenlang die Clocks und
> Prescaler von dem Ding studiert.

Tja wenn man kurz drüber nachdenkt wirds klar. Sicher weil 0 = 1:1 
bedeutet. Ich habe einfach keine Erfahrung mit derart "freien" 
Prescalern. Ich bin nur die von den AVRs gewöhnt und da hat man halt ne 
Handvoll und schlägt die Einstellung im Datenblatt nach.

von Dr. Sommer (Gast)


Lesenswert?

Speedy schrieb:
> -> Das ist sicher im Startup code.
Der Startup Code definiert keine globalen Hilfsvariablen, die onehin 
lokal sein sollten. Die Definition hast du lediglich beim Copy&Paste 
verloren. Kaputtkopieren von Code kann die Fehlersuche im Forum 
erheblich erschweren...

Speedy schrieb:
> Wieso teilt das durch 9?
Das ist ein 16bit-Prescaler, und die Hardware addiert automatisch 1, 
denn:
Eine 16bit-Zahl geht von 0 bis 65535. Durch 0 kann man nicht teilen, und 
indem man immer 1 aufaddiert, kann man auch durch 65536 teilen.

> Ich habe heute Stundenlang die Clocks und
> Prescaler von dem Ding studiert.
Tja, hättest du mal die Register-Definition vom Prescaler-Register, und 
den Code der Library angeschaut, die den Prescaler-Wert 1:1 ins Register 
schreibt (aber nur beim Timer, beim CAN z.B. ist das wimre nicht so)...
(letzteren Schritt spart man sich, wenn man auf die Library verzichtet)

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.