- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: PWM und Radencoder mit einem µC

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.232
    Anzeige

    Praxistest und DIY Projekte
    Das was ich jetzt schreib gilt für einen Controller der ATMEL ATMEGA Reihe, sollte aber prinzipiell auch für andere Controller anwendbar sein.

    Ich würd es auch mit dem INT 0 bzw. 1 machen.

    Wenn einer deiner Counter frei läuft, also immer von 0...max Wert, dann kannst Du ihn in der INT 0 Routine auslesen und den vorherigen Wert aus der letzten INT 0 abziehen.
    Der Wert der Subtraktion ist das Maß für deine Radgeschwindigkeit und kann in einem RAM Speicherplatz abgelegt werden.
    So kannst Du für alle INT + ( ICP ? ) Quellen den gleichen Timer verwenden.
    Bei einem 8 Bit Timer solltest Du in der Timer Overflow Routine noch zusätzliche Speicherplätze mit hochzählen um mehr als 8 ( 16 ) Bit Auflösung und längere Messzeiten zu erhalten.
    Für die PWM hätte ich persönlich den OC1A und OC1B verwendet, die beide nur den Timer 1 belegen, wenn dein PWM Mode das zulässt (ohne CTC).

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270
    ja gut, das polling ist jetzt neben dem Interrupt und der Timer-methode noch eine dritte.
    Auch zu dieser mal noch eine Frage:
    angenommen es kommen theoretisch bei der gesetzten Geschwindigkeit 3000 Impulse pro Sekunde (alle 0,3ms).

    So, jetzt muss ich den unterschied feststellen können wenn das Rad1 2993 Impulse gemacht hat und das Rad2 z.B. 3002 Impulse.
    Das heist das umgerechnet:
    Rad1: Impulse alle 0,3341129ms
    Rad2: Impulse alle 0,3331112ms
    so, wenn ich also die Eingänge alle 0,3ms abfrage (polle) dann gibt es eine überschneidung und ich komme nicht auf die Reellen Werte.
    Um genau messen zu können müsste ich also in diesem Fall mindestens alle 0,001ms den Eingang abfragen. das entspricht einer Frequenz von 1MHz...

    Oder andersrum ausgedrückt (weil ich manchmal nicht so gut sagen kann was ich meine):
    Wenn ich die beiden Eingänge alle 0,3ms polle dann wird im oberen Beispiel nach 100 Messungen (30ms) das Ergebniss lauten das beide Motoren gleich schnell drehen. Weil ich beim Abfragen ja nie weiß ob ich jetzt am Ende eines Impuls oder am Anfang bin...

    Oder habe ich hier einen Denkfehler?

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    37
    Beiträge
    270
    Zitat Zitat von wkrug
    Das was ich jetzt schreib gilt für einen Controller der ATMEL ATMEGA Reihe, sollte aber prinzipiell auch für andere Controller anwendbar sein.
    genau die benutze ich auch

    Zitat Zitat von wkrug
    Für die PWM hätte ich persönlich den OC1A und OC1B verwendet, die beide nur den Timer 1 belegen, wenn dein PWM Mode das zulässt (ohne CTC).
    Ja genau das mach ich doch. Hab ich doch im ersten Post geschrieben, das mein PWM mir einen Timer weg nimmt. genau da liegt ja mein Problem, das ich desshalb nur noch einen Timer für die Radencoder übrig habe was natürlich nicht reicht.

    @all:
    generelles weiteres Problem ist, das der Mega8 auch nur 2 Interrupts hat und ich einen schon für so ne Art Not-Stop verwende.
    Also hätte ich für die beiden Encoder noch einen Timer Eingang und einen Interrupt Eingang.
    Was haltet ihr davon einen Encoder über den Counter auszuwerten und dan anderen über den Interrupt (Variable +1). Müsste doch eigentlich genauso genau sein oder?

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    mit der doppelten Frequenz wie deine maximale Frequenz abtasten
    du musst alle 0,15ms abtasten, dann kannst du jeden impuls zuverlässig erkennen.
    mfg jeffrey

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Zitat Zitat von jeffrey
    mit der doppelten Frequenz wie deine maximale Frequenz abtasten
    du musst alle 0,15ms abtasten, dann kannst du jeden impuls zuverlässig erkennen.
    mfg jeffrey
    Selbst wenn Nyquist das sagt, kannst Du mit 0,15ms Abtastrate nicht zwischen 0,32 und 0,34ms unterscheiden.

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    hi,
    Selbst wenn Nyquist das sagt, kannst Du mit 0,15ms Abtastrate nicht zwischen 0,32 und 0,34ms unterscheiden.
    das ist ja auch egal. du zählst einfach die anzahl an impulsen, die in den 300ms auftreten.
    mfg jeffrey

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Das Problem ist aber, dass der Unterschied von 0,32 zu 0,34 ausgeglichen werden muss. Es geht darum, dass das linke Rad 0,32 und das rechte 0,34 gemessen hat. Das Problem ist, dass er auf einmal schief fährt und deshalb muss da nachgeregelt werden.

  8. #18
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.232
    Ja genau das mach ich doch. Hab ich doch im ersten Post geschrieben, das mein PWM mir einen Timer weg nimmt. genau da liegt ja mein Problem, das ich desshalb nur noch einen Timer für die Radencoder übrig habe was natürlich nicht reicht.
    Warum den nicht ?
    Du kannst doch den einen Timer als Zähler für beide Radsensoren verwenden.
    Für dein Not Aus wäre doch auch der Analog Komperator (Interrupt) geeignet, dann hättest Du wieder beide Interrupts frei für deine Radsensoren.

    Wenn die Frequenz und der Modus des Timer 1 passt, kannst Du sogar den als Zähler für deine Radsensoren verwenden.

    Die Impulse der Radsensoren dienen als Torzeitquelle für einen Timer.
    Je mehr Impulse von den Radsensoren kommen um so kleiner wird der Unterschied zwischen vorheriger Messung und aktueller Messung.

    Beispiel:
    INT 0 (alt) Zählerstand 1111.
    INT 1 (alt) Zählerstand 2222.
    INT 1 (neu) Zählerstand 2322 -> 2322 - 2222 =100 = Geschwindigkeitsmaß 0
    INT 0 (neu) Zählerstand 2611 -> 2611 - 1111 = 1300 = Geschwindigkeitsmaß 1

    Ganz klar ist natürlich, das der verwendete Timer in diesem Modus frei laufen muß. Also das TCNT Register nicht angerührt wir und auch der CTC oder fast PWM Mode nicht !! aktiviert ist.

    Die Zählerstände "neu" werden nach der Berechnung, für den nächsten Zyklus, in den Zählerstand "alt" übernomen.
    Die berechneten Werte werden in einem Speicherplatz zur Übernahme durch das Hauptprogramm abgelegt. Ein Flag wird gesetzt, das es neue Drehzahlinformationen gibt. Dieses Flag wird dann nach der Abarbeitung im Hauptprogramm wieder gelöscht.

    Dabei gibt es noch zwei Kröten, die eine ist, das Du dich um einen Overflow kümmern musst, wenn der Zähler den Maximalstand überschreitet = Der Roboter steht.
    Die zweite Kröte ist das was ich persönlich als "Overtake Effekt" bezeichne.
    Die INT x Routine wird kurz vor dem erreichen des Timer Overflow gestartet.
    Vor der Abfrage der Zählerstände kommt es zu einem 0 Durchlauf des Timers. Weil schon eine Interrupt Routine läuft kann die Overflow Routine des Timers nicht ausgeführt werden und eventuell vorhandene Überlaufzähler werden nicht Upgedatet.
    ( Deshalb ist es günstig hier den ICP zu verwenden ).
    Eine mögliche Lösung wäre auch im INT x Interrupt weitere Interrupts mit "SEI" freizugeben, oder das Interrupt Flag des entsprechenden Timers zu überwachen, oder die Takte bis zum Auslesen des Timers vom Zählerstand des TCNT abzuziehen. Das Abziehen geht aber nur, wenn der Timer dann mit Taktteiler 1 läuft, was aber bei einem 8Bit Timer alle 256 Prozessortakte eine Interrupt zur Folge hätte ( ungünstig ! ). Bei anderen Verhältnissen weisst Du ja nicht in welchem Teilerzyklus der Timer gerade ist.

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    hi,
    Das Problem ist aber, dass der Unterschied von 0,32 zu 0,34 ausgeglichen werden muss. Es geht darum, dass das linke Rad 0,32 und das rechte 0,34 gemessen hat. Das Problem ist, dass er auf einmal schief fährt und deshalb muss da nachgeregelt werden.
    das ist kein problem, das wird ausgeglichen. 0,32ms führt zu 938 impulse und 0,34 zu 882 Impulsen in 300ms, Es können also noch viel kleinere unterschiede erkannt werden.
    MfG Jeffrey

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Achso meinst Du das. Aber warum reichen dann keine 0,3ms?

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress