Programowalny driver do LED z wyborem prądu

co i jak zrobiłem...
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Programowalny driver do LED z wyborem prądu

Post autor: connan12345 »

Dzień dobry!
Też mnie zachwyciły światełka. Myślę nad konstrukcją uniwersalnego driverka do 10W do latarek LED. Z racji tego że moje hobby związane z wodą (a ściślej z podwodą) to pomyślałem sobie o pod świeceniu sobie tam gdzie już się robi ciemno. Napisałem program na podstawie znalezionego kodu w C++ na elektrodzie , a że kombinuję w BASCOMie to przełożyłem , myślę poprawnie. Jak nie to poprawcie , dzięki.

Kod: Zaznacz cały

Dim Chose As Byte , Pwm As Byte , Ocr As Byte
Dim Current As Word , Adcw As Word , Rej As Word
Dim K1 As Word , K2 As Word , Tryb As Byte
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Prescale = 8
Config Adc = Single , Prescaler = Auto , Reference = Internal
Declare Sub Popraw
'CURRENT=151; //ustaw wartośc prądu na 1000mA
'CURRENT=105; //ustaw wartośc prądu na 700mA
'CURRENT=52; //ustaw wartośc prądu na 350mA
Pwm = 0
Current = 52 'na sztywno ale można zmienić
Ocr = 28
Enable Interrupts

Do
Adcw = Getadc(1)
'Current = Getadc(3) 'można do ustawienia prądu zastosować ADC podłączony do rezystora nastawnego "rozpiętego" między Vcc a GND - jakieś 10K a ślizgacz na ADC
Rej = Current - Adcw

If Rej > 0 Then
 Pwm = Sqr(rej)
 Ocr = Ocr + Pwm
Else
 Pwm = Sqr(rej)
 Ocr = Ocr - Pwm
End If
Ocr0a = Ocr
Loop
Kolega Flagiusz na swojej stronie zaproponował ciekawą koncepcję. Zastanawia mnie czemu nie użyje mosfetu typu P (plus tranzystor npn jego sterowania) ? Obrazek
Schemat to w sumie nic odkrywczego , bo z piątej nóżki do bramki mosfetu N a druga nóżka do węzła między rezystorem a diodą (pomiar spadku napięcia).
Załączniki
podstawa_led_tiny13A_1000mA.zip
(576 Bajtów) Pobrany 32 razy
podstawa_led_tiny13A_700mA.zip
(576 Bajtów) Pobrany 9 razy
podstawa_led_tiny13A_350mA.zip
(576 Bajtów) Pobrany 4 razy
Ostatnio zmieniony czwartek 19 gru 2013, 21:31 przez connan12345, łącznie zmieniany 1 raz.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Kolega df, był świadom minusów tego rozwiązania, i zostało zarzucone, gdyż regulowana była tylko wartość średnia prądu, bez możliwości ograniczenia wielkości poszczególnych pików.
Nie został wybrany mosfet typu "P" gdyż bardzo ciężko jest znaleźć typ spełniający wyśrubowane wymagania jakie stawia sterownik.
Co do programu, to staraj się unikać operacji arytmetycznych wyższego rzędu, gdyż powodują wygenerowanie długiego kodu.

Kod: Zaznacz cały

można do ustawienia prądu zastosować ADC podłączony do rezystora nastawnego "rozpiętego" między Vcc a GND - jakieś 10K
W ten sposób nie zmierzysz prądu.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Post autor: connan12345 »

Ano fakt . Chodziło mi by móc ustawić CURRENT.
Pyra pisze:Co do programu, to staraj się unikać operacji arytmetycznych wyższego rzędu, gdyż powodują wygenerowanie długiego kodu.
No właśnie w drugą stronę . Im krótszy kod tym lepiej to działa.
Zamiast :

Kod: Zaznacz cały

