Forum: Mikrocontroller und Digitale Elektronik AVR schnell genug für Motorcontroller


von Stefan H. (stefan_h16)


Lesenswert?

Schönen Abend zusammen,

Ich möchte für mein Lego NXT System einen "intelligenten" Motortreiber 
bauen für die NXT Motoren bauen. Dieser soll nicht nur die 
Geschwindigkeit einstellen und die Encoder auslesen, sondern die Motoren 
auch noch gleich regeln.
Dazu habe ich folgende Anforderungen:
- (Software-)PWM für 6 Motoren
- Einlesen der eingebauten Quadrature-Rotationsencoder aller 6 Motoren 
über interrupts
    - Bei 720 Ticks pro umdrehung
    - max 160 rpm
    - 1920 ticks pro sekunde pro motor
    - 11520 ticks pro sekunde für 6 motoren
- Dazu noch eine Art Regelung (PID?) die es ermöglicht, entweder 
bestimmte Positionen genau anzufahren, oder eine bestimmte 
Geschwindigkeit genau zu halten
- Die Kommandos dafür vom Host dafür sollen über RS485 (bzw über UART) 
kommen.

Die grundsätzliche Hardware- und Softwareinfrastruktur habe ich auf 
einem Steckbrett getestet, jetzt für mich wichtig ob ich eine passende 
Platine ätzen und bestücken sollte.

Dazu folgende Fragen:
- Irgendwo ein Denkfehler ?
- Hat z.B. ein Atmega644 bei 20 MHZ genug Resourcen dafür, oder sollte 
ich die Anzahl der Motoren abspecken bzw einen anderen Mikrocontroller 
ansehen ? Mir geht es dabei vor allem darum ob ich zuviele Ticks der 
Encoder verliere wenn die Interrupts nicht schnell genug bearbeitet 
werden, da wahrscheinlich sowohl für das PWM als auch für die 
Motorregelung noch mal zusätzliche Timer interrupts dazu kommen.

Bitte alle konstruktiven Vorschläge zum Thema. Wäre echt schade wenn ich 
die Schaltung aufbaue und dann feststelle das ich nur die Hälfte der 
verbauten Motortreiber wirklich nutzen kann.

Edit: Tippfehler

von Christian B. (casandro)


Lesenswert?

Nimm lieber einfachere Mikrocontroller und dann aber einen pro Motor. 
Dann könnte es vielleicht funktionieren. Der 644 ist für Deine 
Anforderungen viel zu groß, Du brauchst höchstwahrscheinlich die 32 
Kilobit Speicher nicht.

Also lieber mehr kleine Regler, dann kannst Du wirklich detailiert 
regeln.

Wenn Du da nichts besonderes machen musst, so sollte ein Controller, 
auch ein AtMega 8, für 6 Motoren reichen.

von Frank K. (fchk)


Lesenswert?

Stefan H. schrieb:
> Schönen Abend zusammen,
>
> Ich möchte für mein Lego NXT System einen "intelligenten" Motortreiber
> bauen für die NXT Motoren bauen. Dieser soll nicht nur die
> Geschwindigkeit einstellen und die Encoder auslesen, sondern die Motoren
> auch noch gleich regeln.
> Dazu habe ich folgende Anforderungen:
> - (Software-)PWM für 6 Motoren
> - Einlesen der eingebauten Quadrature-Rotationsencoder aller 6 Motoren
> über interrupts
>     - Bei 720 Ticks pro umdrehung
>     - max 160 rpm
>     - 1920 ticks pro sekunde pro motor
>     - 11520 ticks pro sekunde für 6 motoren
> - Dazu noch eine Art Regelung (PID?) die es ermöglicht, entweder
> bestimmte Positionen genau anzufahren, oder eine bestimmte
> Geschwindigkeit genau zu halten
> - Die Kommandos dafür vom Host dafür sollen über RS485 (bzw über UART)
> kommen.

Was für Motoren willst Du verwenden? Normale DC-Motoren. Brushless DC? 
mit/ohne Hallsensor?

Ich empfehle wie mein Vorgänger auch, einen Controller pro Motor zu 
verwenden. Damit kannst Du nämlich die Leitungen zum Motor minimal kurz 
machen, was das EMV-Verhalten (zur Erinnerung: Du willst PWM machen) 
verbessert.

Als Controller empfielt sich dann eher etwa aus der AT90PWM* Familie 
oder ein kleiner dsPIC30/33*MC (MC steht für Motor Control). Für beide 
gibts auch fertige BLDC-AppNotes. Für normale DC-Motoren wäre auch ein 
Mega88 oder ein PIC18 denkbar.

Wenn Du mal über den AVR-Tellerrand hinausschauen willst, lege ich Dir 
die dsPICs ans Herz - insbesondere wenn es ums Rechnen geht 
(DSP-Erweiterungen!)

fchk

von Ulrich (Gast)


Lesenswert?

Ich würde auch lieber mehrere µCs empfehlen. Dann kann man Hardware-PWM 
nutzen und hat deutlich weniger zu tun. 2 Motoren mit einem µC könnte 
aber noch gut gehen.

von P. M. (o-o)


Lesenswert?

Schafft er lockerst. Verwende aber am besten keine Interrupts, sondern 
ein starres zeitliches Ablaufschema der Software. Bei genau definierten, 
zeitkritischen Anwendungen spart fährt man damit meist besser.

von Stefan H. (stefan_h16)


Lesenswert?

Frank K. schrieb:
> Was für Motoren willst Du verwenden? Normale DC-Motoren. Brushless DC?
> mit/ohne Hallsensor?

Sind ganz normale DC-Motoren, 9V, 2A max (wg. thermischer Sicherung) mit 
eingebauten optischem Encoder. Die Motoren des Lego NXT Systems halt.

Ansonsten hatte ich mir auch schon überlegt die Arbeit auf mehrere 
Attinys zu Verteilen die an einem Atmega als Master hängen (über 
i2c).Ist wohl die bessere Lösung.
Den Atmega 644 hatte ich Beispiel da der grad in der Bastelkiste rumlag.

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.