Forum: Mikrocontroller und Digitale Elektronik Probleme mit ATMega8 und PWM


von Paul W. (alphathinking)


Lesenswert?

Hallo zusammen!


Ich habe mich dieses Wochenende mal an mein erstes "größeres" 
Hardware-Projekt getraut ("groß" -> mit avr-gcc statt Arduino), ein per 
vUSB angebundener LED-Controller.

Gesteuert werden 3 Farbkanäle (R,G,B) mit 8-bit Fast-PWM, die drei 
PWM-Pins sind über einen ULN2003A-Chip mit dem LED-Band verbunden. Die 
entsprechenden Bits habe ich gemäß Datenblatt[1] wie folgt gesetzt:
1
// PWM-Pins auf Output schalten
2
DDRB |= (1 << DDB1)|(1 << DDB2)|(1 << DDB3);
3
4
// PWM-Kanal 1
5
// COM1A1 + COM1B1 => Nicht-invertierendes PWM; WGM10 + WGM12 => fPWM 8-bit; CS10 => kein Prescaler
6
TCCR1A = (1 << WGM10)|(1 << COM1A1)|(1 << COM1B1);
7
TCCR1B = (1 << WGM12)|(1 << CS10);
8
9
// PWM-Kanal 2
10
// WGM21 + WGM20 => fPWM; COM21 => Nicht-invertierendes PWM; CS20 => kein Prescaler
11
TCCR2 = (1 << WGM21)|(1 << WGM20)|(1 << COM21)|(1 << CS20);

Nun haben sich 3 Fragen/Probleme aufgetan, die mir Google leider nur 
teilweise beantworten konnte:

1.) Ich bekomme die LEDs nie vollständig ausgeschaltet. Auch wenn ich 
OCR1A, OCR1B und OCR2 auf 0 gesetzt habe, "glimmen" die LEDs (alle 
Kanäle) immer noch mehr oder weniger leicht vor sich hin. Digital 
abschalten kann man fPWM-Pins ja leider nicht mehr. Hat da jemand eine 
Idee?

2.) Was bringt der PWM-Vorteiler (den man ja zwischen 1 und 1024 setzen 
kann)? Im Internet habe ich nur gelesen, dass der Zähler bei einem hohen 
Vorteiler nicht so schnell überlaufen würde, was mir ja einleuchtet, 
aber was für einen Nachteil bringt das denn? De facto dürfte das PWM mit 
einem geringeren Vorteiler doch "smoother" laufen, weil die Frequenz 
doch dann höher ist? Oder habe ich da grundlegend etwas falsch 
verstanden?

3.) Kann man den 3. PWM-Pin tatsächlich nur mit maximal 8-bit ansteuern? 
Im Datenblatt[1] habe ich jetzt keine entsprechende Konfiguration für 
10-bit gefunden, aber ich frage an dieser Stelle doch lieber nochmal 
nach, denn 10-bit wären natürlich schon schöner :P.

Ich hoffe, dass die Fragen nicht allzu idiotisch sind und wäre froh wenn 
mir jemand helfen kann :).


LG,
alphathinking



[1] 
http://www.atmel.com/images/atmel-8159-8-bit-avr-microcontroller-atmega8a_datasheet.pdf

von Tom E. (Gast)


Lesenswert?

Paul W. schrieb:
> Digital abschalten kann man fPWM-Pins ja leider nicht mehr.

Was auch immer "fPWM-Pins" sind - was hindert dich daran, einen Pin vom 
ATmega8 auf 0 zu setzen?

von Felix A. (madifaxle)


Lesenswert?

Bei FastPWM gibt es meines Wissens nach immer kurze Pulse, egal ob du 
invers oder nichtinvers nutzt. Ein Umstieg auf Phase and Frequency 
Correct Mode könnte hierbei Abhilfe schaffen.

Alternativ den PWM-Kanal deaktivieren, wenn kein PWM-Wert ausgegeben 
werden soll oder den Portpin auf Eingang umschalten (ich meine, dass bei 
PWM der Pin im Programm als Ausgang geschaltet werden muss).

von Hubert G. (hubertg)


Lesenswert?

Trenne die Verbindung zwischen Arduino und ULN auf. Dann weißt du woher 
das Glimmen kommt.
Schon mal nachgerechnet wie hoch die PWM-Frequenz ist ohne Vorteiler? 
Der ULN ist nicht der schnellste.
Timer 2 ist nur ein 8bit Timer, da geht nicht mehr.

von Paul W. (alphathinking)


Lesenswert?

@Tom E.
Sorry... Mit fPWM meine ich Fast PWM (siehe Datenblatt). Ich dachte ich 
hätte das wenigstens einmal ausgeschrieben und habe es dann wohl zu oft 
rausgekürzt ;).

Das mit den nicht ausschaltbaren PWM-Ausgängen habe ich in einem 
PWM-Tutorial zum AtMega8 gelesen. Tatsächlich hat Folgendes bei mir auch 
nicht funktioniert:
1
PORTB &= ~(1 << DDB1);

von Felix A. (madifaxle)


Lesenswert?

Dann bliebe vielleicht der inverse Modus. Nur dass dann die Werte 
andersrum angegeben werden müssen. 255 (bzw. der Maximalwert) würde also 
OFF bedeuten.

von Tom E. (Gast)


Lesenswert?

Paul W. schrieb:
> Sorry... Mit fPWM meine ich Fast PWM
Fast PWM ist eine Betriebsart des Timers, aber doch kein Pin.

> Tatsächlich hat Folgendes bei mir auch nicht funktioniert:
> PORTB &= ~(1 << DDB1);

Wenn man einen Ausgang auf 0 zwingen will, ist es IMHO etwas 
eigenwillig, ihn in die Luft zu hängen.

Und den von Hubert vorgeschlagenen Test sollte man sowieso machen, wenn 
etwas komisch ist.

Hubert G. schrieb:
> Trenne die Verbindung zwischen Arduino und ULN auf. Dann weißt du woher
> das Glimmen kommt.

von Paul W. (alphathinking)


Lesenswert?

@hubertg
Das mit dem Prescaler hat zwar nicht geklappt, der einzige Effekt war, 
dass die LEDs furchtbar angefangen zu flimmern haben, dafür weiß ich 
jetzt immerhin wofür der Vorteiler - zumindest theoretisch - gut ist.

@madifaxle
Danke! Jetzt funktioniert es perfekt, bei (255,255,255) sind die LEDs 
erwartungsgemäß alle aus.


Vielen Dank an alle für die schnellen Antworten. Jetzt sind tatsächlich 
alle meiner 3 Fragen innerhalb von 50 Minuten gelöst worden - super! Ich 
fürchte die Fragen waren doch "allzu idiotisch" ;).


LG,
Paul W.

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
Noch kein Account? Hier anmelden.