Hallo allerseits,
ich hatte mal ein bisschen mit uCs rumgespielt, aber bin nicht weit
gekommen. Nun habe ich ein Projekt im Kopf, bei dem ich gerne LEDs via
PWM steuern will.
Da soll die Taktrate folgende sein: 1ms Impuls alle 10 ms. Also 1ms an,
9ms aus, etc.
Dabei soll am Ende, bzw. muss (!) der Abstand der Impulse über einen
Poti steuerbar sein. D.h. drehen bedeutet längere Zeiten zwischen den
An-Zeiten. An einem weiteren Poti würde ich gerne noch ein Delay
einbauen, soll heißen, wenn man daran dreht, verschieben sich die
Impulse in der Zeit nach vorne/hinten, was nichts anderes wäre, als ein
paar Mal die Aus-Zeit zu verlängern bzw. zu verkürzen.
Nun dachte ich, dass das ganze mit der CTC-PWM sehr gut machbar wäre, da
ich hier ja per Interrupt immer wieder die Impulsdauer etc. nachregeln
kann.
Ich habe einen ATMega 644P, der zwar ziemlich überdimensioniert ist,
aber eben gerade vorhanden.
Ich scheitere schon beim Anfang:
Ich habe das Datenblatt natürlich durchgelesen und auch schon mal eine
PWM erstellt, allerdings noch keine CTC und irgendwie will das hier
nicht. Ihr könnte mir gerne meinen absoluten Anfängerfehler aufzeigen
und/oder mir andere/bessere Möglichkeiten für mein Vorhaben nennen. Den
Eingang für die Potis (auf den ADC darf ja nur ein Eingangspin
geschaltet sein) würde ich per Taster und Interrupt switchen.
Vielen Dank für Eure Hilfe!!
Hier mal der Code
Hi
>Nun dachte ich, dass das ganze mit der CTC-PWM sehr gut machbar wäre,...
CTC-PWM gibt es nicht.
CTC erzeugt eine Frequenz mit einem Tastverhältnis von 1:1
PWM erzeugt eine Frequenz mit variablen Tastverhältnis.
Es gibt aber z.B. die Timermode 14 und 15 (WGM13:10= 1110/1111) bei
denen die Frequenz über ICR1 oder OCR1A eingestellt wird und das
Tastverhältnis über OCR1A/B bzw. OCR1B bestimmt wird.
MfG Spess
Danke für die schnelle Antwort! Sowas konnte ich wohl so schnell nicht
aus dem Tutorial oder Datenblatt herauslesen ;).
Hat jemand dann noch direkt einen passenden Tip oder Code, wie ich mit
der internen RC-Frequenz (1 MHz) diese PWM, wie oben beschrieben,
einstellen kann? Also dass ich eben die LEDs takte mit 1ms an, 9ms aus,
usw.
Es muss nicht zeitkritisch sein, also Uhrwerk-genau, nur sollte es grob
passen. Gibt es dazu Bib-Funktionen oder wird das dann über den
Prescaler einfach eingestellt?
Grüße
Spess53 schrieb:> CTC erzeugt eine Frequenz mit einem Tastverhältnis von 1:1
Wieso das? Wenn ich den CTC Mode richtig verstehe kann ich das
Tastverhältnis über den Comparewert festlegen. Der Nachteil ist nur das
die Werte in OCRx jederzeit geändert werden können, während in den PWM
Modi zunächst zwischengespeichert wird und OCRx zu einem definierten
Zeitpunkt geändert wird.
Daher stelle ich mir die Frage, wozu der CTC-Mode überhaupt benötigt
wird. Oder benötigen die PWM Modi wesentlich mehr Zeit bzw. Speicher?
Gruß,
Stefan
Hi
Im CTC-Mode zählt der Timer bis zum OC-Wert und fängt dann von Null
wieder an. Am Comparezeitpunkt wird die dur COMxY1:0 festgelegte Aktion
am OC-Pin ausgelöst.
Ich beschränke mich mal auf Fast PWM. Dort löst der Timer bei Erreichen
des OC-Wertes die Aktion aus, zählt aber bis Top weiter. Erst dann wird
wieder bei Null angefangen.
D.h. um mit CTC eine PWM zu erzeugen müsstest du bei jedem Erreichen des
OC-Wertes einen neuen Wert reinschreiben. In einem PWM-Mode gibst du
einmal den Compare-Wert und den Top-Wert vor und das Ganze läuft
selbständig bis du z.B. ein anderes Tastverhältnis haben willst.
MfG Spess
Ich habe mich mit dem CTC Mode nie wirklich beschäftigt, da die Gefahr
besteht den OCRx Registern zum falschen Zeitpunkt neue Werte zu
übergeben. Wenn ich PWM benötige benutze ich auch die PWM Modi.
Aber mal rein zu meinem Verständnis:
Die Auflösung des Timers (Beispiel Tiny24 Timer 1) kann mittels mittels
OCR1A oder ICR1 festgelegt werden.
Somit kann ich doch bei TOP = ICR1 an OCR1A / OCR1B ein variables
Tastverhältnis erreichen?
Gruß,
Stefan
Stefan Weßels schrieb:> Die Auflösung des Timers (Beispiel Tiny24 Timer 1) kann mittels mittels> OCR1A oder ICR1 festgelegt werden.> Somit kann ich doch bei TOP = ICR1 an OCR1A / OCR1B ein variables> Tastverhältnis erreichen?
Ja, kannst du
Danke nochmals für die Antworten!
Kann ich in (irgendeiner) PWM Mode auch einfach, während er läuft, mit
z.B. einem Poti den Compare-Wert bzw. den TOP-Wert ändern? Brauche ich
hierfür interrupts oder gibt es eine elegante Möglichkeit (Code?), mit
einem Poti, programmtechnisch klein gerastert, den Wert einfach so
einzustellen?
MfG
Hi
>Kann ich in (irgendeiner) PWM Mode auch einfach, während er läuft, mit>z.B. einem Poti den Compare-Wert bzw. den TOP-Wert ändern?
Wenn dein AVR einen ADC besitzt, kein Problem. Die Potis an den ADC
anschliessen. Spannung messen und nach passender Umrechnung die
entsprechenden laden.
MfG Spess
Emanuel schrieb:> Kann ich in (irgendeiner) PWM Mode auch einfach, während er läuft, mit> z.B. einem Poti den Compare-Wert bzw. den TOP-Wert ändern?
Natürlich kannst du.
Lern bitte mit deinem Datenblatt zu arbeiten.
> Brauche ich> hierfür interrupts oder gibt es eine elegante Möglichkeit (Code?),
Noch eleganter als einfache Registerzuweisung?
Emanuel schrieb:> Kann ich in (irgendeiner) PWM Mode auch einfach, während er läuft, mit> z.B. einem Poti den Compare-Wert bzw. den TOP-Wert ändern?
Kannst Du z.B. so:
1
/*
2
2-Kanal PWM-Steuerung
3
MCU: ATtiny 25
4
Takt: 8MHz
5
PWM an PB0, PB1 (OC0A, OC0B)
6
ADC an PB3, PB4 (ADC3, ADC2)
7
*/
8
9
#include<avr/io.h>
10
#include<avr/interrupt.h>
11
12
#ifndef F_CPU
13
#define F_CPU 8000000UL
14
#endif
15
16
17
volatileuint8_tflag;
18
uint8_tget_ADC(uint8_tchannel);
19
20
intmain(void){
21
22
//PB 0,1 auf Ausgang
23
DDRB|=1<<PB0|1<<PB1;
24
25
//ADC Referenz Vcc , Left Adjusted, Single Ended, prescaler 16
Hi,
Vielen Dank für diesen Code, das hat mir sehr weitergeholfen!
Allerdings habe ein ein kleines Problem:
Mit der FastPWM kann ich offenbar nicht den TOP-Wert verändern. Meine
Anforderung ist aber, die Aus-Zeit der LEDs zu verlängern, ohne die
An-Zeit zu verkürzen. Hierzu müsste ich doch eine andere PWM nehmen oder
nicht?
Mit zwei Potis will ich am Ende auf folgendes zugreifen:
Drehen am einen Poti - Den ganzen Takt nach "hinten" bzw. "vorne"
verschieben.
Drehen am anderen Poti - Die Pausen verlängern.
Das ganze soll für eine Time-Fountain sein:
http://www.cre.ations.net/creation/the-time-fountain
Grüße
Emanuel schrieb:> Allerdings habe ein ein kleines Problem:>> Mit der FastPWM kann ich offenbar nicht den TOP-Wert verändern. Meine> Anforderung ist aber, die Aus-Zeit der LEDs zu verlängern, ohne die> An-Zeit zu verkürzen. Hierzu müsste ich doch eine andere PWM nehmen oder> nicht?
Ja.
Gibt ja noch genug andere Modi.
Im Datenblatt ist eine schöne Tabelle in der alle Modi aufgeschlüsselt
sind. Dort steht auch jeweils dabei, wodurch der TOP Wert festgelegt
wird. Da gibt es welche mit fixem Top-Wert (die sog. Fast-PWM) aber es
gibt auch welche, in denen ein Register den Top-Wert vorgibt
Hi
'Fast PWM' hat nichts mit festem Top-Wert zu tun. Im Datenblatt findest
du bei jedem Timer einen Abschnitt 'Modes of Operation'. Da steht, was
der Timer alles kann.
MfG Spess
spess53 schrieb:> Hi>> 'Fast PWM' hat nichts mit festem Top-Wert zu tun.
Mein Fehler.
Du hast natürlich recht. Bei Fast-PWM geht es um die Art und Weise wie
der Timer zählt.