Hallo Community,
ich bin gerade am verzweifeln ich versuche mit dem Timer 3 und dem
entsprechenden Encoder Interface meinen Drehencoder auszuwerten.
Die Init. rufe ich wie folgt auf..
1
TIMEREncoderInit(TIM3,TIMER_ENC_MODE_3,100);
Die internen PullUps an PB4 / PB5 sind auch aktiviert und auch gemessen.
Mein Enc. sollte also auf fallende Flanken reagieren.
Die beiden ALT Modes für die entsprechenden Pins wurden auch gewählt.
(TIM3_CH1, TIM3_CH2).
Wenn ich jetzt in der while(1) das Zählregister von meinem Timer auf
gemessene Impulse abfrage kommt gefühlt nur Mist bei raus..
1
if(TIM3->CNT>10)
2
{
3
GPIOTogglePin(GPIOC,PIN_9);
4
TIM3->CNT=0;
5
}
Bei einem RASTPUNKT geht er direkt in die if Abfrage.
Habe ich etwas falsches initalisiert?!
Hier mal die Init.
Jan H. schrieb:> TIM3->CNT = 0;
Lass das doch mal weg (denn es ist generell eine schlechte Idee, an
Zählerwerten herumzufrickeln).
Wenn das erledigt ist, dann startest du das Programm und schreibst dir
den aktuellen Zählerwert auf. Danach drehst du den Encoder mal 1
Umdrehungen in die eine Richtung und schreibst dir den Zählerwert auf.
Und dann drehst du den Encoder mal wieder diese 1 Umdrehung zurück und
schaust, ob der Zähler wieder (in etwa) beim Ausgangswert ankommt.
Und dann drehst du den weiter um 1 Umdrehung zurück und kontrollierst,
ob der Zähler (in etwa) um gleich viele Schritte in die andere Richtung
gegangen bist, wie zuvor beim erstmaligen Drehen.
Lothar M. schrieb:> Und dann drehst du den weiter um 1 Umdrehung zurück und kontrollierst,> ob der Zähler (in etwa) um gleich viele Schritte in die andere Richtung> gegangen bist, wie zuvor beim erstmaligen Drehen.
Ich habe leider noch keine gute DEBUG Möglichkeit.
Jan H. schrieb:> Ich habe leider noch keine gute DEBUG Möglichkeit.
nimm am Besten ein kleines Display. z. B. so ein SSD1309 OLED...da
kannst dir alles anzeigen lassen
Hermann S. schrieb:> Jan H. schrieb:>>> Ich habe leider noch keine gute DEBUG Möglichkeit.>> nimm am Besten ein kleines Display. z. B. so ein SSD1309 OLED...da> kannst dir alles anzeigen lassen
Soweit bin ich noch nicht.
Ich möchte auch keine fertigen Libs bzw. Routinen nehmen sondern alles
mehr oder weniger selbst erarbeiten und daran lernen.
Nebenbei schreibe ich eine Lib für USART dann ist das ein bisschen
einfacher.
Ok, an was bastelst Du wenn ich fragen darf? -Oder ist das einfach nur
ein Lernprojekt?
Perfekt, dann kannst ja gleich ne neue lib für das OLED schreiben, vll.
mit einer beseren Schrift und mit Sonderzeichen wie "%" ;-P
Ich kann dir nur empfehlen, als allererstes eine Debug Möglichkeit zu
schaffen. Sonst tappst du im Dunkeln und verschwendest Unmengen von
Zeit.
Das Minimum wären Textausgaben auf den TraceSWO Ausgang.
http://stefanfrings.de/stm32/stm32f3.html#traceswo
Hier ein beispiel, wie du printf() für serielle Ausgaben verwenden
kannst. Das lässt sich ganz einfach mit UART oder TraceSWO kombinieren.
http://stefanfrings.de/stm32/stm32f3.html#newlib
Jan H. schrieb:> Ich habe leider noch keine gute DEBUG Möglichkeit.
Du hast "Halt", "Watch" und "Run". Das ist mehr als, die ganzen
Arduino-Bastler haben.
Zum Debuggen musst du hier erst mal gar nichts tun, sondern eben einfach
nur den Zähler initialisieren, dann die fast leere Mainloop laufen
lassen:
1
while(1){
2
counter=TIM3->CNT;
3
}
Wen du jetzt einen Watch auf den counter setzt, dann siehst du darin bei
jedem "Halt" den Zählerwert. Und mehr brauchst du zum Analysieren des
Zählers eigentlich nicht.
Jan H. schrieb:> ich versuche mit dem Timer 3 und dem> entsprechenden Encoder Interface meinen Drehencoder auszuwerten.
Du hast aber schon vorneweg mit dem Oszi kontrolliert, ob die Signale an
den µC-Pins halbwegs brauchbar aussehen?
Hermann S. schrieb:> Ok, an was bastelst Du wenn ich fragen darf? -Oder ist das einfach> nur> ein Lernprojekt?>> Perfekt, dann kannst ja gleich ne neue lib für das OLED schreiben, vll.> mit einer beseren Schrift und mit Sonderzeichen wie "%" ;-P
Ich möchte halt einfach viel lernen über Mikrocontroller und versuche
jederzeit alles mitzunehmen was geht. Ein LoRa Modul liegt neben mir.
Bis ich daran gehe muss erstmal die Basis stimmen.
Stefan ⛄ F. schrieb:> Ich kann dir nur empfehlen, als allererstes eine Debug Möglichkeit> zu> schaffen. Sonst tappst du im Dunkeln und verschwendest Unmengen von> Zeit.>> Das Minimum wären Textausgaben auf den TraceSWO Ausgang.> http://stefanfrings.de/stm32/stm32f3.html#traceswo>> Hier ein beispiel, wie du printf() für serielle Ausgaben verwenden> kannst. Das lässt sich ganz einfach mit UART oder TraceSWO kombinieren.> http://stefanfrings.de/stm32/stm32f3.html#newlib
Genau deswegen stelle ich meine Fragen hier. Man lernt immer wieder
neues und viel dazu. Danke!
Lothar M. schrieb:> Du hast aber schon vorneweg mit dem Oszi kontrolliert, ob die Signale an> den µC-Pins halbwegs brauchbar aussehen?
Ja die kommen an. Nur habe ich jetzt nicht festgestellt was Phase:A und
Phase:B ist.
Jan H. schrieb:> Kann es sein dieses Feature nicht auf einem "STM32F030xx" verfügbar> ist?!.
Ja, die Cortex M0 haben keinen TraceSWO Ausgang. Da musst du einen UART
Ausgang nehmen (oder Soft-UART).
Jan H. schrieb:> Nur habe ich jetzt nicht festgestellt was Phase:A und Phase:B ist.
Das ist im ersten Augenblick auch mal uninteressant.
Schlimmstenfalls läuft der Zähler halt nicht in die Richtung, die du
erwartest (vermutlich "rechts drehen = hochzählen"), sondern umgekehrt
(also "links drehen = hochzählen").
Jan H. schrieb:> Nur habe ich jetzt nicht festgestellt was Phase:A und> Phase:B ist.
Wie das Kind genannt wird, ist eigentlich egal. Wichtig ist nur, daß mit
dem Signal gezählt wird, was sich im oder beim Rastpunkt NICHT ändert.
W.S.