µScale – waga elektroniczna

µScale – waga elektroniczna
Pobierz PDF Download icon

Popularne i niedrogie belki tensometryczne skonfigurowane w układzie mostka Wheatstone’a stosowane są w elektronicznych układach do pomiaru masy, siły czy naprężeń. Są to typowe peryferia używane w tego rodzaju urządzeniach a ich duża popularność wynika z prostoty budowy, dokładności oraz niskiej ceny. W artykule zaprezentowano układ prostej elektronicznej wagi kuchennej zbudowanej na bazie takiego elementu.

Podstawowe parametry:
  • zakres pomiarowy: 0…5000 g (zależny od zastosowanej belki tensometrycznej, max. 10 kg),
  • częstotliwość odświeżania pomiaru: 5×/s,
  • napięcie zasilania: 4,5…10 V,
  • prąd obciążenia: 45 mA.

Schemat projektu o nazwie μScale, został pokazany na rysunku 1.

Rysunek 1. Schemat ideowy urządzenia µScale

Zaprojektowano bardzo prosty system mikroprocesorowy, którego „sercem” jest niewielki mikrokontroler firmy Microchip (dawniej Atmel) typu ATtiny44. Układ ten jest odpowiedzialny za programową implementację interfejsu I2C, przy użyciu którego realizuje obsługę wbudowanego wyświetlacza OLED stanowiącego element graficznego interfejsu użytkownika oraz za obsługę szeregowego interfejsu standardu SPI, przy pomocy którego komunikuje się z układem precyzyjnego, 24-bitowego przetwornika pomiarowego pod postacią układu HX711.

Układ HX711

Jest specjalizowanym przetwornikiem ADC, produkcji firmy Avia Semiconductor, przeznaczonym do układów pomiarowych z czujnikami tensometrycznymi. Charakteryzuje się następującymi, wybranymi cechami użytkowymi:

  • dwa niezależne, różnicowe kanały wejściowe,
  • zintegrowany, niskoszumny wzmacniacz PGA o regulowanym wzmocnieniu (128×, 64× lub 32×),
  • zintegrowany stabilizator zasilający czujnik tensometryczny jak i przetwornik ADC,
  • wbudowany oscylator niewymagający zewnętrznych elementów dyskretnych,
  • prosty, szeregowy interfejs sterujący,
  • konfigurowalna częstotliwość pomiarów (10 lub 80 razy na sekundę),
  • szeroki zakres napięć zasilających (2,6...5,5 V),
  • tryb powerdown o niskim zapotrzebowaniu na energię (0,3 mA).

Takie parametry sprawiają, że układ HX711 idealnie wpisuje się w potrzeby niniejszej aplikacji dostarczając konstruktorowi kompletny i bardzo dokładny front-end pomiarowy. Na rysunku 2 pokazano wygląd obudowy naszego peryferium wraz z opisem poszczególnych wyprowadzeń, zaś w tabeli 1 opisano ich funkcje.

Rysunek 2. Rysunek obudowy układu HX711 wraz z opisem poszczególnych wyprowadzeń

Komunikacja z układem HX711 odbywa się przy udziale szeregowej magistrali sterującej zbliżonej funkcjonalnością do znanej ze świata mikrokontrolerów magistrali SPI. Stosowne przebiegi sterujące jego pracą pokazano na rysunku 3.

Rysunek 3. Przebiegi na liniach interfejsu sterującego pracą układu HX711

Przesyłane są 3 bajty danych składające się na 24-bitową wartość pomiarową, przy czym transmisja rozpoczyna się zawsze od bitu MSB. I na tym w zasadzie kończą się podobieństwa do magistrali SPI. Dalej generowanych jest od jednego do trzech taktów zegara, których to liczba decyduje jaki kanał (A lub B) i z jakim wzmocnieniem będzie transmitowany podczas kolejnej transmisji danych. Te dodatkowe takty zegara ustawiają aktywny kanał wraz z jego wzmocnieniem podczas kolejnej transmisji danych. Trzeba przyznać, że jest to dość osobliwe rozwiązanie ale skuteczne. Warto również zaznaczyć, że domyślnie po włączeniu zasilania wybierany jest kanał A ze wzmocnieniem równym 128.