if(rej>50)PWM=6;  //szybkośc zmian współczynnika PWM zależna od różnicy prądu zaprogramowanego a wyjściowego
   else if(rej>20)PWM=5;
   else if(rej>10)PWM=4;
   else if(rej>5)PWM=3;
   else if(rej>2)PWM=2;
   else if(rej>0)PWM=1;
   else if&#40;rej<-50&#41;PWM=-10;
   else if&#40;rej<-20&#41;PWM=-7;
   else if&#40;rej<-10&#41;PWM=-4;
   else if&#40;rej<-5&#41;PWM=-3;
   else if&#40;rej<-2&#41;PWM=-2;
   else if&#40;rej<0&#41;PWM=-1;
wolałem dać :

Kod: Zaznacz cały

If Rej > 0 Then
 Pwm = Sqr&#40;rej&#41;
 Ocr = Ocr + Pwm
Else
 Pwm = Sqr&#40;rej&#41;
 Ocr = Ocr - Pwm
End If
I dlatego mam 37% zajętości pamięci a nie ponad 50%.
Poza tym dzięki funkcji pierwiastka dokonuje się konwersja niejako z word na byte :) a tu PWM mogę mieć 0-255. Inaczej musiałbym zrobić to na Select Case - End Select i do tego zrobić Format lub Fusing. A to by znacząco kod wydłużyło. Czyli lepiej zastosować np BD140 by było w/g pomysłu Flagiusza ?
Ostatnio zmieniony czwartek 19 gru 2013, 21:19 przez connan12345, łącznie zmieniany 2 razy.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
connan12345 pisze:Ano fakt . Chodziło mi nie Vcc a napięcie na diodzie z rezystorem do masy GND
A ten pomysł to już będzie tragiczny w swoich skutkach. LED jest elementem nieliniowym i Vf zależy w znacznym stopniu od temperatury złącza, cały problem polega na tym, że współczynnik, jest ujemny, tzn, im wyższa temperatura, tym opór zastępczy LEDa jest mniejszy, a co za tym idzie prąd wzrasta.
Krótko mówiąc, nie da się określić prądu diody, znając tylko napięcie przewodzenia.
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Post autor: connan12345 »

Chyba się nie rozumiemy :) ? Ja nie chcę mosfetem sterować diody tylko by uP sterował mosfetem P-ch za pomocą tranzystora np MMBT3904 plus dwa oporniki (które trzeba dobrać). Co do pomiaru z drugiego ADC to byłoby po to by niejako "ręcznie" ustawić porównanie ,czyli wartość CURRENT z ADCW , a nie na diodzie :)
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
No właśnie, możesz to jakoś rozrysować, bo chyba nie łapię istoty...
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Post autor: connan12345 »

No chodzi o coś takiego :
Obrazek
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

Między nóżkę 2 a 8 wstaw 47k, bo powyżej 1,1V (czyli w 56% zakresu potencjometru) i tak ADC będzie zwracał maksimum (1023).
--
pozdrawiam,
Jarek Andrzejewski
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Post autor: connan12345 »

Czyli że zamiast 10K wstawić 47K ?
Te 10K dałem tak "na oko" . Bo takie mam jak daję do kontrastu LCD HD44780 :) Dla tych co ściągają spakowanego hex-a powiem że schematem jest przetwornica z mosfetem typu N i opornikiem 0.15 OHma także jeśli zastosuje się inny rezystor to CURRENT jest do zmiany. Te wartości co w programie zostały dane nie przeze mnie. Zalecam ostrożność.
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

Tak, bo w obecnym układzie potencjometrem możesz ustawić 0-2,55V, a ADC mierzy w zakresie 0-1,1V.
--
pozdrawiam,
Jarek Andrzejewski
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Post autor: connan12345 »

Myślałem że od 0 do Vcc. Hmm... :neutral:
ptja
Posty: 2414
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

connan12345 pisze:Myślałem że od 0 do Vcc. Hmm... :neutral:
Fakt, Vcc też może być jako Vref.
Ja używam 1,1V gdy zasilanie bezpośrednio z Li-ion (bo Vcc się zmienia).
--
pozdrawiam,
Jarek Andrzejewski
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Post autor: connan12345 »

