Beste mensen,

Ik probeer softwarematig te PWM-en op een AVR microcontroller. Ik gebruik een 8bit helderheidsinstelling. Mijn globale idee hiervoor is als volgt:

br = helderheid
Loop continu:
Doe 'aan'-loop br aantal keer
Doe 'uit'-loop 256-br aantal keer

Is de helderheid dan 0, dan wordt alleen de uit-loop gerunned en is de led dus uit. Dit werkt, maar het probleem is dat er vanaf helderheidsniveau br=40 niet te zien is dat de led nog helderder wordt voor hogere br. De led wordt dan niet helderder. De hogere br waardes zijn dus eigenlijk zinloos.

Ligt dit aan mij, doe ik iets principieel fout, of is het zo omdat de led niet zo snel uit kan doven oid?

Mijn assembly is als volgt:

PWM_MAIN:
	; br = brightness

	ldi  r16, br			; r16 = brightness
	nop
	PWM_ON:
	tst  r16				; r16 = 0?
	breq PWM_ON_RDY			; yes, on state is done
	out  PORTC, r1
	dec  r16
	rjmp PWM_ON	
	PWM_ON_RDY:

	ser  r16
	subi r16, br			; r16 = 256-brightness
	PWM_OFF:
	tst  r16				; r16 = 0?
	breq PWM_OFF_RDY		; yes, off-state is done
	out  PORTC, r0
	dec  r16				; r16-1
	rjmp PWM_OFF
	PWM_OFF_RDY:

rjmp PWM_MAIN

Alvast bedankt voor het meedenken.

Groeten,
Simon

edit: topic misschien iets te snel geplaatst.. Ik kan natuurlijk mijn code vergelijken met een normaal gePWM-ed ledje en dan kijken of er verschil is..

De fout ligt niet bij jouw software, maar bij de LED en bij het menselijk oog.
Knoop maar eens een High-Efficiency LED via een weerstand aan een labvoeding. Bij kleine stromen (0 ... 5mA) is een duidelijk verschil in helderheid te merken. Ga je hoger (5 ... 10mA), dan merk je er minder en minder van. En boven 10mA merk je er helemaal niets meer van.
Ook het omgevingslicht speelt een rol.

Ok bedankt pros voor je antwoord!

Ik had 't moeten weten ;) Veel dingen in de natuur werken logaritmisch. Met gehoor is dit zo, waarschijnlijk dan ook met zicht.

Nu een slim stukje code verzinnen wat hier rekening mee houdt :P

Hang er maar eens een scoop aan, dan zie precies wat er gebeurd. Een scoop is veel representatiever dan een led en het blote oog.

Mja, niet aanwezig hier :) Kan het morgen wel doen, maar ik geloof het nu eigenlijk wel.

Het gaat om het effect en nu zal ik het zo om moeten bouwen dat het op de een of andere manier vloeiend voor het oog lijkt te gaan.

Ik had hier precies hetzelfde resultaat. Ik gebruikte een een timer van 0 tot 255. Maar bij 15 zag ik al haast geen verschil meer.

Later er een motor driver de L298 aan gehangen en dan zie je dat de motor er wel heel mooi mee te regelen is.

Het ligt wel heel erg veel aan het type LED heb ik gemerkt. Sommige leds zijn tot niveau 50 wel te onderscheiden.

Het logaritmische gedoe waar ik het over had, laat ik er dus ook uit. Ik ga er RGBleds mee aansturen en het mengen van de kleuren zal dan maar een beetje trial and error worden.

Je kan toch gewoon de pulstijd verdubbelen, telkens je een stapje hoger gaat? Dus, op een mogelijke reeks van 0 tot 255: 1, 2, 4, 8, 16, enz...
Daarnaast helpt het ook, als je de serieweerstand niet te klein neemt. Dat die gekozen moet worden in functie van de LED, spreekt voor zich. Ik heb hier nog ergens blauwe LED's liggen, die al flink oplichten bij een stroom van 2mA (nee, geen nulletje vergeten).

Ja dat kan uiteraard, maar niet voor het doeleinde wat ik voor ogen heb. (zal je ooit nog wel te zien krijgen ;))