mikrocontroller.net

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


Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tüddel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
^ncp1200  << das ist einer ;-)

Autor: Dennis Brücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dennis Brücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis Brücke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?!

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Sªsse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.