Forum: Mikrocontroller und Digitale Elektronik Brushlesscontroller Code verstehen


von Ben (Gast)


Lesenswert?

Guten Abend,

Ich bastel gerade an einem Arduino Brushless Controller für normale 
Brushless RC Motoren.
Das Funktionsprinzip ist klar, auch habe ich einen Aufbau nach dem Wiki 
Eintrag umgesetzt.

Nun habe ich einen Code gefunden dessen Funktionsweise mir nicht ganz 
klar ist.

Es geht um diesen : 
https://github.com/lxrobotics/BrushlessMotorshield/tree/master/software/arduino/LXR_Brushless_Motorshield

Normalerweise werden die High side fets ja jeweils über PWM angesteuert 
und die Low side fest geschaltet je nach Commutierungsstatus.

Nun, der oben gepostet Code verwendet aber nur OCR2A als einzigen PWM 
Ausgang, welcher an Arduino pin D11 anliegt.

Ehrlich gesagt verstehe ich das nicht.
Eigentlich werden doch 3 PWM Ausgänge benötigt (also mindestens 2 
Timer).
Wie ist es bei diesem Code umgesetzt ?
Wird der Ausgang irgendwie gemultiplext ?

Das dazugehöre Shield ist sehr simple, und D11 nichtmal angeschlossen.

Also meine Frage:
Wird OCR2A auf einen anderen Pin ausgegeben bzw. mehrere Pins je nach 
Commutierunsstatus ?
Und ist das ein legitimer Lösungsansatz oder eher untypisch ?
Immerhin scheint man ja einen Timer zu sparen.

von Andreas H. (ahz)


Lesenswert?

Ben schrieb:
> Also meine Frage:
> Wird OCR2A auf einen anderen Pin ausgegeben bzw. mehrere Pins je nach
> Commutierunsstatus ?

Hab da nur ganz kurz reingeschaut aber es sieht nach "usual business" 
aus.

Schau Dir mal die Funktion ISR(TIMER2_OVF_vect() in 
LXR_Brushless_Motorshield.cpp, Zeile 321 ff, an.

Timer 2 steuert die PWM nicht direkt auf die Pins sondern legt nur die 
Dauer eines "Drehsegments" fest. Der Timer 2 Overflow ruft dann die oben 
genannte Fkt als ISR auf. Und Diese ändert die Pinstates.

Ben schrieb:
> Und ist das ein legitimer Lösungsansatz oder eher untypisch ?
Das ist eigentlich die Standardmethode. Es geht aber (logisch^^) auch 
deutlich komplizierter, wenn man z.B. aktiv die BEMF aufwerten will.

Hth

/regards

von Ben (Gast)


Lesenswert?

Danke für deine Antwort.

ok verstehe, also wird der Timer Overflow Interrupt dazu verwendet um 
die Pins zu schalten und quasi das PWM signal zu erzeugen.

OCR2A ist dann also tatsächlich nur der Timerwert und wird nicht aktiv 
als PWM ausgegeben.

BEMF verwendet der Code ja, hat aber nix mit PWM zutun ?
Dafür wird ja der Comparator des Atmegas verwendet, wenn ich das richtig 
verstehe.

Das ist der erste Code den ich sehe, welcher keine Timer für die PWM 
verwendet.
Alle anderen Projekte (Simonk, Mikrokopter,....) verwenden immer 2 Timer 
dafür.

Hat das sonst irgend welche Vor oder Nachteile, außer das man 
theoretisch einen Timer spart ?

von Peter S. (Gast)


Lesenswert?

Ich habe mir den Code jetzt nicht im Detail angeschaut, aber das 
funktioniert ja immer ähnlich.

Ben schrieb:
> Normalerweise werden die High side fets ja jeweils über PWM angesteuert
> und die Low side fest geschaltet je nach Commutierungsstatus.

Low und Hide Side FETs werden per PWM gesteuert. Und zwar immer 
komplementär, d. h. wenn der Hide Side FET leitend ist, ist der Low Side 
FET dieses Brückenzweiges immer nicht leitend. Pro Brückenzweig braucht 
es also eigentlich nur ein PWM-Signal, da das Low Side Signal immer 
invertiert zum High Side Signal ist.
In welchem Brückenzweig welcher FET leitend ist, hängt dann vom 
Kommutierungsstatus ab.

Wie viele Timer man braucht hängt dann vom Controller ab. Bei manchen 
gibt es dedizierte Peripherie für Motor-PWM-Erzeugung. Da benötigt man 
gar keine (general purpose) timer. Solche Motor-PWM-Peripherie besteht 
aber auch nur aus etwas aufgebohrten Timern, speziell für diesen Zweck.

von Ben (Gast)


Lesenswert?

Wie die Mosfets Angesteuert werden, ist mir völlig klar.

Spezifisch bei diesem Code was es mir nur rätselhaft wie die PWM ohne 
der Verwendung von 2 Timer erzeugt wird.
Denn der Atmega328 hat meines Wissens nach keine andere Möglichkeit PWM 
zu erzeugen außer die Timer dafür zu verwenden.
Also benötigt man 2 Timer für 3 PWM Ausgänge.

Wie Andreas H. erklärte, wird wohl der Timer Interrupt dazu verwendet um 
den Pin State zu ändern und dadurch die PWM Signale zu erzeugen.

Ich hab das wie gesagt noch nie gesehen, speziell bei solcher Hardware 
(es gibt einige offene Projekte die Ähnliche Architekturen verwenden) 
werden eigentlich immer 2 Timer verwendet.

Wo liegt also der Vor bzw. Nachteil bei dieser Variante, außer das man 1 
Timer spart (speziell auf diese Architektur bezogen) ?

von Andreas H. (ahz)


Lesenswert?

Ben schrieb:
> Wo liegt also der Vor bzw. Nachteil bei dieser Variante, außer das man 1
> Timer spart (speziell auf diese Architektur bezogen) ?

Naja, einer der wichtigsten Punkte beim Ansteuern ist ja (bekanntlich) 
dass man über die FETs keine Kurzschlüsse einbaut. Und das wird bei 
mehreren Timern nicht einfacher.

Da man die Kommutierung aber nur an bestimmten Stellen macht (nämlich da 
wo es der Motor braucht) kann man das ganz gut mit einem einzelnen Timer 
erledigen.

Ich hab mir den Code ja nicht intensiver angeschautaber oft verwendet 
man auch "feinere Ticks" um zwischendurch den Strom über die drei 
Windungen zu messen und dann z.B. lastabhängig nachzuregeln, was bei 
unterschiedlichen (mechanischen) Belastungen sinnvoll ist.

Aber da kann man sich richtig ausspielen :D

/regards

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.