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
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
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
@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.
@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
... 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 ?!
@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
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.
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
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
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.