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.
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
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 ?
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.
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) ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.