Przeróbka driverka AK-47
: sobota 16 sty 2010, 17:42
Witam
Jakiś czas temu, dzięki Calineczce , wpadł w moje łapki driverek o oznaczeniu AK-47, czyli popularny SKU6190.
W temacie Nowe wcielenie , podjęliśmy z Darkiem dyskusję na temat rozdzielenia sterowania LEDem przez dwa niezależne systemy AMC 350mA i 700mA. W związku z tym, że moja wiedza programistyczna nie wystarcza do odpowiedniego ograniczenia prądu PWM, tak więc postanowiłem zrobić to sprzętowo. Wygląda to tak, że w niższych trybach jest sterowany PWM tylko jeden AMC czyli LED dostaje 350mA, w wyższych trybach, LED może dostawać 700mA i na końcu 1050mA.
Pozostawiony jeszcze został jeden tryb "mrygacza" ale prąd został mu ograniczony do 700mA.
Podwaliny pod nowe rozwiązanie zostały położne rozwiązaniem z tematu Nowe spojrzenie czyli tryby w górę i w dół. Tu już była prosta droga do realizacji kontroli napięcia na akumulatorze.
Został opracowany następujący schemat:
Kiedy napięcie spadnie poniżej progu 3V (dokładnie 2,95V), automatycznie zostaje obniżony tryb na ciemniejszy. Kiedy i to będzie za mało, sytuacja się powtórzy, aż do momentu zejścia do najniższego trybu.
Kiedy jednak i tutaj dojdziemy do granicy napięcia, LED zacznie mrygać.
W projekcie jest jeszcze samoczynne wyłączenie latarki, ale myślę, że użytkownik, któremu latarka zacznie tak wołać o "papu" powinien sam zareagować, choć mogę się mylić . Jest jeszcze do rozwiązania sprawa długości kodu, niestety zbliżyłem się niebezpiecznie do 1kB.
Driverek dysponuje czterema trybami ciągłymi i jednym ostrzegawczym mrygaczem.
Niestety założenia projektowe i kłopoty w trakcie testów doprowadziły do konieczności wykonania kilku drobnych zmian w oryginalnym układzie.
Oto poprawiony schemat połączeń, który teraz wygląda tak:
a tu dla porównania oryginalny układ połączeń:
.
Procesorek ATtiny13V otrzymał nowe oprogramowanie, które to poniżej zamieszczam.
Jest to co prawda jeszcze wersja robocza, ale w pełni funkcjonalna, zmiany wymaga jedynie wartość wzorcowa do porównania minimalnej wartości napięcia.
Oto kod źródłowy napisany w BASCOM AVR
'ATtiny 13V 9,6MHz divide 8
'ADC1 pomiar napięcia zasilania (Uz - 0,6)/4
'PB0 - OC0A drugi kanał PWM 2 x AMC
'PB1 - OC0B pierwszy kanał PWM 1 x AMC
'PB3 - we klik
Dim B As Byte 'licznik klików
Dim C As Byte 'zmienna pomocnicza
Dim L As Byte 'wskaźnik trybu
Dim T As Eram Byte 'pamięć trybu
Dim U1 As Word 'zmierzone napięcie ogniwa, napięcie średnie
Dim U As Word 'suma 8 pomiarów
Config Pinb.0 = Output 'wy PWMA 700mA
Config Pinb.1 = Output 'wy PWMB 350mA
Config Pinb.2 = Input 'we ADC
Config Pinb.3 = Input 'we sterujące
L = T 'odczyt trybu startowego
Goto Wlacz 'ustalenie wartości PWM
Pwm:
Config Adc = Single , Prescaler = 8 , Reference = Internal 'konfig przetwornika
Gosub Nap 'pierwszy pomiar = szmelc
U = 0
For C = 1 To 7
Gosub Nap
U = U + U1
Next C
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1 'konfig PWM, start pwm
Pocz:
Do
For C = 1 To 200 'pętla odczekująca na zapis trybu po zmianie
Gosub Klik
Waitms 4
Gosub Napiecie 'sprawdzanie napięcia aku
Powrot:
Next C
If T <> L Then Goto Pamiec 'zapis trybu do eprom jeśli się zmienił
Loop
Zmiana: 'rozpoznanie klików
B = 0 'zerowanie licznika klików
Stop Adc 'zatrzymanie przetwornika ADC, redukcja prądu
Zegar: 'pomiar czasu klika
For C = 1 To 100
If Pinb.3 = 1 Then Goto Pomiar
Waitms 1
Next C
Kierunek:
If B = 1 Then Goto Plus
If B = 2 Then Goto Minus
Goto Pwm
Plus: 'tryb w górę
Incr L
Goto Wlacz
Minus: 'tryb w dół
Decr L
Wlacz: 'ustalenie wartości pwm dla trybu
If L > 5 Then L = 1
If L < 1 Then L = 5 'sprawdzanie zakresu trybów
If L = 1 Then Goto Tryb1 'skok do podprogramu trybu
If L = 2 Then Goto Tryb2
If L = 3 Then Goto Tryb3
If L = 4 Then Goto Tryb4
If L = 5 Then Goto Migacz
Goto Pwm
Pamiec: ' zapamiętanie aktualnego trybu
T = L
Mryg:
Config Timer0 = Timer 'potwierdzenie zapamiętania
Reset Portb.0
Reset Portb.1
Waitms 10
Goto Pwm
Pomiar: 'sprawdzanie min czsu przerwy
If C < 10 Then Goto Pwm
B = B + 1
Waitms 4
For C = 1 To 50
If Pinb.3 = 0 Then Goto Zegar 'oczekiwanie na kolejny klik
Waitms 1
Next C
Goto Kierunek
Tryb1:
Pwm0a = 0
Pwm0b = 1
Goto Pwm
Tryb2:
Pwm0a = 0
Pwm0b = 40
Goto Pwm
Tryb3:
Pwm0a = 2
Pwm0b = 255
Goto Pwm
Tryb4:
Pwm0a = 255
Pwm0b = 254
Goto Pwm
Migacz:
Config Timer0 = Timer
Reset Portb.1
Do
Set Portb.0
For C = 1 To 5 'czas załączenia
Gosub Klik
Gosub Napiecie
Waitms 1
Next C
Reset Portb.0
For C = 1 To 50 'czas przerwy
Gosub Klik
Waitms 1
Next C
Loop
Napiecie: 'pomiar napięcia baterii
Gosub Nap
U = U + U1 'uzupełnienie 8 pomiaru
U1 = U
Shift U1 , Right , 3 'wylicznie średniej wartości, dzielenie przez 8
U = U - U1 'odjęcie średniej wartości
If U1 < 505 Then Goto Dol ' sprawdzanie min napięcia aku (tu dzielnik 10k /3k)
Return
Dol:
If L > 1 Then Goto Minus 'obniżenie trybu jeśli większy niż 1
Goto Mryg 'mruganie co 8 s, jeśli tryb już jest 1
Nap:
U1 = Getadc(1) 'pomiar napięcia aku
Return
Klik:
If Pinb.3 = 0 Then Goto Zmiana 'sprawdzenie stanu pinb3
Return
End
A na koniec zdjęcie prototypu używanego przy testach oprogramowania:
Pozdrawiam
PS: Jako, że trochę przy tym posiedziałem, nie zezwalam na użycie całości oraz fragmentów kodu w celach komercyjnych!
Wykorzystanie w celach hobbystycznych jest dozwolone w każdej formie.
Jakiś czas temu, dzięki Calineczce , wpadł w moje łapki driverek o oznaczeniu AK-47, czyli popularny SKU6190.
W temacie Nowe wcielenie , podjęliśmy z Darkiem dyskusję na temat rozdzielenia sterowania LEDem przez dwa niezależne systemy AMC 350mA i 700mA. W związku z tym, że moja wiedza programistyczna nie wystarcza do odpowiedniego ograniczenia prądu PWM, tak więc postanowiłem zrobić to sprzętowo. Wygląda to tak, że w niższych trybach jest sterowany PWM tylko jeden AMC czyli LED dostaje 350mA, w wyższych trybach, LED może dostawać 700mA i na końcu 1050mA.
Pozostawiony jeszcze został jeden tryb "mrygacza" ale prąd został mu ograniczony do 700mA.
Podwaliny pod nowe rozwiązanie zostały położne rozwiązaniem z tematu Nowe spojrzenie czyli tryby w górę i w dół. Tu już była prosta droga do realizacji kontroli napięcia na akumulatorze.
Został opracowany następujący schemat:
Kiedy napięcie spadnie poniżej progu 3V (dokładnie 2,95V), automatycznie zostaje obniżony tryb na ciemniejszy. Kiedy i to będzie za mało, sytuacja się powtórzy, aż do momentu zejścia do najniższego trybu.
Kiedy jednak i tutaj dojdziemy do granicy napięcia, LED zacznie mrygać.
W projekcie jest jeszcze samoczynne wyłączenie latarki, ale myślę, że użytkownik, któremu latarka zacznie tak wołać o "papu" powinien sam zareagować, choć mogę się mylić . Jest jeszcze do rozwiązania sprawa długości kodu, niestety zbliżyłem się niebezpiecznie do 1kB.
Driverek dysponuje czterema trybami ciągłymi i jednym ostrzegawczym mrygaczem.
Niestety założenia projektowe i kłopoty w trakcie testów doprowadziły do konieczności wykonania kilku drobnych zmian w oryginalnym układzie.
Oto poprawiony schemat połączeń, który teraz wygląda tak:
a tu dla porównania oryginalny układ połączeń:
.
Procesorek ATtiny13V otrzymał nowe oprogramowanie, które to poniżej zamieszczam.
Jest to co prawda jeszcze wersja robocza, ale w pełni funkcjonalna, zmiany wymaga jedynie wartość wzorcowa do porównania minimalnej wartości napięcia.
Oto kod źródłowy napisany w BASCOM AVR
'ATtiny 13V 9,6MHz divide 8
'ADC1 pomiar napięcia zasilania (Uz - 0,6)/4
'PB0 - OC0A drugi kanał PWM 2 x AMC
'PB1 - OC0B pierwszy kanał PWM 1 x AMC
'PB3 - we klik
Dim B As Byte 'licznik klików
Dim C As Byte 'zmienna pomocnicza
Dim L As Byte 'wskaźnik trybu
Dim T As Eram Byte 'pamięć trybu
Dim U1 As Word 'zmierzone napięcie ogniwa, napięcie średnie
Dim U As Word 'suma 8 pomiarów
Config Pinb.0 = Output 'wy PWMA 700mA
Config Pinb.1 = Output 'wy PWMB 350mA
Config Pinb.2 = Input 'we ADC
Config Pinb.3 = Input 'we sterujące
L = T 'odczyt trybu startowego
Goto Wlacz 'ustalenie wartości PWM
Pwm:
Config Adc = Single , Prescaler = 8 , Reference = Internal 'konfig przetwornika
Gosub Nap 'pierwszy pomiar = szmelc
U = 0
For C = 1 To 7
Gosub Nap
U = U + U1
Next C
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1 'konfig PWM, start pwm
Pocz:
Do
For C = 1 To 200 'pętla odczekująca na zapis trybu po zmianie
Gosub Klik
Waitms 4
Gosub Napiecie 'sprawdzanie napięcia aku
Powrot:
Next C
If T <> L Then Goto Pamiec 'zapis trybu do eprom jeśli się zmienił
Loop
Zmiana: 'rozpoznanie klików
B = 0 'zerowanie licznika klików
Stop Adc 'zatrzymanie przetwornika ADC, redukcja prądu
Zegar: 'pomiar czasu klika
For C = 1 To 100
If Pinb.3 = 1 Then Goto Pomiar
Waitms 1
Next C
Kierunek:
If B = 1 Then Goto Plus
If B = 2 Then Goto Minus
Goto Pwm
Plus: 'tryb w górę
Incr L
Goto Wlacz
Minus: 'tryb w dół
Decr L
Wlacz: 'ustalenie wartości pwm dla trybu
If L > 5 Then L = 1
If L < 1 Then L = 5 'sprawdzanie zakresu trybów
If L = 1 Then Goto Tryb1 'skok do podprogramu trybu
If L = 2 Then Goto Tryb2
If L = 3 Then Goto Tryb3
If L = 4 Then Goto Tryb4
If L = 5 Then Goto Migacz
Goto Pwm
Pamiec: ' zapamiętanie aktualnego trybu
T = L
Mryg:
Config Timer0 = Timer 'potwierdzenie zapamiętania
Reset Portb.0
Reset Portb.1
Waitms 10
Goto Pwm
Pomiar: 'sprawdzanie min czsu przerwy
If C < 10 Then Goto Pwm
B = B + 1
Waitms 4
For C = 1 To 50
If Pinb.3 = 0 Then Goto Zegar 'oczekiwanie na kolejny klik
Waitms 1
Next C
Goto Kierunek
Tryb1:
Pwm0a = 0
Pwm0b = 1
Goto Pwm
Tryb2:
Pwm0a = 0
Pwm0b = 40
Goto Pwm
Tryb3:
Pwm0a = 2
Pwm0b = 255
Goto Pwm
Tryb4:
Pwm0a = 255
Pwm0b = 254
Goto Pwm
Migacz:
Config Timer0 = Timer
Reset Portb.1
Do
Set Portb.0
For C = 1 To 5 'czas załączenia
Gosub Klik
Gosub Napiecie
Waitms 1
Next C
Reset Portb.0
For C = 1 To 50 'czas przerwy
Gosub Klik
Waitms 1
Next C
Loop
Napiecie: 'pomiar napięcia baterii
Gosub Nap
U = U + U1 'uzupełnienie 8 pomiaru
U1 = U
Shift U1 , Right , 3 'wylicznie średniej wartości, dzielenie przez 8
U = U - U1 'odjęcie średniej wartości
If U1 < 505 Then Goto Dol ' sprawdzanie min napięcia aku (tu dzielnik 10k /3k)
Return
Dol:
If L > 1 Then Goto Minus 'obniżenie trybu jeśli większy niż 1
Goto Mryg 'mruganie co 8 s, jeśli tryb już jest 1
Nap:
U1 = Getadc(1) 'pomiar napięcia aku
Return
Klik:
If Pinb.3 = 0 Then Goto Zmiana 'sprawdzenie stanu pinb3
Return
End
A na koniec zdjęcie prototypu używanego przy testach oprogramowania:
Pozdrawiam
PS: Jako, że trochę przy tym posiedziałem, nie zezwalam na użycie całości oraz fragmentów kodu w celach komercyjnych!
Wykorzystanie w celach hobbystycznych jest dozwolone w każdej formie.