Z tego co pamiętam to jest od 0 do Vcc z podziałką Vref/1023 a tu Vref =1.1V . No mam nawet pare zrobionych układów pomiarowych na Atmega8 i Atmega 32 i tam jest do Vcc tylko że podziałka inna bo chyba Vref to 2.56V. Tu w Atiny chyba lepsza bo Vref =1.1V czyli dokładniejsze odwzorowanie.
Świetnie opisany driverek jest tu
Teraz patrzę i stwierdzam że program na pierwszym poście w temacie ma braki w postaci :

Kod: Zaznacz cały

$regfile = "attiny13.dat"
$crystal = 9600000
Ddrb = &B11110001 &#58; Portb = &B00001110

$hwstack = 8
$swstack = 8
$framesize = 8
I to trzeba na sam pierw dać.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Ten schemat to klasyczna przetwornica step down, w związku z tym mam kilka uwag. Napięcie zasilania podajesz 9V podczas gdy chcesz zasilać trzy diody w szeregu, czyli już przy prądzie 350mA może to być ponad 9V, dodatkowo spadek napięcia na rezystorze pomiarowym.
Teoretycznie można przyjąć Vcc jako Vref, ale w tym przypadku nie będzie ono stabilne, gdyż pojedyncza dioda zenera w zmiennych warunkach pracy nie zapewni stabilnego napięcia zasilania. Trochę sytuacja uległa by poprawie, gdybyś zastosować klasyczny stabilizator w obudowie SOT23, bo jak myślę chodzi o miniaturyzację. Dodatkowo, wszystko musi byc odprzęgnięte kondensatorami.
Dodatkowo, Vref 1,1V jest dość stabilne i umożliwia zmniejszenie rezystancji opornika pomiarowego, gdyż wystarczą mniejsze spadki napięcia.
W programie stosujesz sterowanie parametryczne, niby poprawne, ale w praktyce wystarczy zwykłe Decrese PWM, lub Increse PWM (szybsze i krótsze od PWM + 1 i -1). Jak się domyślam, będziesz stosował najwyższą możliwą częstotliwość PWM, aby zminiaturyzować rozmiar cewki i kondensatora, to 8 czy 9,6MHz zapewnia bardzo szybką reakcję na zmianę parametrów obciążenia.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
connan12345
Posty: 10
Rejestracja: wtorek 17 gru 2013, 21:04
Lokalizacja: Oświęcim

Post autor: connan12345 »

Kolega ma żelowy 12V akumulator więc spadek do 9 V zapewne będzie na koniec świecenia. Co do stabilizatora to Jarek proponuje mi zastosowanie 78L05 ale jak na złość nie potrafię go znaleźć natomiast 1117-5.0 mam kilka sztuk. Z racji że to będzie zasilone do 15V (uwaga Jarka) to ten 1117 się nada.
Dla 1.1V odniesienia Reference = Internal , tu bezsprzecznie racja. Napięcie 5V mi będzie potrzebne by otwierać w pełni dren mosfet , choć oczywiście w przypadku innego zasilenia , niższego np dwa ogniwa z laptopa Litowo-Jonowego (czyli około 6V) pokusiłbym się o obniżenie do 3.3V zasilania uP oraz mosfeta otwierającego się przy powiedzmy 2.5V APM2509N (N-ch) i tu inny typ przetwornicy niż StepDown.
Co mi jeszcze chodzi to dławik z 4 uzwojeniami . Jedno jakby pierwotne uzwojenie , gałąź z rezystorem tak jak na schemacie tylko bez diod. A 3 uzwojenia wtórne bezpośrednio na diody/diodę (łączyłoby się początki z końcami uzyskując kombinację potrzebną do zasilenie jednej 10W lub trzech 3W diod).
ODPOWIEDZ