Specyfikację czasów dla poszczególnych przebiegów sterujących pokazano w tabeli 2. Warto zwrócić uwagę na zakres dopuszczalnych wartości dla czasu T3. Określono tutaj maksymalną wartość dla czasu logicznej jedynki sygnału zegarowego równą 50 ms. Wynika to z innej osobliwości sterowania pracą naszego peryferium. Czas dłuższy niż 60 ms powoduje przełączenie układu HX711 w tryb niskiego poboru energii power-down. Dość oryginalne rozwiązanie, choć trzeba przyznać, że skuteczne. W tym momencie znamy już wszystkie szczegóły dotyczące naszego ciekawego peryferium.

Program sterujący

Zaczynamy od pliku nagłówkowego, w ramach którego zdefiniowano wszystkie niezbędne ustawienia portów (listing 1).

Listing 1. Plik nagłówkowy sterownika

//Avia HX711 driver. Copyright Robert Wołgajew 2020

//Power Down and Serial Clock Input Port
#define PD_SCK_PORT PORTA
#define PD_SCK_DDR DDRA
#define PD_SCK_NR PA7

#define PD_SCK_SET_HIGH PD_SCK_PORT |= (1<<PD_SCK_NR)
#define PD_SCK_SET_LOW PD_SCK_PORT &= ~(1<<PD_SCK_NR)
#define PD_SCK_SET_AS_OUTPUT PD_SCK_DDR |= (1<<PD_SCK_NR)

//Serial Data Output Port
#define DOUT_PORT PORTB
#define DOUT_DDR DDRB
#define DOUT_PIN PINB
#define DOUT_NR PB1

#define DOUT_SET_AS_INPUT DOUT_DDR &= ~(1<<DOUT_NR)
#define DOUT_PULL_UP DOUT_PORT |= (1<<DOUT_NR)
#define DOUT_READ (DOUT_PIN & (1<<DOUT_NR))

#define GAIN_128 0x01 //Channel A, Gain = 128
#define GAIN_64 0x03 //Channel A, Gain = 64
#define GAIN_32 0x02 //Channel B, Gain = 32

Dalej, na listingu 2 pokazano funkcję inicjalizacyjną sterownika HX711, która oprócz ustawienia stanów domyślnych portów sterujących, dokonuje wstępnej konfiguracji układu. Warto zaznaczyć, że jako argument funkcja inicjalizacyjna przyjmuje jedną z trzech wartości wzmocnienia zdefiniowaną w pliku nagłówkowym.

Listing 2. Funkcja inicjalizacyjna

void hx711init(uint8_t Gain){
//Init pins
PD_SCK_SET_AS_OUTPUT;
PD_SCK_SET_LOW;

DOUT_SET_AS_INPUT;
DOUT_PULL_UP;

//Set the channel
//and the gain
//for the next reading
hx711read(Gain);
}

Kod funkcji pozwalającej na odczyt wartości zmierzonej przez układ HX711, pokazano na listingu 3.

Listing 3. Funkcja odczytująca wartość zmierzoną

uint32_t hx711read(uint8_t Gain){
uint32_t Value = 0;

//Wait for HX711 being ready
while(!hx711isReady());

//Read all 24 bits starting from MSB
for(uint8_t i = 0; i < 24; ++i){
Value <<= 1;
PD_SCK_SET_HIGH;
_delay_us(1);
if(DOUT_READ) Value++;
PD_SCK_SET_LOW;
_delay_us(1);
}

//Set the channel and
//the gain for the next reading
for (uint8_t i = 0; i < Gain; ++i){
PD_SCK_SET_HIGH;
_delay_us(1);
PD_SCK_SET_LOW;
_delay_us(1);
}

return Value;
}

Podobnie, jak poprzednio, funkcja przyjmuje jako argument jedną z trzech wartości wzmocnienia zdefiniowaną w pliku nagłówkowym. Warto również zauważyć, iż funkcja hx711read() korzysta z innej, prostej funkcji narzędziowej o nazwie hx711isReady(), której zadaniem jest sprawdzenie gotowości układu HX711 do przesłania zmierzonych wartości. Ciało wspomnianej funkcji narzędziowej pokazano na listingu 4.

Listing 4. Funkcja, której zadaniem jest sprawdzenie gotowości układu HX711 do przesłania danych

uint8_t hx711isReady(){
//HX711 returns 0 when ready
return DOUT_READ == 0x00;
}

Na koniec – funkcja sterująca trybami mocy układu HX711, której kod pokazano na listingu 5.

Listing 5. Funkcja sterująca trybami mocy układu HX711

//0: powedown, 1: normal operation
void hx711setPower(uint8_t Power){
if(Power) PD_SCK_SET_LOW;
else PD_SCK_SET_HIGH;
_delay_us(60);
}

Obliczenia

Zgodnie z tym, co napisano na wstępie, układ HX711 mierzy napięcie na zaciskach spolaryzowanej belki tensometrycznej oznaczonych jako A–/A+ po czym algorytm mikrokontrolera przelicza to napięcie na masę, jaką obciążono ten element. Wzorem niezbędnym do przeliczenia zmierzonego napięcia na masę jest wzór funkcji liniowej jak niżej:

gdzie:

y – wartość pokazywana na wyświetlaczu OLED [g],

x – napięcie mierzone poprzez wbudowany w układ HX711 przetwornik ADC,

a, b – współczynniki funkcji liniowej.

Zatem niezbędne jest wyznaczenie współczynników a i b funkcji liniowej. Aby tego dokonać należy znaleźć dwa punkty znajdujące się na wykresie szukanej funkcji liniowej. Załóżmy, że znamy dwie wartości napięcia mierzonego przez przetwornik HX711 odpowiadające masom 0 g i 1000 g. Te dwie wartości napięcia oznaczamy odpowiednio jako x0 i x1, zaś odpowiadające im wskazania urządzenia μScale, jako y0 i y1. Otrzymujemy następujące wzory:

gdzie:

y1 – wartość pokazywana na wyświetlaczu OLED dla masy 1000 g równa 1000,

y0 – wartość pokazywana na wyświetlaczu OLED dla masy 0 g równa 0,

x1 – napięcie mierzone poprzez wbudowany przetwornik ADC dla masy 1000 g,

x0 – napięcie mierzone poprzez wbudowany przetwornik ADC dla masy 0 g.

gdzie:

a – obliczony powyżej współczynnik kierunkowy funkcji liniowej.

Podstawiając powyższe wzory otrzymujemy:

gdzie:

y – wartość pokazywana na wyświetlaczu OLED [g],

x – napięcie mierzone poprzez wbudowany przetwornik ADC.

Montaż i uruchomienie

Schemat montażowy urządzenia pokazano na rysunku 4. Zaprojektowano dwustronną, niewielką płytkę drukowaną, która kształtem jest zbliżona do zastosowanego wyświetlacza OLED, a dodatkowo udostępnia niezbędne otwory montażowe. Warto również podkreślić, że dla zminimalizowania rozmiaru obwodu drukowanego przewidziano tutaj montaż elementów po obu stronach laminatu.

Rysunek 4. Schemat płytki PCB wraz z rozmieszczeniem elemetów, a) strona TOP, b) strona BOTTOM

Aplikację urządzenia rozpoczynamy od warstwy BOTTOM, gdzie przylutowujemy układ scalony U3 oraz elementy bierne. Następnie przechodzimy na warstwę TOP, na której montaż rozpoczynamy od wlutowania układów scalonych U1 oraz U2. Proces ten najłatwiej wykonać przy użyciu stacji lutowniczej na gorące powietrze (tzw. Hot Air) i odpowiednich stopów lutowniczych. Jeśli nie dysponujemy tego rodzaju sprzętem można również zastosować metodę z wykorzystaniem typowej stacji lutowniczej z użyciem dobrej jakości cyny z odpowiednią ilością topnika oraz dość cienkiej plecionki rozlutowniczej.

Następnie lutujemy pozostałe elementy dyskretne, a na końcu mikroprzełącznik PWR/RES oraz gniazda podłączeniowe SENSOR i PWR. Z uwagi na zagęszczenie wyprowadzeń układów scalonych przed pierwszym podłączeniem układu do zasilania należy jeszcze raz sprawdzić jakość wykonanych połączeń. Wspomniana kontrola będzie znacznie łatwiejsza, jeśli zmontowaną płytkę przemyjemy alkoholem izopropylowym w celu wypłukania nadmiaru kalafonii lutowniczej.

