Nadat ik afgelopen week al de bestelde onderdeeltjes binnen kreeg, ben ik gisteren weer eens verder gegaan met m'n LED-spotjes en de ZXLD1350.
Na alles aangesloten te hebben, werkte het natuurlijk totaal niet zoals verwacht. Ik heb de microcontroller aangesloten via een BC547 met een 1k weerstandje tussen de microcontroller en de basis. Het spotje brandt wel, maar dimt totaal niet zoals ik de microcontroller geprogrammeerd heb. Zelfs zonder microcontroller en de ADJ-pin los, brandde het spotje niet op vol vermogen.
Nu kwam ik er dus achter dat ik een totaal verkeerde weerstand voor Rs heb gebruikt van 3,3ohm ipv 0,33ohm. Dit zou al een en ander kunnen verklaren natuurlijk.
Vandaag maar een paar 0,33ohm weerstanden gaan halen en ik heb er inmiddels eentje tussen zitten. De maximale output is nu wel een stukje hoger, maar het dimmen door middel van de microcontroller werkt nog steeds niet zoals ik zou willen.
Volgens deze formule
I
out = (0.1* D
pwm) / R
s
zou het gewoon moeten werken, lijkt me.
Ik heb de PWM-frequentie berekend door fclk_I/O / (prescaler * 510): 3686400 / (8*510) = 903,5Hz.
Dit ligt mooi tussen de aanbevolen frequenties volgens:
An upper limit of 1kHz is suggested. The effect of audible noise in the inductor may need to be
considered. This may happen in some inductors with loose windings and will be more noticeable
at PWM frequencies of 1kHz than 100Hz.
If the PWM frequency is less than approximately 500Hz, the device will be gated 'on' and 'off' and
the output will be discontinuous, with an average value of output current given by:
Volgens de eerste formule moet de duty cycle tussen 0 en 1 liggen. Ik neem aan dat dat overeenkomt met de schakelwaarde van m'n PWM-instellingen die tussen 0 en 255 liggen?
Als PWM-mode heb ik nu 'Phase Correct' ingesteld, waarbij ik dus de waarde van OCR1A in stapjes verander van 1 tot 255:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| #define F_CPU 3686400
#include <avr/io.h>
#include <avr/delay.h>
void PWM_Init()
{
DDRB = (1 << DDB1) | (1 << DDB2) | (1 << DDB3);
TCNT1 = 0x00;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM12) | (1 << WGM10);
TCCR1B = (1 << CS10);
TCCR2 = (1 << COM21) | (1 << WGM20) | (1 << CS21);
}
/*************************************************************************
Main
**************************************************************************/
int main()
{
PWM_Init();
int r=0;
while (true)
{
r++;
if (r > 255)
{
r=0;
}
OCR1A = 255-r;
_delay_ms(10);
}
} |
Tijdens het eerste deel van het programma, brandt de LED ook helemaal niet. Waar kan dat door komen?
En wat kan er nu nog meer mis zijn?
Ik heb het geheel aangesloten volgens deze twee schemaatjes:
Het valt me overigens ook op dat wanneer ik de LED feller maak, ik wat 'dender' zie in het licht. Het wordt feller, zakt weer een klein beetje in en wordt weer wat feller. Waar kan dit door komen? Is dat de chip die zichzelf corrigeert? Het is namelijk een vervelend 'effect'.
[
Voor 6% gewijzigd door
maikel op 29-08-2012 20:09
]