- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: PWM und Radencoder mit einem µC

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    36
    Beiträge
    270

    PWM und Radencoder mit einem µC

    Allo Leute,

    ich habe mal eine Frage: an meinem Roboter befinden sich 2 Motoren als Antrieb. Diese Werden beide übers Hardware-PWM vom µC angesteuert.
    Jetzt würde ich ganz gern jedem Rad noch einen Radencoder verpassen.
    HAbe da aber ein Problem: Zur Auswertung der Radencoder benutzt man ja am besten den internen Timer als Counter.
    Also bräuchte ich beide Timer zum auswerten der beiden Encoder. Aber ein Timer wird ja bereits zum erzeugen der PWM verwendet.

    Wie würdet ihr das ganze Problem lösen?
    Einen Controller (in DIP) mit mehr als 2 Timern habe ich noch nicht gefunden.

    Gruß Robodriver

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    35
    Beiträge
    826
    Moin

    Wie kommst du denn drauf, dass du zum auswerten beide Timer brauchst? Ich muss zwar gestehen, dass ich mich nicht sooo intensiv damit auseinander gesetzt habe, aber das zählen sollte doch reichen, wenn ein Timer zählt und du mit unterschiedlichen Variablen die Werte speicherst.

    Oder wie stellt du dir das vor? Generell hat der Atmega32 aber schon OC0, OC1A, OC1B und einen OC2 eingang ... (das weiß ich auswendig). Ich meine, dass der eine Timer etwas kastriert ist, aber das es schon 3 versch. sind.

    (kann auch gut sein, dass ich falsch liege )

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.01.2005
    Ort
    Tokyo
    Alter
    65
    Beiträge
    242
    Hi,
    einen Controller mit mehr als 2 Timern gibt es sehr wohl (ATMega32).
    Aber die brauchst Du hier nicht. Es hindert Dich niemand daran, mehrere Encoder mit Hilfe eines Timers nacheinander abzufragen.
    Allerdings darfst Du diesen Timer nicht als Counter verwenden, sondern nur als IRQ. In der entsprechenden ISR fragt Du Deine Encoderzustände ab und wertest diese dann in der main() (oder wo immer) aus.

    Gruß
    pctoaster

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    36
    Beiträge
    270
    Zitat Zitat von pctoaster
    Hi,
    einen Controller mit mehr als 2 Timern gibt es sehr wohl (ATMega32).
    Ah okay. In dessen Datenblatt hatte ich nachgesehen und nur auf die Pins geschaut und da gibt es nur T0 und T1. Aber unten im Text seh ich gerade das es noch einen T2 gibt. Also ist der dritte Timer einer der nur intern existiert und nicht nach außen geführt ist?
    In der Beschreibung steht "siehe PINOUT beschreibung" aber in dieser existiert kein T2 *verwirrt sei*

    Zitat Zitat von pctoaster
    Es hindert Dich niemand daran, mehrere Encoder mit Hilfe eines Timers nacheinander abzufragen.
    Wie soll das gehen? Nur nochmal zum Verständniss (kann sein das Encoder das falsche Wort ist): Ich erhalte lediglich einzelne Impulse von dem Ding. Genau genommen 256 pro Radumdrehung.

    Auswerten will ich wenn beide Räder drehen wie weit in einer bestimmten Zeit x jedes Rad gedreht hat um dann über die PWM die Räder nach zu korrigieren, damit beide immer die gleiche Geschwindigkeit haben egal ob eins auf Teppich und das andere auf Fliesen läuft...

    Zitat Zitat von pctoaster
    Allerdings darfst Du diesen Timer nicht als Counter verwenden, sondern nur als IRQ. In der entsprechenden ISR fragt Du Deine Encoderzustände ab und wertest diese dann in der main() (oder wo immer) aus.
    Oh, IRQ und ISR... davom habe ich ja noch nie was gehört. Was ist das?

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.01.2005
    Ort
    Tokyo
    Alter
    65
    Beiträge
    242
    Hi,
    Ein Timerinterrupt wird, wie der Name schon sagt, über einen Timer ausgelöst. Diesen stellt man auf eine Zeit, die der Abtastzeit des Encoders entspricht. Timer dienen meist zur Auslösung eines IRQs. Deshalb benötigt man dazu die äußeren Anschlüsse nicht. Du verwendest den Timer zur Zeit offensichtlich nur als Counter.
    Die ISR (interrupt service routine) wird dann regelmäßig mit diesem Zeitintervall aufgerufen. Hier kann man dann die Encoderausgänge abfragen (Du benötigst also 2 freie Eingänge pro Encoder).
    Wenn Du dann diese Eingangswerte Encoder(alt) gegen Encoder(neu) vergleichst, hast Du die Drehrichtung des Encoders erkannt. Alles weitere macht man dann in einem Hauptprogramm.
    Soviel zum Prinzip.
    Wenn Du nicht weisst, wie man IRQs programmiert, fehlen Dir elementare Grundlagen zur MC Programmierung.
    Dann guckst Du hier: http://www.mikrocontroller.net/articles/AVR-Tutorial
    wenn es C sein soll (meine Empfehlung): http://www.mikrocontroller.net/artic...R-GCC-Tutorial
    Und nicht zuletzt: Das Datenblatt des entsprechenden AVRs (das im übrigen während der Entwicklung immer auf den Tisch zu liegen hat )

    Gruß
    pctoaster

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    36
    Beiträge
    270
    Klar, ich weiß was Interrupts sind und benutze sie auch sehr häufig.
    Hab mir aber über Microcontroller alles selbst beigebracht und desshalb fehlen mir solche Fachbegrifft wie IRQ und ISR vollständig. Aber gut, jetzt hab ich sie gehört und kenne sie auch
    (Und weiß entlich wie das in der Fachsprache heist was ich schon seit Jahren anwende)

    So aber trotzdem bin ich insgesamt immer noch nicht schlauer:
    Die Drehrichtung der Motoren ist mir eigentlich schnurz egal, weil die gebe ich in der Software vor und der L298 ist da 100% zuverlässig das er so rum dreht wie man ihn ansteuert

    Also so weit wie ich da jetzt eine Idee hätte wäre folgendes:
    Die Encoderausgänge auf INT0 und INT1 schalten. dann im ISR eine Variable immer +1 Rechnen.
    Ein Weiteren Interrupt über einen Timer der z.B. nach 300ms die beiden Variablen miteinander vergleicht und das PWM nach regelt.
    Das Problem ist dann nur: Der Encoder bringt z.B. alle 0,3ms einen Impuls.
    Dann hängt mein Controller ziemlich häufig in der ISR.
    Wie soll er dann die anderen tätigkeiten durchführen ohne impulse vergessen zu zählen? (ich hab ja z.B. noch nen INT für I²C Daten Empfang)
    Wenn man den Timer als Counter nimmt ist das egal. Dann springt der Controller nur alle 300ms in ein ISR und wertet aus. aber alle 0,3ms in nen ISR springen, ich weiß nicht dann ist der mir irgendwie zu viel beschäftigt...


    Oder hab ich da jetzt immer noch was falsch verstanden?

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.01.2005
    Ort
    Tokyo
    Alter
    65
    Beiträge
    242
    Hi,
    aha, ganz so schlimm ist Dein Unwissen also doch nicht
    Wenn Du die INT dafür frei hast, kannst Du das auch so machen. Was ich meinte, war einen Timer IRQ laufen lassen (also die Eingänge praktisch zu pollen). Bei 0,3ms ist aber ein INT wirklich besser.
    Wenn der IRQ bei jedem Impuls eine Variable um 1 hochzählt, belastet das den Controller normalerweise mit 0,xxx %.
    Bleiben wir mal bei deinem Zahlenbeispiel= 300 us pro Impuls. Wenn Der Controller (mal was langsames) mit 1MHz läuft, brauchts dazu max 10us. Das wären (mal sehr ungünstig gesehen) 3% Prozessorlast.
    Da würde ich mir keine Gedanken machen. Ich habe hier eine 3-Achsensteuerung mit 3 richtigen Encodern, I2C und RS232 und der ATMega langweilt sich immer noch.
    Wenn Du Dich nicht so lange in einer ISR aufhältst, verlierst Du keinen IRQ. Das passiert nur, wenn Du in der ISR bist und der gleiche IRQ während dieser Zeit wieder ausgelöst wird.

    Gruß
    pctoaster

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    36
    Beiträge
    270
    nun gut, wenn man aber jetzt bedenkt das sagen wir alle 300us ein Interrupt ausgelöst wird, was ist denn wenn der andere Encoder innerhalb dieser 10us auch einen Impuls auslöst?
    Während der 10us im ISR sind ja alle weiteren INT deaktiviert. Kann es da nicht passieren das ich dann etwas verliere oder der Controller sich verzählt?
    Denn die beiden Encoder laufen ja nicht synchron sondern wahrscheinlich minimal unterschiedlich schnell. Das heist die Impulse der beiden Encoder können sich sehr schnell auch mal überlagern oder sogar gleichzeitig kommen.
    Das würde halt alles bei der Timer als Counter methode keine Probleme bereiten.

    @pctoaster: Hast du nähere Daten zu deiner 3-Achs Steuerung? Die Umsetzung würde mich interessieren.

  9. #9
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Hallo!

    @robodriver

    Ich programmiere zwar PICs, kann aber wahrscheinlich dir trotzdem helfen.

    Du verstehst alles richtig. Weil dein Programm nur in der Pausen zwischen IRQs läuft, muss deine ISR kurz sein. Sie muss aber nur ein Zähler (Variable) erhöhen, deswegen beeinflüsst sie keine Register mehr, die Du "retten" müsstest, und sie kann extrem kurz sein. Wenn du in ASM programmierst, lässt sich alles genau berechnen.

    MfG

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    41
    Beiträge
    760
    Hallo,
    falls du die Pollingvariante wählst, musst die halt mit der doppelten Frequenz wie deine maximale Frequenz abtasten (Nyquist lässt grüßen).
    Du kannst ja auch nen externen Zähler verwenden, den du dann nur alle 300ms oder wie oft du halt willst abfragst.
    MfG Jeffrey

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests