Ich möchte einen einfachen Rechteckwellenoszillator erstellen, der dem eines 555 ähnelt, aber ich möchte die Interrupt-basierte PWM-Unterstützung verwenden, um die Impulsbreite und -frequenz zu steuern.
Ich habe das Datenblatt, die AVR-APIs und alle PWM-Beispiele, die ich finden kann, studiert, aber ich konnte nicht alles zusammenstellen.
Ist es möglich, einen solchen Oszillator mit der eingebauten AVR PWM-Funktionalität zu erstellen, und wenn ja, wie? Ein Freund von mir hat etwas Ähnliches mit einem 8-Pin-PIC gemacht.
Meine Argumentation ist, dass ich interessante Klänge bekomme, wenn ich die Pulsbreite und damit die Wellenform bei einer bestimmten Frequenz ändere. Ähnlich wie die Atari Punk-Konsole funktioniert, aber hoffentlich stabiler, dh die Pulsbreite ändert, aber die Frequenz konstant bleibt oder umgekehrt.
Antworten:
Diese sollten Sie ziemlich weit bringen und den Rest können Sie mit dem Datenblatt tun. Beginnen Sie Stück für Stück mit dem Aufbau, von blinkend über Wellenform zu Wellenform, die sich im Laufe der Zeit in Töne ändert. Einige Quellen können beim Filtern und Ansteuern von Audioausgängen hilfreich sein (aktiver LPF kann beides problemlos erledigen).
Ich schlage vor, mit spezifischeren Fragen zurückzukommen.
quelle
Die Dauer der PWM wird durch die Überlaufrate Ihres Timers bestimmt. Im Abschnitt Betriebsmodi gibt es viele Einstellungen, über die Sie nachdenken müssen. Wenn Sie lediglich eine Rechteckwelle mit konstanter Periode und variablem Arbeitszyklus erzeugen möchten, sollten Sie den CTC-Modus (Clear Timer on Compare Match) verwenden. Die Grundidee besteht darin, OCR0A auf die Anzahl der Timer-Ticks einzustellen, bis der Pin als nächstes umgeschaltet werden soll, und den Interrupt "Vergleich vergleichen" zu verwenden, um diesen Wert für das nächste Mal zu ändern. In avr-gcc würde es also ungefähr so aussehen:
Achtung, dies ist ungetesteter Code, aber ich denke, die Idee ist richtig. Dies ist keineswegs der einzige Weg, dies zu tun.
Es gibt übrigens eine Sache, die Sie über den ATTiny13 wissen sollten. Es wird garantiert, dass der interne RC-Oszillator nur bis zu 10% von der Fabrik entfernt ist. Es gibt einen Benutzerkalibrierungsprozess, den Sie durchlaufen können (beschrieben durch eine atmel- Appnote ), der Sie auf eine Genauigkeit von 2% für den ATTiny13 bringt. Wenn Sie es besser machen wollen, müssen Sie wahrscheinlich einen Chip verwenden, der einen externen Kristall aufnehmen kann ...
quelle
Keine direkte Antwort auf Ihre Frage, aber dies kann naheliegend sein und einige Hinweise geben -
Ich habe gerade einen numerisch gesteuerten Oszillator (NCO) mit einem ATmega uC und einem DAC erstellt. Ein Array von ganzen Zahlen wird verwendet, um einen Zyklus einer Wellenform (Wavetable) zu speichern. Ein Phasenakkumulator (long int) wird verwendet, um die Adresse der Ausgangsdaten im Wavetable zu bestimmen. Jeder Timer-Interrupt erhöht den Phasenakkumulator um einen festen Wert. Das Phaseninkrement bestimmt die Frequenz.
In meiner Anwendung habe ich eine 64-Byte-Wavetable verwendet, die einen Sinuszyklus enthielt. Es ist einfach, den Wavetable zu erweitern und den Samples mehr Auflösung hinzuzufügen. Mein Anwendungshinweis befindet sich unter http://wiblocks.com/docs/app-notes/nb1a-nco.html
quelle
Grundsätzlich ändert eine PWM die Frequenz nicht. PWM werden meistens verwendet, um die "Intensität" eines Signals zu steuern.
Um einen Interrupt für verschiedene Frequenzen zu erzeugen, würde ich empfehlen, den Timer im CTC-Modus zu verwenden.
Es wird zu Ihrem Vergleichswert ausgeführt, ein Interrupt umgeschaltet, gelöscht und neu gestartet - bis es wieder zu Ihrem Vergleichswert läuft ...
Bei jedem Interrupt können Sie einen oder mehrere Ports wechseln und den Rest der Zeit (der Timer läuft immer noch automatisch) können Sie Ihre Eingaben jeglicher Art beobachten ...
Sie können Ihre Rechteckwelle weiterhin mit einer PWM "modulieren", um die "Verstärkung" zu steuern. Aber einer von ihnen muss "von Hand" gemacht werden, weil der ATtiny13 nur einen Hardware-Timer hat ...
quelle