Probleme mit ATMega8 und PWM

OP #4359800
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
#4359823
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).
OP #4359862
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);
Gast #4359890
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.
OP #4359895
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren