PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM für Fahrtenregler



srem
20.04.2005, 19:01
Ich bastle zur Zeit an einem Quattrokopter. (bitte nicht lachen. Ich meine das ernst. Die Hardware steht schon)

Mein Problem.
Ich brauche vier Fahrtenregler mit einer komplexen misch funktion. Also selber bauen. Zur Zeit versuch ich das mit einem PIC16F627.
Ich erreiche aber nur eine PWM frequenz von 120Hz und soweit ich weiß brauch ich 3000Hz und ich muss 4 Motoren gleichzeitig ansteuern.
Hat irgendjemand eine Idee? (Anderer Prozessor, Treiber, oder Chip mit vier PWM ausgängen.....)

Ringo
20.04.2005, 19:20
was für Fahrtregler hast du?

Ich hab mal gelesen, das die mit 50Hz arbeiten?
Kann auch sein das ich mich irre..

MfG
Ringo

harryup
20.04.2005, 19:34
hi,
bei 120hz brummt bzw. quitscht der motor noch deutlich. ich hab mit dem mega8 pwm frequenzen um 15khz gestrickt, allerdings nur für den chopperbetrieb von schrittmotoren. aber egal, theoretisch müssten 31KHz bei 8MHz takt und 8bit pwm drinne sein.
grüssens, harry

srem
20.04.2005, 20:02
danke für die antworten aber
für ringo: Ich habe leider noch keinen Fahrtenregler --> ich möchte einen bauen.
für harryup: Ich brauch gar keine 31kHz mir reichen schon die 3kHz.

Hab leider vergessen mein eigentlicher Problem zu erwähnen. Ich muss vier Motoren regeln. Also 4 PWM ausgänge oder so.

Ringo
20.04.2005, 21:36
ach so!
Ich dachte du wolltest einen Modellbauregler ansteuern..

Was für Leistungsdaten haben deine Motoren? Spannung/ Strom?

MfG
Ringo

srem
20.04.2005, 21:57
20A
7-10V
Aber mein Hauptproblem ist die Frequenz als Treiber verwende ich FETs

Minifriese
21.04.2005, 07:43
Moin moin!

Der ATmega8 hat ja leider nur zwei schnelle PWM-Ausgänge, der ATmega16 glaube ich drei. Notfalls müsste man also zwei ATmega8 nehmen oder gleich nen mega32 mit vier Ausgängen (der hat doch vier, oder? Hab gerade kein Datenblatt da...).
Wie sieht denn da eigentlich die Hardware aus? Einfach eine Transistorschaltung an den Port und einen dicken Glättungskondensator an den Motorstromkreis? Warum FETs? Haben die hier irgendwelche Vorteile gegenüber "normalen" Transistoren? 3kHz sind ja nicht gerade ne exorbitante Frequenzanforderung...
Wie schon jemand sagte, rein von der Frequenz und Genauigkeit der ATmega-PWM-Ausgänge wäre das kein Problem.

Was für Luftschrauben nimmst du denn für deinen Quattrocopter? Und welche Motoren sind es (Typ)?

Nils

BlackBox
21.04.2005, 08:39
Hallo srem,

entweder Du verwendest zwei Prozessoren mit 2 PWM-Ausgängen oder schau dir mal die PIC18Fxx31 Serie an. Die haben 4 PWM Module und ein paar nette weitere Features integriert. Als Compiler könntest Du die 60 Tage Testversion (nach 60 Tagen einfach neu inst.) des C18 Compilers verwenden

20A ist schon ein ganz schöner Brocken. Gut 3kHz sind noch human aber wenn die 20A Dauerstrom sind, dann brauchst Du sehr gute Fets und gute Treiber sonst sind die Schaltverluste enorm.

TomHumpen
21.04.2005, 09:28
Hi,

schau mal ins Datenblatt des 16F627 ( ich habe selber noch nicht mit PWM gearbeitet, aber schon viel mit PIC's gemacht) auf Seite 66.
Ich hoffe das klappt!

Also

Wenn du eine 8 Bit Auflösung haben möchtest errechnet sich die Frequenz deiner PWM (bei 8Mhz Takt) mit Fpwm = 8*10^6/(Timer2 Prescaler* 10^(8*log2)). Das wäre bei Dir dann eine Frequenz von 31250Hz oder für später mit dem Prescaler 4 (Vorzähler) 7812Khz. Das ist kein zwingender Wert, aber bis zu dieser Frequenz hast du eine 8 Bit auflösung. Rechnen wir weiter mit 3Khz Fpwm. Mit 1/Fpwm hast du die Periodendauer der PWM und das wären Tpwm=0.0003333s. Des weiteren steht auf Seite 66 die Formel zur Berechnung der Periodendauer, welche umgestellt dir den Wert für PR2 gibt (also wie weit du zählen musst). Umgestellt ergibt das PR2 = Tpwm*8Mhz/(4*Prescaler) - 1. Ergibt sich ein Wert für PR2 von 167.

-> Bei 8 Mhz muss Register PR2 167 erhalten, ein Prescaler von 4 muss gesetzt werden. Dann nur noch den Duty Cycle (Seite 67) einstellen und nicht den Prescaler von 4 bei dieser Brechnung vergessen. Dann läuft es hoffentlich. Schreib mal ob es geklappt hat.

So long...

Viel Erfolg

srem
21.04.2005, 09:36
Danke für den Tip. Ich werd mir mal die Dinger anschauen. Das mit den 20A geht in Ordnung. ist nur der Blockiestrom.
Ich versuche Trotzdem eine Lösung mit einem Prozessor zu finden.
Ich versteh nicht wie das andere machen. Mit meinem Programm komm ich auf nur 120Hz und der Motor läuft gar nicht. Aber andere haben da kein Problem
http://www.informatik.htw-dresden.de/~htw8195/Fahrtenregler/fahrt.htm
check ich nicht.

srem
21.04.2005, 10:14
TomHumpen
Ich werd das ding mal Testweise bauen. Hab zur Zeit nur 4Mhz systemtakt. Aber mal schauen. Trotzdem brauch ich das ding mal vier. Aber wenn das Funkioniert kann ich ja mal über 2 Prozessoren nachdenken. Obwohl mir das nicht gefällt. (--> Gewich, Größe)

TomHumpen
21.04.2005, 10:16
Im Bezug auf deine gepostete Website:

Eine Möglichkeit das zu tun wäre, wenn du den Eingang mit den Pulsen des Empfängers mit dem PIC überwachst. Du zählst einfach wie lang die einzelnen Kanalimpulse sind. In der Schaltung ist der Empfänger auf RB0 gesetzt und dort ist ein Interrupt, welcher immer, wenn ein Wechsel von low auf High stattfindet, einen Interrupt auslöst, welcher wahrscheinlich einen Counter startet und dann pollt man auf die Flanke High low und stoppt den counter. Damit kann man die einzelnen Kanalweiten "durchmessen". Speicherst du die Werte ab und erzeugst dann über I/O Pins die gleiche Abfolge für die Fahrtenregler. Es ensteht allerdings eine Zeitverschiebung der Signale, aber man könnte es auch versuchen während der Kanalmessungen schon Werte zu schalten.

So long...

Edit: Rechtschreibfehler

BlackBox
21.04.2005, 10:18
Das geht schon per Software aber bei 4 Kanälen wird es knapp.

Nehmen wir mal einen 16FXX mit 20MHz Takt, der arbeitet mit 5MIPs ergibt bei 3kHz 1.667 Maschinenzyklen pro Periode. Das schafft man auch noch locker per Timerinterrupt.

srem
21.04.2005, 11:31
für TomHumpen. Danke für die Erklärung. Das messen ist ja nicht das Problem sondern das Ausgeben von 3kHz PWM

für BlackBox
Mein Problem: Meine Routine breauch ca 30 Befehle zum überprüfen ob der einer der 4 Ports auf high oder low geschaltet werden müssen. Die auflösung meines Programmst ist 8bit. Also muss ich die Routine 255mal laufen lassen.
Ergibt 7650 Befehle. Und das mach leider eine frequenz von 130hz bei 4 Mhz Systemtakt.
Zur Erklärung meines Programmst

x
Vergleichen ob 1/0 (bei 4 Pins)
Schleifenzäler (255) und sprung zu x

Falls es eine andere Lösung gibt oder jemand eine andere Sicht hat. Vielen Dank im Vorraus

TomHumpen
21.04.2005, 11:50
Versuch die PWM doch per Software und Timer Interrupts zu machen. Du mißt die 4 Impulslängen bei RB0 und dannach gibtst du diese Zählwerte nacheinander an den Timer, setzt den ersten PIN auf 1, läßt den Timer runterzählen und bei 0 wird eine Interruptroutine gestartet welche den PIN wieder auf 0 setzt. Und das für alle 4 Werte und 4 Pins.
Wenn dir das zu heikel (oder zu Zeitunsicher) ist machs in Assembler mit NOP und Zählschleifen welche als Wert die Eingangsimpulsdauer hat. Da solltest du genau die gemessene Pulsweite an einen beliebigen PIN ausgeben können. So gibtst du nacheinander alle 4 Kanäle aus. Da du max. bei 4 Kanälen 8ms dafür brauchst, sollte das kein Problem sein in der Intervallpause der Fernsteuerung das auszuführen.

srem
21.04.2005, 12:08
an TomHumpen
Muss mir das mal mit den Interrupts überlegen (brauche Zeit bin kein schnell Denker) das mit nop funktioniert sicher nicht. Weil ich muss den Pin ein und im richtigen Moment ausschalten. Und das für 4 Pins. Und nur zum Überprüfen ob ich das Ding ausschalten muss bruach ich für 4 Pins ca 30 Befehle. Bei einer auflösung von 8bit ergibt das 7650 und wir wären wieder bei meinem alten Posting.

mfg Matthias

TomHumpen
21.04.2005, 12:34
nachmal die Assembler Idee

4 gemessene Pulsweiten wegspeichern(Zeit1, Zeit2, Zeit3,Zeit4)

;Software PWM

RRF Zeit1,1 ;Rechtshift= Division mit 2 weil Goto 2 Takte braucht
bsf PORTB,1 ;setzt PIN1 auf high
PIN1 ;Sprungmarke
decfsz Zeit1,1 ;Zeit = Zeit - 1
goto PIN1 ;Schleife (Braucht wie gesagt 2 Takte, deswegen der
Rechtsshift
bcf PORTB,1 ;setzt den PIN auf LOW
bsf PORTB,2 ;setzt PIN2 auf high
PIN2 ;2 Sprungmarke
.
.
.

bis alle 4 Pins durch sind. Dann wartetst du wieder auf den ersten Interrupt auf PIN B0. Du musst die gemessene Zeit nur durch 2 teilen, weil goto 2 Takte braucht. Ansonsten sollte das funktionieren und auch sehr Zeitgenau sein, da die Befehle ausgezählt sind. Das läßt sich sicher noch optimieren, aber es sei nur eine Idee.
Jetzt hast du 2 Ansätze, wie gesagt viel Erfolg.

BlackBox
21.04.2005, 12:37
Im Prinzip startest Du einen Timer zum Anfang einer Periode (ist für alle Kanäle gleich) und berechnest, wann der erste Kanal ausgeschaltet werden muss. Mit dem Wert "fütterst" Du den Timer und schaltest beim ersten Interrupt diesen Kanal ab. Dann weiter mit den drei anderen. gehen würde das, aber warum der Aufwand, wenn es MCs mit 4 PWM-Modulen gibt?

srem
21.04.2005, 12:56
Ok Leute vielen Dank für eure Arbeit. Ihr habt mir sehr geholfen. Werd mal schauen was ich zusammenbringe.
An Blackbox "aber warum der Aufwand, wenn es MCs mit 4 PWM-Modulen gibt?"
Wie heißt das Ding und wo bekomm ich es? Genau sowas wäre super

BlackBox
21.04.2005, 13:05
Hab ich doch oben schon geschrieben:

Hallo srem,

entweder Du verwendest zwei Prozessoren mit 2 PWM-Ausgängen oder schau dir mal die PIC18Fxx31 Serie an. Die haben 4 PWM Module und ein paar nette weitere Features integriert. Als Compiler könntest Du die 60 Tage Testversion (nach 60 Tagen einfach neu inst.) des C18 Compilers verwenden

20A ist schon ein ganz schöner Brocken. Gut 3kHz sind noch human aber wenn die 20A Dauerstrom sind, dann brauchst Du sehr gute Fets und gute Treiber sonst sind die Schaltverluste enorm.

srem
21.04.2005, 13:27
Sorry hab ich wohl überlesen. Aber danke

srem
21.04.2005, 14:08
Dein Programm geht nicht oder ich checks nicht.

Erstens warum division durch zwei. Du reduzierst nur die Zählschritte ohne Grund.
Meiner Meinung nach schalte ich pin1 auf high. Lasse dann den Zähler laufen (solange mein Puls dauern soll, Max 255, min 0. Danach muss ich den Rest abwarten um die gesammt PWM länge gleich zu halten (also wenn ich 50% Leistung hab heißt das : pin auf hight dann. Einen zähler bis 128 laufen lassen dann ausschalten. Dann einen anderen Zähler bis 128 laufen lassen und dann wieder einschalten.
Also warum soll ich durch 2 dividieren und zweitens wo bau ich jetzt die anderen 3 Kanäle ein? Ich hab ja kein Multitasking.

srem
21.04.2005, 14:11
An BlackBock
Wo kann ich das Ding bestellen ich find es nirgens (18Fxx31)

TomHumpen
21.04.2005, 17:26
Wenn du es parallel laufen lassen willst dann mußt du es machen wie BlackBox das beschrieben hat. Mit Timer laufen lassen und dann den Interrupt abfangen. Allerdings wird beim Aufrufen der Interruptroutine und prüfen welcher Kanal jetzt abgeschaltet werden muss auch wieder Zeit benötigt und das führt zu einem längeren Puls am Ausgang.
Die Assembler routine war ne schnelle Idee, wie man es NACHEINANDER ausführen kann. Sprich, man schaltet Kanal 1, dann Kanal 2 und so weiter. Die Assembler-Routine nimmt die gemessene Zeit für z.B Kanal 1 und soll genausoviele Takte wie der Wert des Registers ist auch den Pin auf High halten. Da allerdings der Rücksprung mit der GOTO anweisung 2 Takte und nicht 1 benötigt, muss das register vorher halbiert werden, damit dann nicht doppelt so lange gezählt wird. Ich kann mich auch irren, wie gesagt war kurz überlegt.

So long...

srem
22.04.2005, 06:45
Hab das Programm mit den Interrupts für einen Motor mal geschrieben.
Ergebnis Motor läuft mit 1,2kHz bei einem Systemtakt von 4MHz
Programm kann sicher noch optimiert werden.

BlackBox
22.04.2005, 09:17
Farnell hat die Chips z.B. im Programm.