Drugi prototyp to wersja 2.2 rozszerzona o pomiar i regulację temperatury (z możliwością wyłączenia w konfiguracji).
Rozwiązanie to z założenia miało być proste, nie wymagające dużej ilości zmian w sprzęcie (dodatkowe elementy, zmiany połączeń), nie utrudniające pracy użytkownikowi, a przede wszystkim skuteczne.
Z uwagi na problemy z dokładnością pomiaru przy PWM metodą na Vf (więcej
tutaj) zdecydowałem się na pomiar przy pomocy termistora. Pomiar bezpośredni temperatury na podstawie Vf jest jak najbardziej możliwy, ale wymaga dalszych badań i precyzyjnych obliczeń (np. w celu sekwencyjnego próbkowania wartości dokładnie w aktywnych fazach PWM-a) i z całą pewnością będzie przedmiotem dalszych moich analiz.
Pomiar temperatury:
Podobnie jak napięcie akumulatora pomiar temperatury odbywa się przy pomocy przetwornika ADC na jednym z wolnych kanałów multipleksera.
By ograniczyć liczbę zewnętrznych elementów do niezbędnego minimum wpadłem na pomysł dość nietypowego rozwiązania - a mianowicie pomiar napięcia realizowany jest
na porcie ze skonfigurowanym pull-up`em.
Dzięki temu mamy podciągnięcie do Vcc wewnętrznym rezystorem rzędu 40k wyprowadzenia, między którym, a masą znajduje się sam termistor.
Początkowo wykorzystałem termistor NTC o Ta=10k@25*C i B w okolicy 2500, tak by w całym istotnym zakresie temperatur (20-120*C) zmieścić się w "wysokim" zakresie odczytów ADC (tuż pod 1,1V dla Vref) zapewniającym wysoką dokładność pomiaru.
Po serii testów rozwiązanie to okazało się niezbyt precyzyjne, gdyż na wynik pomiaru ma wpływ napięcie zasilania, a więc stan ogniwa.
I choć mając realizowany naprzemiennie z pomiarem temperatury pomiar napięcia można było zastosować programową kompensację, znalazłem inne znacznie lepsze rozwiązanie - zmiana napięcia referencyjnego z Vref na Vcc.
W ten oto prosty sposób uniezależniłem dzielnik napięciowy jaki tworzy Rwewn.portu(40k) i termistor od napięcia zasilania
Dla większej dokładności pomiaru w takim układzie korzystniej będzie zastosować NTC o Ta=33k-100k.
ATtiny ma 1-en przetwornik ADC, więc pomiar wartości analogowych odbywa się za pośrednictwem wbudowanego multipleksera analogowego naprzemiennie - raz temperatura, raz napięcie akku.
Ponieważ przełączane są nie tylko porty, ale i napięcia referencyjne pomiar realizowany jest synchronicznie do timera (robiącego PWM) z zachowaniem dużego marginesu czasu na przełaczanie i ustalanie się napięć.
Dodatkowo tak samo jak przy pomiarze napięcia, odczyty temperatury reazlizowane są w seriach, z których wartość końcowa jest uśredniana.
Podnosi to istotnie dokładność pomiaru i uodparnia układ na zewnętrzne zakłócenia.
Regulacja:
Sterownik analizuje temperaturę względem 2 ustalonych progów:
Ta - wartości akceptowalnej, która nie powinna być przekraczana
Tk - wartości krytycznej, powyżej której zasilanie sterownika powinno być natychmiast odcięte
Przekroczenie progowej wartości Ta powoduje płynne zmniejszenie prądu idącego w LED-a/LED-y.
Z uwagi na sporą bezwładność temperaturową (dla automatyków: odpowiedź impulsowa o charakterze całkującym) stała czasowa dla zmiany prądu przyjęta została na poziomie ok. 0,4% / sek.
Dzięki temu proces regulacji następuje stopniowo i płynnie podążając za bezwładnością termiczną układu w sposób niezauważalny dla oka ludzkiego.
Logika sterowania jest prosta:
- jeżeli Temp < Ta - to w LED idzie tyle ile ma iść
- jeżeli Ta < Temp < Tk - to sterownik stopniowo zmniejsza prąd
- jeżeli Temp < Ta i prąd jest poniżej wartości planowanej (został ograniczony) - to sterownik stopniowo zwiększa prąd aż do założonej wartości
- jeżeli Temp > Tk - to sterownik natychmiast się wyłącza (analogicznie do zejścia napięcia zasilania poniżej 2,8V)
Sygnalizacja:
Informacja o przekroczeniu progu temperatury Ta i zadziałaniu ograniczenia wyprowadzona jest na jedno z wyjść cyfrowych, do którego można podłączyć sygnalizacyjną diodę LED.
Uznałem, że nie ma sensu w tym przypadku migać LED`em głównym, gdyż monitorowanie temperatury z założenia ma mieć charakter zabezpieczenia jako element bezpieczeństwa i nie ma konieczności dodatkowego informowania o tym użytkownika.
Kalibracja:
Długo zastanawiałem się jak skutecznie zrealizować możliwość dobierania temperatury progowej Ta przez użytkownika bez konieczności zaszywania sztywnych progów w kodzie programu zwłaszcza, że miejsce pomiaru będzie obarczone gradientem, jak również i termistory mają różne parametry (wsp.temperaturowy - B) i o ile w 25*C ich rozrzut nie jest za duży o tyle w okolicach 80-90*C ich rozbieżność będzie już znaczna.
Postanowiłem więc dodać w konfiguracji sterownika opcję kalibracji, po której wyborze sterownik dokona odczytu bieżącej temperatury i zapiszę ją do pamięci jako wartość progową Ta.
A zatem kalibracja niezależnie od typu zastosowanego termistora oraz miejsca pomiaru (na diodzie, na MCPCB, pod pigułą itd.) polegałaby na rozgrzaniu latarki do indywidualnie akceptowalnej temperatury i dokonaniu zapisu przez sterownik odpowiadającej temperaturze tej wartości.
Natomiast wartość progu Tk może być już obliczana automatycznie np. jako +20% wartości Ta.
Wiem, że moje opisy są miejscami dość mocno techniczne, niemniej jednak zapraszam wszystkich do komentowania opisanego rozwiązania lub zgłaszania innych ciekawych pomysłów.