Na samym końcu, do tak przygotowanej płytki, montujemy wyświetlacz OLED, zwyczajnie lutując jego wyprowadzenia w przeznaczone do tego celu pola lutownicze (należy sprawdzić polaryzację zasilania), gdyż połączenia elektryczne zapewniają mu jednocześnie wystarczająco stabilny montaż mechaniczny. Na fotografii 1 pokazano zmontowane urządzenie tuż przed przylutowaniem wyświetlacza OLED.

Fotografia 1. Zmontowane urządzenie µScale tuż przed przylutowaniem wyświetlacza OLED

Belkę tensometryczną podłączamy do gniazda SENSOR posiłkując się schematem z rysunku 5. Poprawnie zmontowany układ powinien działać tuż po włączeniu zasilania.

Rysunek 5. Sposób podłączenia belki tensometrycznej do urządzenia µScale

Obsługa urządzenia

Po włączeniu zasilania (gniazdo PWR) urządzenie pracuje w trybie pokazywania wartości mierzonej (masy) przez układ HX711, przy czym ekran w tym trybie odświeżany jest 5 razy na sekundę. Aby wartość pokazywana na wyświetlaczu odzwierciedlała rzeczywistą masę, jaką obciążamy belkę tensometryczną niezbędna jest kalibracja urządzenia.

Kalibracja ta przebiega w dwóch krokach. W pierwszym z nich określamy wartość odpowiadającą masie 0 g. W drugim kroku określamy z kolei wartość odpowiadająca masie 1000 g. W tryb kalibracji wchodzimy poprzez długie naciśnięcie przycisku PWR/RES, przy czym już w momencie jego naciskania belka tensometryczna powinna pozostać nieobciążona (0 g), gdyż wciśnięciu i przytrzymaniu przycisku PWR/RES towarzyszy automatyczne zapisanie wartości zmierzonej odpowiadającej masie 0 g. Następnie obciążamy belkę tensometryczną masą 1000 g i ponownie wciskamy i przytrzymujemy przycisk PWR/RES.

Rysunek 6. Wygląd graficznego interfejsu użytkownika urządzenia µScale w trybie normalnym
Rysunek 7. Wygląd graficznego interfejsu użytkownika urządzenia µScale w trybie kalibracji

W tym momencie urządzenie zapisze w nieulotnej pamięci EEPROM mikrokontrolera wartość zmierzoną odpowiadającą masie 1000 g po czym wyjdzie z trybu kalibracji. Każdorazowe krótkie przyciśnięcie przycisku PWR/RES powoduje z kolei włączenie/wyłączenie urządzenia. Wygląd graficznego interfejsu użytkownika urządzenia μScale w trybie normalnym pokazano na rysunku 6, zaś na rysunku 7 pokazano wygląd stosownego interfejsu w trybie kalibracji.

Rober Wołgajew, EP

Wykaz elementów:
Rezystory: (SMD 0805)
  • R1, R2: 100 Ω
  • R3: 20 kΩ 1%
  • R4: 8,2 kΩ 1%
  • R5, R6: 4,7 kΩ
Kondensatory: (SMD 0805)
  • C1, C3…C5, C7, C8: ceramiczny X7R 100 nF
  • C2: ceramiczny X7R 10 µF
  • C6: ceramiczny X7R 1 µF
Półprzewodniki:
  • T1: BC807 (obudowa SOT23)
  • U1: HX711 (SO-16)
  • U2: ATtiny44 (SOIC14)
  • U3: TS9011SCX (SOT23)
  • OLED: wyświetlacz OLED 128×32 px, 0,91”, sterownik SSD1306, magistrala I2C, wymiary 38×12 mm
Inne:
  • PWR/RES: mikroprzełącznik SMD typu DTSM31NB
  • SENSOR: gniazdo męskie kątowe 4 pin (NS25-W4K)
  • PWR: gniazdo męskie kątowe 2 pin (NS25-W2K)
  • Belka tensometryczna 5 kg (MAVIN NA27)
Artykuł ukazał się w
Elektronika Praktyczna
czerwiec 2020
DO POBRANIA
Pobierz PDF Download icon

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik kwiecień 2021

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec 2021

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka Podzespoły Aplikacje marzec 2021

Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna marzec 2021

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich kwiecień 2021

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów