- pomiar napięcia stałego w przedziale 0…9,99 V lub 0…99,8 V,
- automatyczna zmiana zakresu,
- sygnalizacja przekroczenia zakresu,
- wyświetlacz LCD 3 cyfry 7-seg.,
- rezystancja wejściowa ok. 100 kΩ,
- napięcie zasilania 3 V (z baterii CR2032 lub złącza),
- średni pobór prądu 40 μA (ponad pół roku pracy na typowej baterii CR2032).
Pomiar napięcia stałego przy użyciu przyrządu cyfrowego to dzisiaj zagadnienie oczywiste. Staje się ono bardziej złożone, kiedy przyrząd ma samodzielnie decydować o doborze odpowiedniego zakresu pomiarowego. Taka funkcja nie jest standardem nawet w nowych multimetrach. Ale została zaimplementowana w prezentowanym projekcie.
Jeszcze większy problem pojawia się, kiedy nie możemy pozwolić sobie na doprowadzenie stałego zasilania, np. sieciowego. Chcąc uzyskać bezobsługowy (niewymagający np. wciskania przycisku) podgląd monitorowanej wartości, trzeba radykalnie ograniczyć pobór prądu. Z tym problemem udało się wygrać, uzyskując ponad pół roku pracy na typowej baterii CR2032.
Budowa i działanie
Schemat ideowy energooszczędnego woltomierza został pokazany na rysunku 1. Źródłem zasilania dla tego układu może być bateria typu CR2032, której gniazdo znajduje się na płytce, albo zewnętrzny zasilacz napięcia stałego o wartości 3 V, podłączany do zacisków złącza J1. Tętnienia napięcia, spowodowane niezerową rezystancją wewnętrzną wyżej wymienionych źródeł zasilających układ, redukują kondensatory C1…C3.
Cykliczny pomiar oraz odświeżanie zawartości wyświetlacza, realizuje mikrokontroler typu ATtiny44A. Nie wykonuje zadań krytycznych czasowo, dlatego jest taktowany wbudowanym oscylatorem RC. Ponieważ pomiar napięcia przez przetwornik analogowo-cyfrowy wymaga stabilnego źródła napięcia referencyjnego o znanej wartości, został do tego wybrany zewnętrzny układ US1 typu MCP1501T-20E/CHY zamiast źródła, jakie oferuje mikrokontroler. Powód jest bardzo prosty: dokładność źródła referencyjnego zawartego w strukturze mikrokontrolera nie zachwyca. Błąd rzędu ±10% oraz nieznana stabilność czasowa i temperaturowa dyskwalifikują je do realizacji pomiarów napięcia, nawet przy zastosowaniu kalibracji. Rysunek 2 pokazuje fragment noty katalogowej układu ATtiny44A, na którym znajduje się minimalna, typowa i maksymalna wartość wewnętrznego napięcia referencyjnego.
Można zastosować źródło zewnętrzne, podłączone do wejścia ADC0, ale musi być spełniony jeden warunek. Otóż wbudowane źródło napięcia odniesienia ma wartość około 1,1 V, natomiast zewnętrzne musi mieć nie mniej niż 2 V (rysunek 2). Powodów producent nie podaje, lecz można sądzić, że chodzi o zapewnienie poprawnej pracy np. wtórnika napięciowego. Układ typu MCP1501T-20E/CHY idealnie nadaje się do tego zastosowania, ponieważ jego napięcie wyjściowe wynosi 2,048 V, co spełnia wymagania stawiane przez ATtiny44A. Tolerancja wartości to zaledwie ±0,1%, co jest wynikiem rewelacyjnym w odniesieniu do niskiej ceny (ok. 3 zł netto).
Dodatkowym atutem jest wejście wyłączające, które w tak energooszczędnej aplikacji jest bardzo istotne. Przez większość czasu napięcie referencyjne jest zbędne, wystarczy je włączyć na chwilę przez rozpoczęciem pomiaru przez przetwornik analogowo-cyfrowy i zaraz potem wyłączyć. Wówczas pobór prądu przez ten układ zasadniczo maleje – z około 140…550 µA do niecałych 200 nA (rysunek 3).
Mierzone napięcie jest dzielone przy użyciu dzielnika rezystancyjnego. Jego uproszczony schemat został pokazany na rysunku 4. Rozszerzenie zakresu pomiarowego następuje poprzez dołączenie drugiego rezystora (R9+R10+P2) równolegle do włączonego na stałe „dolnego” rezystora dzielnika (R7+R8+P1). Rysunek ten zawiera również alternatywne nazwy tych elementów, w kolorze czerwonym, co zostanie wyjaśnione w dalszej części artykułu.
Dołączanie rezystora w dzielniku umożliwia tranzystor MOSFET o niskiej rezystancji włączonego kanału. Takie rozwiązanie zostało wybrane z dwóch powodów. Pierwszym z nich jest włączenie w szereg z R9+R10+P2 rezystancji RDSon, którą łatwo można skompensować podczas kalibracji. W przypadku tranzystora bipolarnego, byłoby to źródło napięciowe o wydajności równej jego napięciu nasycenia, co mogłoby zaburzać wyniki pomiarów prowadzonych w szerokim zakresie. Drugim powodem jest oszczędność energii elektrycznej, ponieważ bramka tranzystora MOSFET nie pobiera prądu w stanie ustalonym.
Wartości rezystorów dzielnika zostały obliczone z poniższego wzoru. Dla uproszczenia zapisu wzorów przyjęto wspomniane wcześniej nazwy alternatywne. Na zakresie do 10 V działa tylko rezystor R1, zaś do 100 V równoległe połączenie R1 i R2. Należy pamiętać, że napięcie wyjściowe Uwy powinno wynosić 2,048 V przy maksymalnym napięciu wejściowym Uwe dla danego zakresu. Dla rezystorów R5 i R6 przyjęto wartości 47 kΩ, a do nich dobrano pozostałe:
Można teraz obliczyć rezystancję samego R2:
Wystarczy dobrać oporności rezystorów spośród dostępnych wartości. Warto przy tym pamiętać, że ślizgacze potencjometrów powinny znajdować się w połowie ich zakresu dla nominalnego ustawienia tak, aby była możliwa regulacja zarówno w jedną, jak i drugą stronę:
Napięcie wyjściowe z opisanego dzielnika jest filtrowane przez rezystor R11 i kondensator C4, który dodatkowo zawęża pasmo szumowe. Dioda D1 ogranicza zakres napięcia, jaki może być podany na wejście przetwornika analogowo-cyfrowego. Rezystor R12 zmniejsza natężenie prądu płynącego przez diody zabezpieczające wejście mikrokontrolera, o ile taki popłynie. Może tak się zdarzyć, kiedy napięcie przewodzenia D1 byłoby wyższe.
Podczas projektowania dzielnika napięciowego konieczne było uwzględnienie prądu płynącego przez zaporowo spolaryzowane diody znajdujące się w strukturze BAT54S. Może to mieć znaczenie, ponieważ są to diody ze złączem Schottky’ego (rysunek 5). Wartość napięcia polaryzującego zaporowo nie będzie wysoka (nie więcej niż 3 V dla jednej z diod), za to możliwy jest szeroki rozrzut temperatur, co przełoży się na szeroki zakres wartości prądu wstecznego – od około 70 pA przy –25°C do nawet 2 µA przy 75°C. Dlatego rezystancja obwodu polaryzującego diody nie może być bardzo wysoka, ponieważ ten dodatkowy prąd mógłby zakłócać pomiar. Nie ma też gwarancji, że przez obie diody będzie płynął prąd o dokładnie takim samym natężeniu, co rozwiązywałoby problem.
Sterowanie wyświetlaczem LCD musi odbywać się poprzez jednoczesną kontrolę wszystkich jego segmentów, ponieważ nie ma wbudowanego sterownika. Był to celowy wybór, ponieważ umożliwia samodzielną budowę kontrolera, uwzględniającego wysoką energooszczędność. Służą do tego cztery rejestry przesuwne typu 74HC595. Struktura wykonana w technologii CMOS gwarantuje niskie zapotrzebowanie na energię w stanie statycznym, a dodatkowo seria HC może pracować prawidłowo zasilana napięciem już nawet 2 V.
Rejestry zostały połączone w łańcuch, aby możliwa była aktualizacja ich zawartości przy użyciu jedynie trzech wyprowadzeń mikrokontrolera. Są to linie:
- DATA – linia danych;
- SHCP – zegar danych, na zboczu narastającym następuje przesunięcie zawartości o jedną pozycję;
- STCP – zegar równoległego rejestru wyjściowego, na zboczu narastającym następuje aktualizacja stanów logicznych na wyjściach QA…QH.
Obsługa wyświetlacza sprowadza się do okresowej zmiany stanów logicznych jego wyprowadzeń. Jeżeli segment ma być załączony (czarny), to stany logiczne między wyprowadzeniem tego segmentu a elektrodą wspólną (COM) muszą być odmienne. W przypadku chęci wyłączenia segmentu, wystarczy nadać mu ten sam chwilowy stan logiczny, który ma elektroda wspólna.
Mikrokontroler przez większość czasu pozostaje w stanie uśpienia. Do działania wybudza go układ Watchdog, który generuje przerwania co ok. 64 ms. Za każdym razem dochodzi do aktualizacji zawartości rejestrów, aby segmenty wyświetlacza nie uległy elektrolizie wskutek wystąpienia składowej stałej między nimi a elektrodą wspólną. Co dwadzieścia takich wybudzeń następuje pomiar i aktualizacja zawartości ekranu.
Montaż i uruchomienie
Układ został zmontowany na niewielkiej, dwustronnej płytce drukowanej o wymiarach 45×40 mm. Jej wzór ścieżek oraz schemat montażowy został pokazany na rysunku 6. W odległości 3 mm od krawędzi płytki znalazły się otwory montażowe, każdy o średnicy 3,2 mm. Szczegóły dotyczące wymiarów płytki oraz lokalizacji otworów i wyświetlacza pokazuje rysunek 7.
Montaż warto rozpocząć od elementów lutowanych powierzchniowo, które znajdują się tylko na wierzchniej stronie płytki. Po ich zamontowaniu zalecane jest szczegółowe skontrolowanie wszystkich lutowań, ponieważ część z nich zostanie zakryta przez wyświetlacz, więc ich poprawienie będzie bardzo utrudnione.
W drugim etapie montażu należy zamontować elementy lutowane w sposób przewlekany, które znajdują się na spodniej stronie płytki – złącza J1, J2 i J3, gniazdo baterii B1 oraz potencjometry P1 i P2. Płytkę z tymi elementami pokazuje fotografia 1.
Jako ostatni należy wlutować wyświetlacz LCD1. Nie posiada on żadnej ramki ani obudowy i jest stosunkowo kruchy, a przez to podatny na uszkodzenia. Kierunek prawidłowego montażu wskazuje kropla szkła spajająca jego strukturę z boku oraz występ z lewej strony obrysu na płytce. Jego wyprowadzenia należy delikatnie dogiąć, o ile zajdzie taka konieczność, a potem włożyć w przeznaczone dla niego miejsce (nad układami US3…US6 i kondensatorem C3) i przylutować z drugiej strony. Znajdujące się pod nim układy scalone wydzielają znikome ilości ciepła, więc może do nich dotykać, nie ma potrzeby zapewniania wentylacji.
Po zakończeniu montażu, należy ustawić fuse-bity mikrokontrolera Attiny44A na następujące wartości:
Low Fuse = 0xE2
High Fuse = 0xDE
Spowoduje to wyłączenie preskalera sygnału zegarowego oraz ustawienie zabezpieczenia Brown-Out Detector na napięcie 1,8 V. Rdzeń układu będzie od tej chwili taktowany z częstotliwością 8 MHz, a uaktywnione zabezpieczenie zapobiegnie jego zawieszeniu w momencie włączania zasilania. Szczegóły tej konfiguracji zostały pokazane na rysunku 8, zawierającym zrzut okna z programu BitBurner.
Oprócz tego należy również zaprogramować pamięć Flash przygotowanym do tego celu gotowym plikiem wynikowym w formacie .hex.
Eksploatacja
Prawidłowo zmontowany i zaprogramowany układ jest gotowy do działania. Po dołączeniu zasilania o wartości 3 V na zaciski złącza J1 lub włożeniu baterii CR2032 do koszyka, zaczyna wyświetlać wartość napięcia stałego przyłożonego do złącza J3. Obie masy – zasilająca i mierzonego napięcia są ze sobą połączone.
Aby wskazania były możliwie dokładne, należy przeprowadzić kalibrację. Jako pierwszego należy użyć napięcia o wartości mniejszej niż 10 V (ale możliwie wysokiej dla tego zakresu) i dokonać regulacji potencjometrem P1. Potem napięcie na złączu J3 należy zwiększyć, ale do wartości mniejszej niż 100 V i wyregulować wskazania potencjometrem P2. Potencjometr P1 musi pozostać nieruchomy, ponieważ jego położenie ma wpływ na oba zakresy pomiarowe.
Pomiary wykonywane są cyklicznie co około 1 s, niezależnie od zakresu, w jakim układ mierzy. Jeżeli musi dojść do jego zmiany (np. napięcie wzrosło z 9,52 V do 10,5 V), czas ten jednorazowo wydłuża się dwukrotnie, ponieważ pierwszy pomiar jest wykonany przy nieprawidłowym ustawieniu zakresu. Dopiero na podstawie uzyskanego wyniku jest podejmowana decyzja o przełączeniu zakresu i wykonaniu ponownego pomiaru.
Przyłożenie napięcia większego niż 100 V (a dokładniej: większego lub równego 99,9 V) spowoduje wyświetlenie komunikatu o przekroczeniu zakresu w postaci napisu „ovF”. Jeżeli napięcie wynosiłoby więcej niż 150 V, może dojść do przegrzania rezystorów R5 i R6, a w efekcie do ich uszkodzenia.
Rezystancja wejściowa układu wynosi około 100 kΩ. Wartość ta jest przybliżona, ponieważ na zakresie do 10 V wyniesie około 118 kΩ, a na zakresie do 100 V około 96 kΩ. Wejście układu jest zabezpieczone przed wyładowaniami elektrostatycznymi oraz zakłóceniami o charakterze impulsowym.
Średni pobór prądu wynosi 40 µA przy zasilaniu układu napięciem o wartości 3 V. Zakładając pojemność baterii CR2032 na poziomie 200 mAh, daje to prawie 7 miesięcy pracy. Minimalne napięcie zasilające układ wynosi 2,25 V i jest podyktowane koniecznością zapewnienia prawidłowych warunków pracy dla źródła napięcia odniesienia US1. Podnoszenie napięcia zasilającego znacznie powyżej 3 V może negatywnie wpłynąć na wyświetlacz LCD1.
Jeżeli źródłem zasilania byłby zasilacz, musi on mieć możliwość „wciągania” prądu lub mieć dołączone inne zasilane układy albo chociaż diodę typu transil. Ma to związek z potencjalnym otwarciem się górnej diody D1, przez który może płynąć prąd w kierunku linii zasilającej. Jeżeli jego wartość byłaby większa niż zapotrzebowanie układu, wówczas napięcie zasilania mogłoby wzrosnąć.
Dla dociekliwych
Ciągła praca przetwornika analogowo-cyfrowego byłaby niekorzystna z powodu relatywnie wysokiego poboru prądu przez układ. Trzeba go włączać tylko na czas wykonywania pomiaru, a ten odbywa się co około sekundę.
#define CNT_READ 20 //co tyle wybudzeń będzie odczytywany ADC
volatile uint8_t cyfry[4] = {10, 10, 10, 10}; //cyfry do wystawienia na LCD
//pozycja załączonej kropki: 0 - pierwsza, 1 - druga,
//2 - trzecia, coś innego - brak
volatile uint8_t poz_kropki = 3;
volatile uint8_t cnt_read = CNT_READ; //aby natychmiast odczytać ADC
volatile uint32_t adc; //wartość pobrana z ADC
volatile uint8_t range = 0; //0 - zakres do 10V, 1 - zakres do 100V
//jeżeli 1, to wynik pomiaru był juz wykorzystany
volatile uint8_t measure_good = 0;
//Przerwanie od zakończonej konwersji ADC
//pusta obsługa przerwania, aby nie pozostało nieobsłużone
ISR(ADC_vect){ }
//Główna funkcja programu
int main(void){
//...
while(1){
cnt_read++; //inkrementacja zmiennej do odczytania ADC
if(cnt_read >= CNT_READ){
cnt_read = 0; //przygotowanie do następnego odliczenia
PORTA |= (1<<PORTA1); //załączenie AREF
//zewnętrzny AREF + ADC2 jako wejście
ADMUX = (1<<REFS1) | (1<<MUX1);
//załączenie tranzystora modyfikującego dzielnik wejściowy
if(range){
PORTA |= (1 << PORTA3); //do 100V: załączony
}else{
PORTA &= ~(1 << PORTA3); //do 10V: wyłączony
}
measure_good = 0; //wyzerowanie flagi
ADCH = 0; //wyczyszczenie rejestrów
ADCL = 0;
//oczekiwanie na ustabilizowanie źródła napięcia odniesienia
_delay_ms(1);
//załączenie przetwornika ADC
ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2) | (1<<ADATE);
while(bit_is_clear(ADCSRA,ADIF)); //oczekiwanie na koniec pomiaru
adc = ADCL | (ADCH << 8); //pobranie wyniku pomiaru
PORTA &= ~(1<<PORTA1); //wyłączenie źródła napięcia odniesienia
//wyłączenie ADC przez wyzerowanie rejestrów sterujących jego pracą
ADMUX = 0;
ADCSRA = 0;
adc *= 1000; //bardzo prosta konwersja z przedziału 0-1023 na 0-999
adc /= 1024;
//1 - jeżeli mierzono na zakresie do 10V i wynik jest poprawny
if(adc < 999 && range == 0){
poz_kropki = 1; //załącz kropkę w odpowiednim miejscu
cyfry[0] = 10; //wyłącz cyfrę najbardziej na lewo
cyfry[1] = adc / 100; //rozbicie jednej liczby na trzy cyfry
adc -= cyfry[1] * 100;
cyfry[2] = adc / 10;
adc -= cyfry[2] * 10;
cyfry[3] = adc;
measure_good = 1; //wynik pomiaru został wykorzystany
}
//2 - jeżeli przekroczono zakres do 10V
if(adc >= 999 && range == 0){
range = 1; //zmień zakres na 100V
//oraz zablokuj możliwość użycia tego wyniku pomiaru
measure_good = 1;
}
//3 - jeżeli mierzono na zakresie do 100V i wynik jest poprawny
if(adc < 999 && adc > 99 && range == 1 && measure_good == 0){
poz_kropki = 2; //załącz kropkę w odpowiednim miejscu
cyfry[0] = 10; //wyłącz cyfrę najbardziej na lewo
cyfry[1] = adc / 100; //rozbicie jednej liczby na trzy cyfry
adc -= cyfry[1] * 100;
cyfry[2] = adc / 10;
adc -= cyfry[2] * 10;
cyfry[3] = adc;
measure_good = 1; //wynik pomiaru został wykorzystany
}
//4 - jeżeli na zakresie 100V podano napięcie do 10V
if(adc <= 99 && range == 1 && measure_good == 0){
range = 0;//zmień zakres na 10V
//oraz zablokuj możliwość użycia tego wyniku pomiaru
measure_good = 1;
}
//5 - jeżeli na zakresie do 100V został przekroczony zakres
if(adc >= 999 && range == 1 && measure_good == 0){
poz_kropki = 3; //wyłącz kropkę
//napisz Ovf, jeżeli wynik pomiaru przekracza 100V
cyfry[0] = 10;
cyfry[1] = 11;
cyfry[2] = 16;
cyfry[3] = 13;
//zablokuj możliwość użycia tego wyniku pomiaru
measure_good = 1;
}
}
}
return 0;
}
Na listingu 1 znajdują się fragmenty kodu programu, napisanego w języku C, który odpowiada za obsługę tego przetwornika i dopasowanie zakresu pomiarowego.
Po pobraniu i przeskalowaniu wyniku, układ wyłącza zarówno sam przetwornik, jak i zewnętrzne źródło napięcia odniesienia. Następnie podejmuje jedną z pięciu akcji:
- Ustalono zakres do 10 V, a wynik mieści się w przedziale, zatem następuje jego wyświetlenie;
- Ustalono zakres do 10 V, a wynik wskazuje na przekroczenie zakresu. Podczas następnego pomiaru zostanie zmieniony zakres na 100 V;
- Ustalono zakres do 100 V, a wynik mieści się w przedziale, zatem następuje jego wyświetlenie;
- Ustalono zakres do 100 V, a wynik jest mniejszy niż 10 V. Podczas następnego pomiaru zostanie zmieniony zakres na 10 V;
- Ustalono zakres do 100 V, a wynik wskazuje na przekroczenie zakresu. Wyświetlony zostanie komunikat informujący o przekroczeniu możliwości pomiarowych tego przyrządu.
Punkt 4. wyjaśnia istnienie pewnej histerezy, jaką można zauważyć przy zmniejszaniu napięcia. Otóż raz ustawiony zakres do 100 V nie będzie zmieniany tak długo, jak długo zachodzi taka potrzeba. Zatem powoli opadające napięcie zostanie odczytane, na przykład jako: 10,1 V, potem 10,0 V, a później, na przykład, 9,83 V.
Powód jest prosty: na tym zakresie, rozdzielczość pomiaru wynosi 0,1 V. Układ nie ma zatem możliwości rozróżnienia napięcia, przykładowo, 10,03 V od 9,97 V. Dopiero wynik zinterpretowany jako 9,9 V (lub niższy) przyczyni się do automatycznej zmiany zakresu. Jeżeli napięcie rośnie, efekt ten nie wystąpi.
Automatyczna zmiana zakresu „zabiera” jeden pomiar, ponieważ prawidłowy wynik zostanie pobrany przy następnym załączeniu przetwornika, z docelowo ustawionym dzielnikiem napięcia.
Uznano jednak, że będzie to zjawisko na tyle rzadko występujące, że nie stanie się dokuczliwe.
Na podstawie 5. punktu można wywnioskować, dlaczego najwyższa wskazywana przez ten układ wartość napięcia może wynosić 99,8 V. Jeżeli wynosiłoby ono 99,9 V, przetwornik analogowo-cyfrowy nasyci się, czyli wystawi maksymalną możliwą liczbę na swoim wyjściu. Nie będzie zatem wiadome, czy przyłożone napięcie to 99,9 V, czy np. 105 V, ponieważ zawartość rejestrów przechowujących wynik pomiaru będzie dokładnie taka sama dla obu sytuacji.
Michał Kurzela, EP
- R1…R4: 47 kΩ
- R5, R6: 47 kΩ 1%
- R7: 6,8 kΩ 1%
- R8: 15 kΩ 1%
- R9: 680 Ω 1%
- R10: 1,2 kΩ 1%
- R11, R12: 1 kΩ
- P1: 5 kΩ potencjometr THT montażowy leżący
- P2: 500 Ω potencjometr THT montażowy leżący
- C1, C3, C4: 100 nF
- C2: 10 µF 16 V
- D1: BAT54S (SOT23)
- T1: IRLML2502 (SOT23)
- US1: MCP1501T-20E/CHY (SOT23-6)
- US2: Attiny44A-SSU (SO14)
- US3…US6: 74HC595 (SO16)
- B1: gniazdo baterii CR2032 THT leżące
- J1, J3: ARK2/500
- J2: goldpin 5 pin męski 2,54 mm THT
- LCD1: DE 117-RS-20/7,5/V