Ich möchte die Geschwindigkeit eines Kleinmotors mit einem Mega48 regeln. Im Moment verwende ich 8Bit FastPWM und der Controller läuft auf 1MHz. doch mich stören 2 Dinge: Zum einen ist es mir nicht gelungen, ein durchgehendes LOW Signal zu erzeugen da er inm nichtinvertirerenden Modus ja bei jedem Erreichen der Zählgrenze den Portpin auf HIGH schaltet (und sofort wieder auf 0) und daher einen kurzen Pike erzeugt. Verwende ich den nichtinvertierenden Modus gibts eben kein sauberes HIGH Signal. Darüberhinaus fiept der Motor bei der aktuellen Frequenz. Lasse ich den Controller auf 8Mhz laufen ist alles bestens. Ich möchte also die PWM Frequenz steigern. Da ich die 8Bit Auflösung nicht ausnutze, sondern nur AUS 25%, 50%, 75% und Vollast verwende, haeb ich mir gedacht, 2-3Bit PWM zu verwenden, habe aber nicht herausgefunden wie das geht. Kan mir jemand weiterhelfen? mfg Lukas
Schau dir mal den "komplizierteren" PWM Modus an. Also nicht den Fast-PWM Modus. Der erzeugt, meine ich, keine Spikes bei den Grenzwerten.
Dann halbiert sich die effektive Frequenz und das ist genau das gegenteil von dem, was ich erreichen will. Wen man die Auflösung verringern könnte, würde ich sicher die anderen Modi nehmen. Software PWM möchte ich vermeiden da der Controller eh schon genug beschäftigt ist und wen er schon 6 HW PWM hat, wieso sollte man die nicht auch verwenden?
Doch. 15khz würden reichen. aber ich möchte den Controller so langsam wie möglich betreiben (128kHz interner RC wären nicht übel)
Wenn Du eine 2-3-Bit-PWM machen willst, warum tust Du es nicht einfach? Wenn Du Timer 1 benutzt, dann nimm z.B. PWM-Modus 14 (Bei Timer 0 Modus 7) und Du kannst jede beliebige Auflösung einstellen... Das Problem mit dem einen Taktzyklus Peak wird sich dadurch zwar nicht beheben lassen, aber Du kannst die Frequenz weitgehend frei wählen.
Aktuelles Datenblatt Stand 06/05 (preliminary): Timer 0 auf Seite 101, Timer 1 auf Seite 130, schöne Tabelle mit allen Einstellungsmöglichkeiten
BEi mir am Mega8 passte das für die PWM mit dem Pin leider nicht, deshalb habe ich einfach den Overflow und den Compare Interrupt angemacht. Im Overflow macht er den Portpin an, ausser der Comparewert ist 0 und im Compare macht er den Pin aus, ausser der Compare wert ist 255. So habe ich keine Peaks bei 0 und 255 und ich konnte den Pin frei wählen. Man hat zwar so 2 Interrupts pro PWM Periode, aber immernoch besser als direkt Software PWM. Gruß Philipp
@Johnny: Bei deinen genannten Modi wird das OCR0A Register für die Manipulation der Timer-Auflösung benutzt um die Frequenz zu ändern. Welches Register beinhaltet denn den Duty Cycle dann?
Bist du dir sicher, dass du dann nichts mehr hörst? Ich habe mir mal einen Frequenzgenerator gebaut, an einen Lautsprecher angeschlossen und die Frequenz mit einem Oszilloskop gemessen. Erst ab ~18 - 18.5kHz habe ich nichts mehr gehört. Ab 18kHz wurde es deutlich leiser. Ab 19kHz glaubte ich nichts mehr zu hören und bei 19.5 habe ich definitiv nichts mehr gehört. Vielleicht ist aber der Motor einfach nur ein zu schlechter Resonanzkörper, so dass die Leistung nicht ausreicht um es zu hören.
Ja, ich höre nix mehr. Aber um das geht es ja eigendlich gar nicht. Wen ich eine niedrige Frequenz wähle bei der der Motor auch nicht Fiept hat er Anlaufprobleme. Also besser eine möglichst hohe PWM Frequenz bei möglichst geringem Controllertakt.
>>Also besser eine möglichst hohe PWM Frequenz bei möglichst geringem
Controllertakt.
Hm, das Problem ist, dass deine PWM Frequenz immer ein Teiler des
Controllertakts sein wird. Also wird der Controllertakt immer
(wesentlich) höher liegen, als deine PWM Frequenz.
Ausnahme: Irgndein Tiny (oder sogar mehrere) haben eine PLL
(Frequenzvervielfacher) integriert. Dann kann man bei xx kHz
Controllertakt die Timer mit xx MHz versorgen.
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.