Hardware PWM in Software einspeisen?

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Antworten
Benutzeravatar

Thread-Ersteller
haxdraht
Grillmeister
Beiträge: 2336
Registriert: Fr 19. Okt 2007, 18:29
Spezialgebiet: E-Motoren, Notstromanlagen
Wohnort: Hamburg
Danksagung erhalten: 19 Mal

Hardware PWM in Software einspeisen?

Beitrag von haxdraht »

Hallo,
ich stehe auf dem Schlauch..

Folgendes Problem bietet sich mir dar: Ich will eine Vierstellige Siebensegmentanzeige per PWM in der Helligkeit regeln können.
Mein Lösungsansatz ist nun folgender: Ich stelle einen Timer im Atmega328 ein der die PWM erzeugt und somit die Helligkeitsregelung übernimmt. Dabei muss ich durch Multiplexing aber 4 Ausgänge ansteuern. dh. ich bräuchte auch 4 PWM Ausgänge... das erscheint mir aber irgendwie unelegant, also möchte ich die vom Timer erzeugte PWM per Software auf die 4 Kathodentreiber schalten.
Allerdings finde ich keinerlei Möglichkeit die erzeugte PWM aus einem Register auszulesen (oder ich übersehe das Offensichtliche). Die pragmatische Variante den PWM Ausgang auf einen Eingang zu schalten fällt leider aus weil ich a: keine pins freihabe und b: "wie gewollt und nicht gekonnt" :haufen:

Im Datenblatt habe ich bisher auch nur die Möglichkeit gefunden die PWM direkt auf einen Ausgang zu schalten. Gibt es überhaupt einen Weg die Hardware-PWM in Software weiterzuverarbeiten?
Benutzeravatar

Paul
Admin
Beiträge: 3596
Registriert: So 7. Aug 2005, 14:34
Schule/Uni/Arbeit: HW/SW-Entwickler
Wohnort: Braunschweig
Hat sich bedankt: 638 Mal
Danksagung erhalten: 210 Mal
Kontaktdaten:

Re: Hardware PWM in Software einspeisen?

Beitrag von Paul »

Moinsen Hax,

für mich ist noch nicht ganz ersichtlich, wie das eigentliche Dimmen nun genau von statten geht, also wie die Kathodentreiber mit dem AVR verbunden sind. Über ein Software-Interface wie SPI/I²C? Oder meintest du, dass du bereits Hardware-Enable-Pins an die Treiber gibst und diese auch in deiner Hauptsoftware schaltest, ABER diese "gleichzeitig" auch nochmal PWM-Modulieren möchtest? (Vermute ich mal.)

Also es gibt verschiedene PWM-Modi, vermutlich nimmst du die 8-Bit Fast-PWM und nimmst eines der Output Compare Register (OCR) als Vergleichswert.

Dann läuft dein Timer-Counter (TCNT) von 0 bis 255 und beginnt dann wieder von vorne. Bei jedem "Match", also wenn TCNT == OCR, wird der entsprechende Compare-Match-Interrupt aufgerufen, je nach AVR-Typ heißt der dann z.B. TIMER0_COMPA_vect oder so.
Das wäre dann der Interrupt zur fallenden Flanke des PWM-Signals (wenn man es sich auf einem Oszi dargestellt vorstellt).
Innerhalb dieser Interrupt-Service-Routine (ISR) kannst du dann meinetwegen einen Pin einschalten oder ein Kommando an die Treiber senden.

Dann müsstest du natürlich noch bei der steigenden Flanke eine Aktion ausführen, also den Pin löschen bzw. ein anderes Kommando senden.
Das kannst du dann analog dazu über den Overflow-Interrupt machen -- der wird, wie der Name schon andeutet, ausgeführt, wenn TCNT von 255 wieder auf 0 springt.

Gruß,
Paul!
“With great power come great heat sinks.”
paulwilhelm.de -- mosfetkiller.de
Benutzeravatar

Thread-Ersteller
haxdraht
Grillmeister
Beiträge: 2336
Registriert: Fr 19. Okt 2007, 18:29
Spezialgebiet: E-Motoren, Notstromanlagen
Wohnort: Hamburg
Danksagung erhalten: 19 Mal

Re: Hardware PWM in Software einspeisen?

Beitrag von haxdraht »

Hallo Paul,

ich Versuche dieses Signal aus der PWM zu erzeugen:
[ externes Bild ]

