Forum: Mikrocontroller und Digitale Elektronik Brauche mehr PWMs, gibt es externe Controller?


von TOM (Gast)


Lesenswert?

Hallo Zusammen!
Ich möchte mit einem AVR 4-6 Motoren per PWM steuern können.
Da es keine AVRs mit solch einer großen Zahl von Compare-Registern
gibt, muss ich mir eine andere Lösung einfallen lassen. Da ich auf hohe
Frequenz und geringe Rechenarbeit für die PWMs Wert lege, scheidet eine
Softwarelösung wohl aus. Meine Ideen sind waren jedenfalls nicht sooo
effektiv.
Kenn jemmand spezielle Controller, die die Erzeugung von mehreren
PWM-Signalen übernehmen und einfach an einen µC angebunden werden
können?

Danke schonmal für Eure Hilfe

Gruß

Thomas

von tüddel (Gast)


Lesenswert?

^ncp1200  << das ist einer ;-)

von Dennis Brücke (Gast)


Lesenswert?

Hi TOM,

bei 4-6 Motoren sollte es doch kein Problem sein die PWM per Software
zu realisieren womit du Ohne Probleme dann bis zu 8 PWM´s machen kannst
+ die Hardware PWM Kanäle. Code beispiele sind genügend im Forum. Ich
hatte vor kurzem das gleiche Problem mit 3 x PWM auf einen Tiny12 (der
ja gar keine HW PWM hat)

Gruß Dennis

von Sebastian (Gast)


Lesenswert?

ja, aber wie machst du mit vertretbarem rechenauffwand pwms mit 40Khz
und 8bit.

Es gibt von motorola Chips die haben 8 PWMs in Hardware MC68HC908 xxx
einfach mal suchen.
Oder 2-3kleine Atmels als I2C slaves nehmen die dann die PWM
übernehmen,.. die können dann auch noch die schnellen berechnungen für
die regler mechen. Somit hast du für den Master nur minimalen
auffwand.

Sebastian

von TOM (Gast)


Lesenswert?

@tüddel:
Wie ich eben mal schnell aus dem Datenblatt ersehen konnte, ist das ein
einfacher PWM-Controller für Schaltnetzteile, quasi ein Regelkreis. Den
bekomme ich aber doch nicht an ein µC angeschlossen, oder verstehe ich
dich falsch?

@Dennis:
Zu hören, dass es mit Software doch gehen sollte, gibt mir wieder
Motivation, es nochmal auf diesem Weg zu versuchen. Sollte das zu
großen Rechenaufwand bedeuten, kann ich dass immenoch auf kleine AVRs
verlagern und den weg von Sebastial versuchen. Leider habe ich noch
keinen I2C-Slave programmiert, aber das dürfte ja nicht so schwierig
sein.

von Dennis Brücke (Gast)


Lesenswert?

@TOM

Der Rechenaufwand richtet sich im endeffekt nach der Frequenz und der
Anzahl der Kanäle machen möchtest. Ein Motor brauch ja im endeffekt
nicht wirklich eine hohe frequenz
(zumindestens nicht im 10kHz bereich) um es mal Theoretisch zu sagen
wenn du 6 Kanäle bräuchtest, kannst immer noch 3* HW-PWM & 3* Software
PWM machen...

In ASM kann ich Dir gerne ein beispiel einer Software PWM geben (bzw.
vor ca. 2 Wochen habe ich mit hilfe von leutchens hier im Forum das
gerade erst gemacht)

Denke mal nicht das sich der Aufwand lohnt extra I²C Slave zu
Programmieren... da dürfte doch SPI einfacher sein.

Gruß Dennis

von Dennis Brücke (Gast)


Lesenswert?

... erst lesen, dann absenden... Sorry für die vielen Fehler im Text

Hatte ganz vergessen:
Beschreib doch mal deine Anwendung genauer, was soll der µC denn noch
Hauptsächlich machen ?!

von Sven (Gast)


Lesenswert?

@Dennis

>>Ein Motor brauch ja im endeffekt nicht wirklich eine hohe frequenz

Nein, nicht wenn Du ihn als Lautsprecher verwenden willst. Aber für
bestimmte Motoren ist eine PWM von 25-30kHz schon sinnvoll, wenn man
sie nicht hören will.

@Tom

Für eine Mehr-PWM-Lösung über 20 kHz wäre ich auch zu interessieren.
Meine Ideen scheitern bisher an der Taktfrequenz und Rechenzeit.

Sven

von Philipp Sªsse (Gast)


Lesenswert?

Das schnellste, was ich mir in Software vorstellen kann:


pwm-interrupt:
  in savereg, SREG     ;SREG retten
  ser pwm_set          ;jeden PWM-Ausgang setzen

  cseq counter, pwm0   ;wenn gleich ...
  cbr toggle, (1 << 0) ;... dieses Bit doch nicht setzen

  cseq counter, pwm1   ;wenn gleich ...
  cbr toggle, (1 << 1) ;... dieses Bit doch nicht setzen

... usw. ...

  or pwm_out, pwm_set  ;alle zu setzenden setzen
  out PORTx, pwm_out

  inc counter
  bne return
  ldi pwm_out, 0       ;Bei Counterüberlauf alle auf null
return:
  out savereg, SREG     ;SREG zurück
  reti


(Die unübersichtliche Anordnung mit Überlauf-Zurücksetzen nach dem
out ist nötig, um eine Dauer-1 zu ermöglichen.)

12 Takte inkl. Rücksprung plus 2 pro Kanal plus x für den
Interrupteinsprung. Bei 8 Kanälen also ca. 32 Takte. Damit ist
softwaremäßig die theoretische Grenze bei 122 Hz pro MHz Taktfrequenz.
Das reicht sicherlich für viele Anwendungen, aber wenn es nicht hörbar
sein darf, natürlich nicht.

Wenn weniger Auflösung reicht, wird pro Aufruf ein Takt mehr benötigt,
um ein ORI counter, Bitmaske auszuführen. Mit einem 16 MHz AVR und 32
Stufen wäre man also immerhin bei 15 kHz für 8 Kanäle.

Insgesamt aast diese Implementierung natürlich gräßlich mit Registern,
aber es liegt auf der Hand, daß pwm-Werte im RAM die Sache erheblich
ausbremsen würden.


Wenn Geschwindigkeit und hohe Auflösung verlangt werden, wäre noch
eine Lösung mit Sigma-Delta-Modulation denkbar, die natürlich
prinzipbedingt bei Werten nahe Null oder nahe Vollaussteuerung auch
wieder hörbar sein wird (sogar verschärft, weil die Interruptroutine
langsamer wird). Wenn man mehr mit Teillast arbeitet, aber wohl eine
Erwägung wert.

von TOM (Gast)


Lesenswert?

Die SPI zu nehmen anstatt I2C-Slaves zu programmieren ist sicherlich die
bessere Wahl, wenn überhaupt auslagern.
Der µC soll die Drehzahl eines Motors (mit Getriebe)über je eine
Lochscheibe+Lichtschranke erfassen und diese regeln (ähnlich Lageregler
in der Roboterrechnik). Das ganze 4 mal. Die Regelungstechnik ist kein
Problem, nur eben die PWMs.
Da die Drehzahlerfassung aber auch recht Timer- und Interruptlastig
ist, werde ich wohl nicht drumherum das ganze auf mehrere AVRs
aufzuteilen. Die Geräuschentwicklung bei PWM mit kleinen Frequenzen ist
natürlich nicht sehr schön, aber durchaus akzeptabel.


Danke schonmal an alle

von Sebastian (Gast)


Lesenswert?

ich würde ein avr pro motor verwenden und dann einem bus zum steuern der
  Motorregler verwenden. Selbst ein analogsollwert würde ja dann gehen.
So ist man modular und kann auch die drehzahlaufnahme mit dem
motorregler avr machen.
Ausserdem ist es warscheinlich besser zu layouten.
Ich bevorzuge insofern i2c das man nur 3kabel braucht, und nicht noch x
enable leitungen für die slaves. von der geschwindikeit ist ja beides
ähnlich wenn man HW SPI oder HW i2c nimmt.

Sebastian

von Michael (Gast)


Lesenswert?

Ich verstehe Dein Problem nicht; ein ATMEGA128 bietet bis zu acht
PWM-Kanäle.

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.