Hallo Forum,
für ein kleines Projekt habe ich einen 1750Hz Sinusgenerator mit µC als Designstudie aufgesetzt.
Es kommt ein attiny45 (attiny85) mit 16MHz PLL Clock zum Einsatz, der PWMA (OCR1) Ausgang muss für reale Anwendungen noch ein 2-3 stufiges RC TP-Filter erhalten.
- Timer0 generiert ein 1750Hz Sinussignal durch nutzen einer Sinustabelle mit 135 Stützstellen.
- Jeder einzelne dieser 135 PWM Stützstellen wird mit 236,25kHz in das Register OCR1A von Timer1 geschrieben.
- Das Signal für für 800ms generiert, danach geht der Atmel AVR µC in den Powerdownmodus.
- Timer1 generiert ein PWM Signal mit 64MHz PLL Clock
Timer0 enthält keine Interrupt-Service-Routine, sondern es wird im Hauptprogramm das Timer0 Interrupt-Request-Flag abgefragt und so das Zeitsignal verarbeitet.
Da man nun nur noch 67 Takte für die Berechnungen und Ausgabe des nächsten PWM Wertes Zeit hat, habe ich diesen Teil in Assembler/ LunaAVR codiert.
Der LunaAVR Code ist natürlich zum Vergleich auch vorhanden.
Weitere Einzelheiten sind um Quellcode dokumentiert.
Das Programm unterstützt weitere Sinustabellen mit unterschiedlichen Anzahl von Stützstellen, nicht alle sind brauchbar:
- 64
- 96
- 128
- 135
- 160
- 192
- 224
- 256
64 Stützstellen laufen noch mit einem reinen LunaAVR Programm und 192 Stützstellen ist die maximal Anzahl für den Hybrid Assembler/ LunaAVR Code.
Und hier noch eine Bildschirmkopie des 1750Hz Sinus mit 192 Stützstellen und zwei nachgeschalteten RC TP-Filter mit R=75Ohm, C=1µF.
Info:
Die Fusebits für avrdude eines attiny45/85 sind:
Zitat-U lfuse:w:0xc1:m -U hfuse:w:0xdc:m -U efuse:w:0xff:m
Link:
* LunaAVR V2014 R2.4 (stable)
* zum Forum
Edit
* 31.03.15 Firmware und LunaAVR Sourcecode