Die Transistoren der gemeinsamen Kathoden hängen dabei direkt am AVR.
Meine Idee war nun abzufragen, wann das PWM Signal von 1 auf 0 wechselt um den jeweils nächsten Transistor anzusteuern.
Benutzeravatar

Thunderbolt
Beiträge: 2905
Registriert: Fr 7. Apr 2006, 14:05
Spezialgebiet: Physik,Elektronik,Blender
Schule/Uni/Arbeit: M.Sc ET, Hardwareentwickler
Wohnort: 65366 Geisenheim (Hessen)
Hat sich bedankt: 1 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Hardware PWM in Software einspeisen?

Beitrag von Thunderbolt »

wie wärs einfach, zwischen die zusammengelegten emmiter und GND noch 'n transistor zu schalten der mit der PWM gefüttert wird ( im prinzip hardware AND aus deiner PWM und deinem MUX signal)?

Wenn du die PWM und dein multiplexing vom selben timer nimmst (mux weiterschalten im COMP_vect oder OVFL_vect) sollte es auch keine probleme mit schwebungen (-> flimmern) geben (sollte es eigentlich eh nicht aber better safe than sorry :P )
Benutzeravatar

Thread-Ersteller
haxdraht
Grillmeister
Beiträge: 2336
Registriert: Fr 19. Okt 2007, 18:29
Spezialgebiet: E-Motoren, Notstromanlagen
Wohnort: Hamburg
Danksagung erhalten: 19 Mal

Re: Hardware PWM in Software einspeisen?

Beitrag von haxdraht »

Hallo,
Interrupts zu benutzen ist mir irgendwie nicht eingefallen.. :aufsmaul:
Ich hab mir jetzt ein Programm mit zwei Interrupts gebastelt:
Die Kathode wird bei overflow von TIMER1 eingeschaltet und bei compare match mit OCR1A ausgeschaltet. Das ist so einfach, dass ich nicht von alleine drauf gekommen bin :facepalm:
Ebenso wird im overflow Interrupt der Index der Kathoden hochgezählt, so dass bei jedem Interrupt die jeweils nächste Kathode eingeschaltet wird.

Hier ein auszug vom Programm:

Code: Alles auswählen

	TCCR1B = (1<<CS10);  
	OCR1A = 5000;	
	TIMSK1 = (1<<OCIE1A)|(1<<TOIE1);

//interrupt routine
ISR (TIMER1_COMPA_vect)	//rücksetzen bei compare match
{
	clear_bit(kathode,kat_index);
	anode=0;
	if (kat_index<3)
	{
		kat_index++;
	}
	else
	{
		kat_index=0;
	}
	
}

ISR (TIMER1_OVF_vect)	//setzen bei overflow
{
	set_bit(kathode,kat_index);
	anode=disp[time[kat_index]];
}

Wahrscheinlich kräuseln sich Paul hier die Fußnägel hoch :hihi:

Mit OCR1A kann ich die Helligkeit der Anzeige verändern.
Die Schaltfrequenz der einzelnen Kathoden ist (wenn ich mich nicht verrechnet habe) 61Hz.
(16Mhz quartz, Vorteiler 1, 16-bit macht 244,14Hz PWM)


Thunderbolt: die Hardwareidee ist auch nicht schlecht. Vielleicht benutze ich sowas beim nächsten mal, da meine Schaltung schon fertig ist.
Benutzeravatar

durchgebrannt
Wiki-Crew
Beiträge: 740
Registriert: Do 28. Jul 2011, 15:03
Spezialgebiet: ARM(besonders Cortex M4), USB
Wohnort: Schwentinental
Danksagung erhalten: 2 Mal

Re: Hardware PWM in Software einspeisen?

Beitrag von durchgebrannt »

Ich würde sagen, dass dies die eleganteste und dementsprechend sinnvollste Variante ist. Zumal beide Interrupts synchron sind und im schlimmsten Fall direkt nach einander (Match, dann Overflow bei großen Werten für das Match Register), was quasi maximale Helligkeit bedeutet, als auch das selbe Prozedere in umgekehrter Reihenfolge, was zu minimaler Helligkeit führt
(Ist an sich nichts Neues^^)
--> wensentlich ist aber, dass du dir durch diese Implementierung keine hässlichen Interrupt-Kollisionen einfangen kannst. Wenn man einen zweiten Timer für die Modulation verwenden würde, wäre das sehr einfach möglich. Dazu aber auch Reccoursenverschwendung.

Gruß Jannis
Antworten