Do czego to służy? - Pseudo-analogowy wskaźnik
Problem pokazywania w czytelny sposób szybko zmieniających się pomiarów dostrzegli producenci multimetrów. W lepszych ich wykonaniach dodawany jest bargraf. Spotyka się też konstrukcje łączące miernik wskazówkowy z cyfrowym – fotografia 1. A gdyby tak na wyświetlaczu graficznym symulować miernik wskazówkowy?
Widziałem już takie rozwiązanie, ale na wyświetlaczu monochromatycznym. Kolorowy wydał się ciekawszy. Powstała więc konstrukcja zaprezentowana w artykule. Efekt działania urządzenia można zaobserwować na filmach: https://www.youtube.com/playlist?list=PLdtkbzWTUVMkv3nDujB1Cpppz0gawlG2V.
Jak działa pseudo-analogowy wskaźnik?
Schemat ideowy pokazany jest na rysunku 1. Układ zasilany jest napięciem z zakresu 5–12V stabilizowanym układem U1. Dioda D1 zabezpiecza urządzenie przed skutkami błędnego przyłączenia zasilania. Mierzone napięcie jest doprowadzone do złącza J5. Rezystory R2 z R3, R4 lub R5 tworzą dzielnik wejściowy.
Cztery zakresy pomiarowe uzyskano, przyłączając jeden z rezystorów R3, R4 lub R5 do masy lub żaden z nich. Wyprowadzenia mikrokontrolera przyłączone do rezystorów pracują w trybie Open Drain.Dzięki temu albo są połączone z masą (stan niski wyjścia), albo są w stanie wysokiej impedancji (w zakresie napięć od –600mV do +5,5V). Kluczową rolę odgrywa mikrokontroler U2. Wyniki pomiarów prezentowane są na kolorowym wyświetlaczu THT o rozdzielczości 128×128 pikseli.
W urządzeniu przewidziano możliwość wykorzystania zewnętrznego napięcia odniesienia U3 ale jego użycie ma sens tylko wtedy, gdy przeprowadzi się czasochłonną procedurę kalibracji przetwornika ADC. Złącze J6 służy do programowania mikrokontrolera. J2 i J7 mogą służyć do komunikacji miernika z innym mikrokontrolerem lub komputerem. Pozostałe złącza nie są używane, służyły do testów. Program dla mikrokontrolera, zarówno w postaci źródłowej, jak i pliki wynikowe (BIN, Intel- Hex S-recordy), jest umieszczony na Elportalu wśród materiałów dodatkowych do tego numeru EdW.
Można, a wręcz trzeba dostosować go do swoich potrzeb. Zmiany mogą dotyczyć wskazywanych wielkości, liczby zakresów pomiarowych, kolorów. Możliwe jest, jak na filmie https://www.youtube.com/watch?v=AgA4Gt2vriA&list=PLdtkbzWTUVMkv3nDujB1Cpppz0gawlG2V&index=3&t=0s, uzyskanie kolorowej skali czy też zmiany koloru wskaźnika cyfrowego bądź wskazówki, zależnie od wartości mierzonej wielkości https://youtu.be/82TjEMmNTn4?list=PLdtkbzWTUVMkv3nDujB1Cpppz0gawlG2V.
Montaż i uruchomienie pseudo-analogowego wskaźnika
Układ można zmontować na płytce drukowanej, której projekt pokazany jest na rysunku 2. Układ montujemy, zaczynając od elementów najmniejszych, a kończąc na największych.
Fotografia wstępna oraz fotografie 2 i 3 pokazują model. Osoby niedoświadczone powinny poprosić kogoś o pomoc w zaprogramowaniu procesora. Zmontowany układ nie wymaga uruchamiania, jeżeli ma służyć do pomiaru napięć w zakresie 1...100V, a skala jest jednobarwna. Po włączeniu zasilania pokaże się ekran tytułowy widoczny na fotografii 4. W modelu pobór prądu wynosił około 50mA.
Miernik można skalibrować. Kalibracja nie jest bezwzględnie konieczna. Bez niej trzeba się jednak liczyć z większymi błędami pomiarowymi. W tym celu w kodzie programu, należy odnaleźć deklarację:
#define VREF_VCC 3.3
po czym wpisać faktyczne napięcie zasilające mikrokontroler. W prototypie było to:
#define VREF_VCC 3.2984
Po tym należy skompilować kod i wgrać do mikrokontrolera. Jak to zrobić, można przeczytać na końcu artykułu. Kolejne modyfikacje polegają na odnalezieniu:
#define KALIBRACJA_DZIELNIKA_0
przypisując jej wartość „1.0” („1.0” nie „1”):
#define KALIBRACJA_DZIELNIKA_0 1.0
Po kompilacji i uruchomieniu programu należy podać napięcie odpowiadające około 90% zakresu 0. W przypadku domyślnych ustawień będzie to 900mV. Po odczytaniu wartości wskazanej przez miernik należy przeprowadzić proste obliczenie:
korekta = Uwe / Uodczytane
na przykład, odczytano napięcie 853mV, na wejście podano 910mV, wartość korekty wyniesie:
910 / 850 = 1,06682297772567
W kodzie źródłowym należy więc zmienić deklarację na:
#define KALIBRACJA_DZIELNIKA_0 1.06682297772567
Tę samą procedurę należy przeprowadzić dla pozostałych używanych zakresów pomiarowych. W deklaracji istotne jest (typ fl oat) siedem cyfr znaczących. Kalibracja nie rozwiąże problemu nieliniowości przetwornika ADC. Ze względu na to, że wskaźnik panelowy najczęściej pokazuje wielkości z wąskiego zakresu, jak na przykład napięcie sieciowe 230V, to aby uniknąć czasochłonnej kalibracji nieliniowości, której opis, ze względu na stopień skomplikowania pominę, wskaźnik można skalibrować dla środka zakresu mierzonej wielkości, w przypadku 230V będzie to właśnie to napięcie. Gdyby kalibracja dotyczyła wskazania temperatury z zakresu 15...35 stopni, kalibrację należy przeprowadzić dla 25 stopni = (15+35) / 2.
Możliwość zmian Aby ułatwić wprowadzenie zmian, pokrótce opiszę najważniejsze stałe zdefiniowane w programie.
#define AUTO_ON //Wykomentowanie wyłączy automatykę oraz ustawi najwyższy zakres pomiarowy
#define MAX_ZKRES 2 //Liczba używanych zakresów pomiarowych
#define TXT_ZAKRES_0 "1000" //Symbol zakresu 0
#define TXT_JEDNOSTKA_0 "mV" //Jednostka zakresu 0
#define TXT_ZAKRES_1 "10" //Symbol zakresu 1
#define TXT_JEDNOSTKA_1 "V"
#define TXT_ZAKRES_2 "100" //Symbol zakresu 2
#define TXT_JEDNOSTKA_2 "V"
#define TXT_ZAKRES_3 "1kV" //Symbol zakresu 3
#define TXT_JEDNOSTKA_3 "V"
Nie powinno być wątpliwości, czemu służą definicje. Zwracam tylko uwagę, że tekst „TXT_ ZAKRES” w połączeniu z „TXT_JEDNOSTKA” jest wyświetlany w lewym górnym rogu wyświetlacza, natomiast „TXT_JEDNOSTKA” za wynikiem pomiaru na wskaźniku cyfrowym.
#define POMIAR_ADC 0 // Z którego ADC dokonywane są pomiary.
0-adc1, 1-SDadc1
#define VREF_VCC 3.3 // Napięcie zasilania uC
#define VREF_SDADC 1.2288 // Vref adc 16-bit
„POMIAR_ADC” decyduje, czy wykorzystywany jest szybki przetwornik ADC 12-bit, czy wolny 16-bit. Aktualnie oprogramowanie obsługuje tylko przetwornik 12-bit. „VREF_VCC” to napięcie zasilania mikrokontrolera. W przypadku wykorzystania przetwornika 16-bit istotna jest wartość napięcia Vref dostępnego na wyprowadzeniu 25 mikrokontrolera.
#define D_WE_0 1
#define D_WE_1 11
#define D_WE_2 101
#define D_WE_3 1001
definiują wartość podziału dzielników napięcia zbudowanego z R2 oraz R3, R4, R5. Oprogramowanie wskaźnika dostępne w Elportalu używa trzech zakresów pomiarowych. Definicje:
#define KALIBRACJA_DZIELNIKA_0 1.0
#define KALIBRACJA_DZIELNIKA_1 1.0
#define KALIBRACJA_DZIELNIKA_2 1.0
#define KALIBRACJA_DZIELNIKA_3 1.0
były już opisane przy okazji kalibracji.
//#define SKALA_KOLOR // Definicja włącza kolorową skalę
#define KAT_SKALI_GORA 20.0
#define KAT_SKALI_DOL 30.0
#define KOLOR_SKALI_GORA ANSI_RED
#define KOLOR_SKALI_SRODEK ANSI_GREEN
#define KOLOR_SKALI_DOL ANSI_YELLOW
Powyższe włączają zakres i kolory skali, natomiast:
//#define DIGITAL_KOLOR // Definicja włącza kolorowy wskaźnik cyforwy
#define WSKAZANIE_ZAKRES_KOLOR_Y 200
#define WSKAZANIE_ZAKRES_KOLOR_G 205
#define WSKAZANIE_ZAKRES_KOLOR_R 250
umożliwia zmianę koloru wskaźnika cyfrowego zależnie od zmierzonej wartości. Na filmach widać, że wskazówka chowa się za wskaźnikiem cyfrowym. Nie jest to naturalne, ale taka jest „magia kina”. Dzięki temu nienaturalnemu zachowaniu wskaźnika i wskazówki jest on bardziej czytelny. Można to zmienić, przenosząc fragment:
//----- BEGIN wskazówka
t1 = readTimSys();
PrintWskaznik( wartosc );
t1 = readTimSys() - t1;
//----- END wskazówka
bezpośrednio przed:
//----- BEGIN wysłanie danych do wyświetlacza
t2 = readTimSys();
TFT_ILI9163C_Display(); // TFT_ILI9163C_DisplayDMA();
t2 = readTimSys() - t2;
//----- END wysłanie danych do wyświetlacza
Kompilacja i programowanie mikrokontrolera Projekt wskaźnika zrealizowano z wykorzystaniem środowiska CubeIDE, które można pobrać ze strony producenta mikrokontrolerów STM32 https://www.st.com/en/development-tools/stm32cubeide.html#tools-software. Gdy środowisko jest zainstalowane i pobierze wymagane pliki z Internetu, można otworzyć projekt, klikając w ikonę projektu rysunek 3 (Uwaga! Wszystkie rysunki – zrzuty są też umieszczone w Elportalu). Kod kompilujemy, naciskając symbol młotka – rysunek 4.
Raport z kompilacji ukazuje się w lewym oknie na dole, po prawej znajdziemy informacje o zajętości pamięci mikrokontrolera – rysunek 5.
Program wgrywamy do mikrokontrolera, naciskając symbol robaka – rysunek 6. Zanim to zrobimy, należy podłączyć programator do mikrokontrolera. Linię SwdCK przyłączamy do wyprowadzenia 1 złącza J4, SwdIO do 3 J4, masę do 2 J4. Po wgraniu programu do mikrokontrolera pojawi się okno informujące o przełączeniu widoku – rysunek 7.
Naciskamy „Switch”. Program zatrzyma się na pierwszej linii programu – rysunek 8.
Aby go uruchomić, należy nacisnąć przycisk „PLAY” – rysunek 9 lub klawisz F8. Instalację i obsługę CubeIDE opisałem bardzo pobieżnie.
Wynika to z tego, że nie da się w kilku zdaniach opisać nawet podstawowej obsługi tak potężnego narzędzia. Na ten cel trzeba by przeznaczyć kilkanaście stron czasopisma. Jeśli Czytelnicy są zainteresowani takim artykułem, proszę o e-maile do redakcji.