Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
NOVATEK-ELECTRO POLSKA SP. Z O.O.NOVATEK-ELECTRO POLSKA SP. Z O.O.
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Odczyt napięcia akumulatorów w Stringu 48x12V

20 Nov 2018 18:44 1161 34
  • Level 10  
    Rozpatruję układ, który umożliwi odczyt napięcia na każdym z akumulatorów podłączonych do UPSa w łańcuch składający się z okło 30-40, a nawet 50szt akumulatorów 12V. Odczyt były podczas rozładowania z zapisem na kartę pamięci. Zakładając, że dla każdego akumulatora zrobię dzielnik, to rozdzielczość będzie malała z każdym akumulatorem. Wyniosła by on kolejno:
    1. 12V / 1023 = 12mV
    2. 24V / 1023 = 23mV
    ..
    8. 96V / 1023 = 94mV

    I właściwie kończą się porty analogowe i chyba się kończy też sensowna rozdzielczość. Teoretycznie dla 16 portów Arduino Mega mamy rozdzielczość 192V / 1023 = 188mV.

    Reasumując, nie obsłużę tego jednym Arduino, wraz ze zwiększającą się ilością portów, tracimy na dokładności, która będzie i tak na pewno gorsza od teoretycznej rozdzielczości. Coraz większe napięcie - coraz trudniej (niebezpieczniej) uruchamiać układ. Izolacja itd... Zasilanie byłoby pobierane z pierwszego badanego akumulatora. Moce są duże, więc pobór byłby niezauważalny. Mam w głowie kilka rozwiązań:

    Reasumując musimy mieć kilka/naście niezależnych uC, które będą odczytywały napięcia ze swoich kilku aku i albo transmitowały to gdzieś centralnie, co byłoby wygodne, lub zapisywało sobie to lokalnie, każdy na swoją kartę, co nie byłoby wygodne. Zapis, co kilkanaście sekund. Celem pomiary byłoby wychwycenie, które akumulatory w stingu są słabsze, wyliczenie dla każdego rezystancji wewnętrznej itp.. Akumulatory są rzędu 100Ah i większe.

    Do obsłużenia jest kilka/-naście takich instalacji więc cena rozwiązania ma znaczenie.

    Rozważam, zatem aby arduino-slave komunikowały się a jakimś Arduino-Master i przekazywały mu dane pomiarowe, z izolacją galwaniczną. Do głowy przychodzą mi rozwiązania:
    - jakaś komunikacja szeregowa z izolacją galwaniczną na transoptorach,
    - jakaś komunikacja radiowa typu 433MHz/413MHz lub 2.4GHz
    - wrzutka danych przez WiFi na jakiegoś mastera (w tej opcji mógłby to być RasbberyPi w ostatecznośc,

    Pierwsza opcja:
    - magistrala I2C z optoizolacją? Ktoś stosował?
    - magistrala SPI z optoizolacją - chyba gorzej, bo dodatkowo jeszcze CS dla każdego Slave.

    Druga opcja.
    Oglądając, filmiki, że z pomoca modułów możemy jednokierunkowo przesyłać jakie dane, to sobie wyobraziłem, że np na 433MHz wysyłamy komunikat z numerem Slave, który ma nadawać (słuchają wszystkie Slave). A na 413MHz nadaje wskazany Slave. Teoretycznie łatwe, pod warunkiem, że dla wszystkich modułów 433MHz, będą dokładnie tak samo zestrojone i analogicznie wszystkie moduły 413MHz będą tak samo zestrojone. Para takich modułów to kilka PLN, więc wygląda obiecująco i nie ma sznurowanie pomiędzy Masterem a Slave.

    Trzecia opcja wygląda równie ładnie z powodu mniejszej ilości kabli i nie trzeba tworzyć swojego protokołu komunikacji radiowej, a jedynie wrzucać w jedno miejsce (iC/Rassbery czy inna Samba) wyniki.

    Obróbka wyników z kilka plików, to już pikuś.

    Doradźcie, gdzie czytać, może ktoś popełnił taką instalację etc...

    W grę wchodzi tez jakiś inny iC typu Nucleto STM32 itp... byle by to był gotowiec, nie chce mi się projektować i lutować całego układu na gołych kościach. Marzy mi się aby to był uC type Arduino Nano/mini, który jak się jeden spali przez złe podłączenie do dzielnika podczas montażu, to wymienimy na kolejny za kilka PLN.

    Jeszcze inna opcja to multipleksowanie wejść analogowych i transmisja po SPI (z multipleksera) z optoizolacją. Lub Optoizolacja np. z pomocą IL300, każdego akumulatora, ale to już byśmy wchodzili w iC, który ma odczytywać 40 wejść analogowych i chyba Arduino mogłoby tego nie przeżyć. Dużo kabli. Proste rozwiązanie na kilka aku, które można powielać mi się bardziej podoba.

    Jak wy byście zrobili pomiar napięcia 30-50 akumulatorów (a czasem dwa stringi równolegle, to wówczas x2 więcej aku). Dodatkowo można by z pomocą DS18B20 mierzyć temperaturę na każdym aku, bo może słabe aku się będą bardziej grzały.... W prototypie na kilka aku na pewno tak zrobię.
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • NOVATEK-ELECTRO POLSKA SP. Z O.O.NOVATEK-ELECTRO POLSKA SP. Z O.O.
  • Helpful post
    Moderator of Microcontroller designs
    Najprościej to użyć jakiegoś prostego i taniego mikrokontrolera i na każdy akumulator dać jeden taki moduł kontrolny. Będzie to kosztowało grosze. Ew. można zastosować jeden moduł na kilka akumulatorów. Akumulatory mogą zasilać mduły kontrolne (pobór prądu znikomy, więc nie będzie problemu). Do komunikacji - można użyć radia, ale będzie kłopot, energożerność, ale za to brak kabli. Można też zrobić np. optoizolowany UART. Czyli robisz tylko transmisję jednokierunkową, z optoizolacją - potrzebujesz na wszystkie moduły tylko dwa przewody - GND i Tx wspólny dla wszystkich. Aby nie występowały kolizje dodajesz jeszcze trzeci przewód do synchronizacji - też z optoizloacją - impuls podany na ten przewód synchronizuje nadajniki, które nadają kolejno w interwałach czasowych równych czasowi wysyłania pakietu danych razy numer nadajnika (dopóki numer będzie unikalny nie ma możliwości kolizji).
  • Level 17  
    Kiedyś miałem podobny problem i używałem ISO35T. Fajny układ rs485 bo ma izolację wewnątrz i przetwornice do transformatorka. Ogólnie transmisja RS485 z izolacją.
    Fragment schematu który używałem:
    Odczyt napięcia akumulatorów w Stringu 48x12VPrzechwyty..ie4.PNG Download (61.29 kB)
  • Level 10  
    tmf wrote:
    Najprościej to użyć jakiegoś prostego i taniego mikrokontrolera i na każdy akumulator dać jeden taki moduł kontrolny. Będzie to kosztowało grosze. Ew. można zastosować jeden moduł na kilka akumulatorów. Akumulatory mogą zasilać mduły kontrolne (pobór prądu znikomy, więc nie będzie problemu). Do komunikacji - można użyć radia, ale będzie kłopot, energożerność, ale za to brak kabli. Można też zrobić np. optoizolowany UART. Czyli robisz tylko transmisję jednokierunkową, z optoizolacją - potrzebujesz na wszystkie moduły tylko dwa przewody - GND i Tx wspólny dla wszystkich. Aby nie występowały kolizje dodajesz jeszcze trzeci przewód do synchronizacji - też z optoizloacją - impuls podany na ten przewód synchronizuje nadajniki, które nadają kolejno w interwałach czasowych równych czasowi wysyłania pakietu danych razy numer nadajnika (dopóki numer będzie unikalny nie ma możliwości kolizji).

    Czyli odkładając na razie optoizolację, powiedzmy, że Slave'y będą Arduino Nano.
    - łączę zatem u wszystkich Slave PIN1 (TX) i wpinam to do PIN0 (RX) w masterze,
    - jedno wyjście binarne w Masterze (np. PIN3) puszczam na wszystkie SLAVE, na jakieś wejście Binarne (np. PIN4).
    - co jakiś czas wystawiam jedynke na PIN3 w Masterze, co będzie oznaczało dla Slavów, że od tego momentu nadają, każdy z zadanym opóźnieniem odpowiednio dłuższym, aby nie weszły wspólnie na linię,

    W sumie bajecznie proste. Jesli to miałeś na myśli, to potwierdź. Jeszcze doradź, jak zrobić najprostszą optoizolację.

    Odległości będą rzędu 1-4m, tyle co na stojaku bateryjnym o wymiarach 2/0,4/2m mniej więcej, więc 485 chyba niepotrzebne.

    Dodano po 11 [minuty]:

    A może zamiast dedykowanego w MASTERZE i dodatkowej linii do startu nadawania, po prostu na porcie TX MASTERA wrzucać numer SLAVE, który ma odpowiadać. SLAVE odpowie tylko wówczas jeśli odczyta na UART swój numer? Oczywiście porty RX w SLAVE musiały by być wszystkie zwarte ze sobą.
  • NOVATEK-ELECTRO POLSKA SP. Z O.O.NOVATEK-ELECTRO POLSKA SP. Z O.O.
  • Helpful post
    Moderator of Microcontroller designs
    @marcingebus Tak, to miałem na myśli, z tym, że:
    - bezpośrendio pinów Tx nie możesz połączyć, gdyż użyty w Arduino procesor nie ma możliwości konfiguracji OD, dla pinu, więc byłoby zwarcie podczas nadawania i nic byś nie odebrał. Musi być transoptor, który przy okazji zrobi ci wired-AND na linii. Kolejna sprawa- możesz oczywiście Tx z mastera wykorzystać, doprowadzając ten sygnał do Rx slave'ów, tylko też będziesz potrzebował dodatkowego przewodu. Ale oczywiście za to otrzymasz zmożliwość dwukierunkowej komunikacji.
    Arduino nano to nawet przesada - IMHO zbędnie duże. Prościej zaprojektować własne PCB i wpakować tam jakiś mały procesorek, może ATTiny, lub coś innego (jeśli cena ma znaczenie). Płytka będzie miała nie więcej niż 4cm2, a jak się postarasz to mniej.

    Dodano po 6 [minuty]:

    Co do optoizolacji - cokolwiek, popatrz tylko, żeby użyty transoptor miał możliwie duże CTR. Przy masterze też można dać transoptor, tylko podłączony odwrotnie - tzn. dioda do linii Tx, dzięki czemu na całej magistrali będziesz miał transmisję opartą o pętlę prądową - dużo bardziej odporną na zakłócenia.
    No i jeszcze jedna rzecz - w sumie oczywista - masz sygnały sync, Tx i GND magistrali i co ważne - GND magistrali tylko podłączasz do wyjścia transoptora, w żadnym razie z lokalnym GND modułu. W sumie oczywiste... ale czasami robi się głupie błędy :)

    Dodano po 2 [minuty]:

    marcingebus wrote:
    A może zamiast dedykowanego w MASTERZE i dodatkowej linii do startu nadawania, po prostu na porcie TX MASTERA wrzucać numer SLAVE, który ma odpowiadać. SLAVE odpowie tylko wówczas jeśli odczyta na UART swój numer? Oczywiście porty RX w SLAVE musiały by być wszystkie zwarte ze sobą.

    Można, tylko Rx slave też musi być optoizolowane. Co stanowi pewnien problem - gdyż dioda transoptora pobiera pewien prąd, który będzie się multiplikował razy liczba slave'ów. Także Tx z mastera musi mieć możliwość oddawania sporego prądu - powiedzmy ok. 1 mA na slave, czyli dla 50 slave'ów, musisz mieć możliwość podania w impulsie >>50 mA.
  • Level 10  
    tmf wrote:
    wpakować tam jakiś mały procesorek, może ATTiny

    SLAVE mają mierzyć napięcie, więc muszą mieć wejścia analogowe, przynajmniej jedno wejście, a gdyby obsługiwały DS18B20, to my miał mniej kabelków bo pomiar napięcia byłby lokalny. Więc SLAVE by podawał aktualne napięcie i aktualną temperaturę.
    tmf wrote:
    sta - masz sygnały sync, Tx i GND magistrali

    Stosując UART w arduino (PIN0 i PIN1: TX/RX), stosujemy transmisje asynchroniczną. Gdzie to miejsce na sygnał synchronizacji/zegara?
  • Helpful post
    Moderator of Microcontroller designs
    marcingebus wrote:
    tmf napisał:
    wpakować tam jakiś mały procesorek, może ATTiny


    SLAVE mają mierzyć napięcie, więc muszą mieć wejścia analogowe, przynajmniej jedno wejście, a gdyby obsługiwały DS18B20, to my miał mniej kabelków bo pomiar napięcia byłby lokalny. Więc SLAVE by podawał aktualne napięcie i aktualną temperaturę.


    Nie ma problemu, najprostsze procki mają ADC, obsługa OW to też nie jest wyzwanie.
    marcingebus wrote:
    tmf napisał:
    sta - masz sygnały sync, Tx i GND magistrali


    Stosując UART w arduino (PIN0 i PIN1: TX/RX), stosujemy transmisje asynchroniczną. Gdzie to miejsce na sygnał synchronizacji/zegara?

    Myślałem o synchronizacji w sytuacji, w której robisz tylko jednokierunkową transmisję. Jeśli decydujesz się na dwukierunkową, to robisz analobicznie Rx, Tx i GND dla magistrali.
    BTW, jeśli decydujesz się na UART to pamiętaj, aby procek albo był taktowany z kwarcu, albo był to procek, który ma wystarczająco stabilny zegar wbudowany (co raz więcej procków ma stabilność oscylatora <1%, czyli wystarczającą do bezpośredniego taktowania UART).
  • Level 10  
    marcingebus wrote:
    tmf napisał:
    wpakować tam jakiś mały procesorek, może ATTiny

    SLAVE mają mierzyć napięcie, więc muszą mieć wejścia analogowe, przynajmniej jedno wejście, a gdyby obsługiwały DS18B20, to my miał mniej kabelków bo pomiar napięcia byłby lokalny. Więc SLAVE by podawał aktualne napięcie i aktualną temperaturę.

    Właśnie oglądam film : https://www.youtube.com/watch?v=LiQcVSPkT6M, aby się rozejrzeć czy może zamiast Arduino Nano/mini jednak jakiś scalak Attiny. Jest tego dużo. Aby komunikował się z jakimś masterem, to musiał by mieć obsługę seriala, a może I2C jestak, ponadawać adresy, wszystko na magistrali z optoizolacją i sprawa zamknięta?
  • Moderator of Microcontroller designs
    marcingebus wrote:
    Aby komunikował się z jakimś masterem, to musiał by mieć obsługę seriala, a może I2C jestak, ponadawać adresy, wszystko na magistrali z optoizolacją i sprawa zamknięta?

    O I2C zapomnij, skomplikowany protokół i na małe odległości. W dodatku linie data i scl są dwukierunkowe, co wprowadza dodatkowy kłopot przy optoizolacji. USART jest prosty - ATTiny też go mają (podobnie zresztą jak I2C). Ogólnie, jeśli istotne są rozmiary i to, że masz dedykowany produkt, to lepiej samemu zaprojektować cała elektronikę. Jeśli to może być trochę prowizorka, lub nie znasz sie na elektronice lub po prostu nie chcesz bawić się w lutowanie to modulik Arduino jest ok, na tym możesz w C napisać prostą aplikację, która zrobi to co oczekujesz. Tylko musisz się liczyć z tym, że do tego modułu Arduino i tak jakąś elektronikę musisz dostawić - i tak trzeba zrobić dzielnik napięcia, czy optoizolację. Więc wyjdzie ci PCB na PCB co IMHO nie ma sensu. Przy 50 sztukach nawet ekonomia zaczyna faworyzować własny projekt.
  • Helpful post
    Level 10  
    Jest sobie taki układ ADuM1301 z trzema kanałami TTL, do przesyłania sygnałów z Izolacją, ale czytam i czytam i nie rozumiem, jak duże może być napięcia pomiędzy stronami. Może ktoś wesprzeć?
    https://www.analog.com/media/en/technical-documentation/data-sheets/adum1300_1301.pdf

    Dodano po 3 [minuty]:

    SPI może z pomocą takiego ADMU1301 by poszło. CS'a można by załatwić programowo i pozostać przy liniach jednokierunkowych MOSI, MISO, SCK.
  • Helpful post
    Level 17  
    JanuszKornas wrote:
    jak duże może być napięcia pomiędzy stronami. Może ktoś wesprzeć?

    To chyba zależy według jakiej normyDIN V VDE V 0884-10 approval for 560 V.
    Wydaje mi się że rozwiązania i2C czy TTL przy transmisji na ileś metrów nie jest dobra.
    Do tego są gotowe rozwiązania np RS485. Są biblioteki gotowe na różne procki C, C++ itd. Są gotowe przejściówki RS485 na usb i gotowe oprogramowanie na PC gdzie można oglądać co się dzieje na magistrali.
    RS485 to standard elektryczny(warstwa fizyczna) a od strony softu to MODBUS byłby tu idealny.
    A jeśli nie druty to jest projekt pod WiFi ESP-EASY oprogramowanie darmowe.

    Jest układ
    MAX14852/MAX14854 2.75kV RMS Isolated 500kbps/25Mbps Full-Duplex RS-485/RS-422 Transceivers
    który ma nadajniki i odbiorniki linii.
    I wiele innych
    Link
  • Level 10  
    ekrzychoooo wrote:
    Wydaje mi się że rozwiązania i2C czy TTL przy transmisji na ileś metrów nie jest dobra.

    Wyobraźcie sobie stojak baterii stacjonarnych. Tutaj przykład, dla Baterii 2V (pierwszy przypadkowy z Googla):

    http://www.sklep.infomac.pl/infomac/images/dj...ools/10-stojaki-bateryjne/20150220_184931.jpg

    Linie będą takie długie jak odległości pomiędzy kolejnymi modułami, których ilość wymusi rozdzielczość pomiaru/bezpieczeństwo dzielnika napięcia, możliwości montażowe modułów na konkretnym stojaku. To nie będzie 15mb, a może 1mb, może 2mb. Może też być kilka cm jeśli instalacja to wymusi, wówczas będą dłuższe kable pomiarowe. Rozproszenie "modułów mierzących napięcie" ograniczyło by ilość kabli i tylko tyle.

    Wyobrażałem sobie, to tak, że dla bezpieczeństwa ciągłości zasilania, jakie zapewniają baterie, każdy kabelek z Baterii/modułu będzie zabezpieczony malutkim bezpiecznikiem 0,3A topikowym od strony baterii, a może nawet i po obu stronach. Bezpieczeństwo podawania zasilania z Baterii do urządzeń jest wielokrotnie większe niż pomiar napięcia. To nie jest projekt krytyczny, bo gdyby był, to jest kilka firm na świecie, co takie rzeczy realizuje, ale za straszne pieniądze i nie za bardzo chcą się chwalić, jak ich systemy dokładnie działają. A sprawa nie wydaje się jakoś bardzo skomplikowana. Chcę po godzinach szefowi pokazać, że "polak potrafi".
  • Level 17  
    Kilka podpowiedzi tu już padło.
    tmf wrote:
    Najprościej to użyć jakiegoś prostego i taniego mikrokontrolera i na każdy akumulator dać jeden taki moduł kontrolny. Będzie to kosztowało grosze.

    tmf wrote:
    O I2C zapomnij, skomplikowany protokół i na małe odległości. W dodatku linie data i scl są dwukierunkowe, co wprowadza dodatkowy kłopot przy optoizolacji.

    ekrzychoooo wrote:
    Wydaje mi się że rozwiązania i2C czy TTL przy transmisji na ileś metrów nie jest dobra.

    Na tym etapie to może narysuj jakiś ogólny schemat blokowy który by przedstawiał ogólną Twoją koncepcję. Na czymś trzeba oprzeć dyskusję.
    Ja zaproponowałem Ci RS485 czyli coś takiego:
    Odczyt napięcia akumulatorów w Stringu 48x12VPrzechwyty...anie22.PNG Download (25.82 kB)
  • Level 10  
    marcingebus wrote:
    Rozpatruję układ, który umożliwi odczyt napięcia na każdym z akumulatorów podłączonych do UPSa w łańcuch składający się z okło 30-40, a nawet 50szt akumulatorów 12V. Odczyt były podczas rozładowania z zapisem na kartę pamięci.

    Skoro na 10-bitach z Arduino jest za mała rozdzielczość, to może zamiast się bawić w optoizolację, to jakiś ADC, który ma większą rozdzielczość. Wszak nawet 50x12V = 600V - napięcie do ogarnięcia. Przy 16-bitowym ADC i napięciu pomiaru powiedzmy 2V 16-bit daje rozdzielczość 2V / 2^16bit = 0,03mV na wejściu ADC, co się przekłada na 9mV przed dzielnikiem (jeśli przyjąć przekładnię dzielnika 2:600).

    Jestem teoretykiem, ale mnie poprawcie, bo temat jest ciekawy w TME jest scalak MCP3422/3/4 4-kanały w rozdzielczości 18bit
    https://www.tme.eu/pl/details/mcp3424t-e_st/p...rniki-ad-uklady-scalone/microchip-technology/

    Może to jest rozwiązanie? Dzielnik /300 da nam z 600V, 2V, które ADC 18-bitowe zmierzy z rozdzielczością 7.5uV przy szumach 1.5uV. Te 7,5uV na wejściu ADC będzie odpowiadało napięciu na dzielniku 2,2mV. Chyba byłaby wystarczająca dokładność gdy chcemy zmierzyć jak akumulator schodzi z 13V na 9,5V i układ ma 4 kanały za 20zł, więc wychodzi po 5zł/kanał i do tego jeden kabelek do aku. Ilość portów w Arduino też nie wymaga za dużego, bo komunikacja po I2C.
  • Level 10  
    ekrzychoooo wrote:
    Na tym etapie to może narysuj jakiś ogólny schemat blokowy który by przedstawiał ogólną Twoją koncepcję. Na czymś trzeba oprzeć dyskusję.

    Z grubsza układ wygląda jak z załącznika, dla pomiaru napięć podczas rozładowywania dużego UPSa.

    Odczyt napięcia akumulatorów w Stringu 48x12V

    Ale mam teraz prostrzy przypadek do zbadania, to jest mamy małe auto elektryczne zasilane 8 akumulatorami 12V łącznie około 100VDC. Spróbuje zrobić, to dzielnikami na razie na tyle portów ile mam w Arduino Uno/Nano i zobaczymy co mi z tego wyjdzie. Ale gdyby ktoś miał fajny pomysł, to proszę o dalszą dyskusję.
  • Moderator of Microcontroller designs
    JanuszKornas wrote:
    marcingebus napisał:
    Rozpatruję układ, który umożliwi odczyt napięcia na każdym z akumulatorów podłączonych do UPSa w łańcuch składający się z okło 30-40, a nawet 50szt akumulatorów 12V. Odczyt były podczas rozładowania z zapisem na kartę pamięci.


    Skoro na 10-bitach z Arduino jest za mała rozdzielczość, to może zamiast się bawić w optoizolację, to jakiś ADC, który ma większą rozdzielczość. Wszak nawet 50x12V = 600V - napięcie do ogarnięcia. Przy 16-bitowym ADC i napięciu pomiaru powiedzmy 2V 16-bit daje rozdzielczość 2V / 2^16bit = 0,03mV na wejściu ADC, co się przekłada na 9mV przed dzielnikiem (jeśli przyjąć przekładnię dzielnika 2:600).

    Jestem teoretykiem, ale mnie poprawcie, bo temat jest ciekawy w TME jest scalak MCP3422/3/4 4-kanały w rozdzielczości 18bit


    No właśnie, nie obraź sie, ale jesteś teoretykiem :) Problem polega na tym, że jeśli mierzysz napięcia rzędu mikrowoltów, to dosłownie wszystko stara się zrujnować twój pomiar. Taka dokładność pomiaru to naprawdę spore wyzwanie i myślę, że wielu praktyków z doświadczeniem w takich pomiarach chętnie jeśli można nie szli by tą drogą. Policz chociażby szum na rezystorach dzielnika i porównaj go z mierzonymi wartościami...
    Poza tym 600V DC to jużnie byle co i chociażby ze względów bezpieczeństa jeśli można uniknąć takich napięć to należy to zrobić, szczególnie jeśli układ jest amatorski i nie będzie badany pod kątem bezpieczeństwa.
    IMHO zaproponowane rozwiązanie, tj. prosty procesor w optoizolowanym module mierzący napięcie jednego, max. paru sąsiednich akumulatorów, to rozwiązanie proste, tanie i bezpieczne. Nie ma więc co kombinować. Jeśli kryterim ceny nie gra większej roli to zaproponowane transceivery RS485 z wbudowaną optoizolacją spiszą się doskonale, jeśli cena ma jakieś znaczenie to układ na dwóch transoptorach, łącznie <2zł jest wystarczającym rozwiązaniem.
  • Level 10  
    Zrobiłem sobie pierwszy prototyp. Na razie jest INA199, która odczytuje prąd, oraz jeden pomiar napięcia. Mam podłączoną kartę SD oraz wyświetlacz Nokia 5110. Do tego jeszcze chciałem RTC, robiłem testy, ale Akumulator wybuchł był się, w wolnej chwili spróbuję dać CR2030. Zatrzymuję się na etapie, że mam ostrzeżenie od kompilatora, że za mało pamięci. Walczę już drugi dzień i na razie wypróbowałem 3 biblioteki do tego wyświetlacza i o ile wyświetlacz mi działał w miarę na bibliotece Adafruit_GFX.h+Adafruit_PCD8544.h, to się sypał zapis do plików i doszedłem, że może jednak pamięci brakuje. Więc spróbowałem bibliotekę Nokia_LCD, to o ile zapisy do plików są OK (nie ma komunikatu o braku pamięci, widać wyraźnie, że jest jej więcej), to sama biblioteka wyświetla mi pierwszy komunikat, a następnego już nie wyświetla. Próbowałem wczoraj inną bibliotekę do 5110 i było podobnie źle. Przykłądy z tych bibliotek działają prawidłowo. Jakies animacje itd....

    Możecie polecić jakąś bibliotekę do Nokii? Czy wszystkie są, albo niedopracowane, albo przeładowane zajętością i trzeba szukać czegoś innego.

    Wszystko to robię na klonie NANO.

    Dodano po 10 [minuty]:

    W programie robię tak:
    1. Wyświetlam komunikat "inicjalized Card..."
    2. Próbuję otworzyć plik na karcie do zapisu.
    3. Wyświetlam drugi komunikat, że się udało, albo nie udało otworzyć pliku - i tego napisu już nie ma.
    Jeśli używałem biblioteki Adafruit, to działało, ale chyba z braku pamięci dane w zmiennych się sypały i zapisywane były na karcie pamięci jakieś śmieci.

    Dodano po 30 [minuty]:

    Teraz sprawdziłem kolejną bibliotekę i tutaj ten sam problem z pamięcią. Biblioteka jest chyba jakaś Mega duża:
    -------------------
    Szkic używa 22006 bajtów (71%) pamięci programu. Maksimum to 30720 bajtów.
    Zmienne globalne używają 1986 bajtów (96%) pamięci dynamicznej, pozostawiając 62 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów.
    Niski poziom dostępnej pamięci, mogą wystąpić problemy ze stabilnością.
    -----------------
  • Moderator of Microcontroller designs
  • Helpful post
    Level 33  
    Tak, zapewne problemy wynikają stąd, że używasz Arduino, a nie dlatego, że nie masz pojęcia o programowaniu. Przykłady z bibliotek działają prawidłowo bo biblioteki są OK, po prostu nie umiesz z nich korzystać. To i tak świetny wynik, że po 5 dniach masz takie problemy. Przejdź na czysty C i daj znać kiedy będziesz na tym etapie. Wybrałeś sobie bibliotekę do Nokii z pełnym buforowaniem ekranu, OK, ekran jest graficzny 84x48 pixeli, czyli zajmuje to na dzień dobry 504 bajty RAM (1/4). Do tego kilka Twoich zmiennych (czy przykładowych wodotrysków z biblioteki) i połowa RAM procka zużyta. Napiszesz to samo w czystym C i cudu nie będzie, dalej bufor zajmie 504B. Tak samo z UART i SD, jeszcze normalna praca procka i z ram robisz sieczkę. Jak wiesz, że masz jakieś szczególne zastosowanie to można sobie wziąć bibliotekę bez buforowania, reszcie poobcinać, prymitywne czcionki i zajmie mniej. Albo robi się coś co Arduino najlepsze - zmieniasz na płytkę z większymi zasobami i jedziesz dalej do przodu. Nokia_LCD właśnie nie używa buforowania, jak ciężko się nauczyć jak jej używać (ma całe 12 funkcji/metod/keyword) to zacznij lepiej od kursu: https://forbot.pl/blog//kurs-arduino-podstawy-programowania-spis-tresci-kursu-id5290 . I oczywiście C jest lepsze dla AVR, ale trzeba go umieć, a start z AVR zajmie więcej czasu (linki do książek znajdziesz w tym wątku :D ). Korzystania z Arduino i programowania w ogóle też niestety trzeba się nauczyć.
    PS.
    Ustaw sobie kontrast tak by napisy były na czystym tle, u mnie np. najlepiej działa 40 ( lcd.setContrast(40); // Good values are usualy between 40 and 60).
    Code: c
    Log in, to see the code
  • Level 10  
    tmf wrote:
    Najlepiej porzuć tę drogę i napisz to w gołym C. Program magicznie się skróci. Do C też są gotowe biblioteki.

    Przecież w Android IDE pisze w C. Chyba masz na myśli, aby napisać własną bibliotekę do obsługi wyświetlacza Nokia 5110?

    Właśnie rozpocząłem wątek o samym wyświetlaczu i bibliotece do obsługi kart SD.
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=17584331#17584331
  • Moderator of Microcontroller designs
    marcingebus wrote:
    tmf napisał:
    Najlepiej porzuć tę drogę i napisz to w gołym C. Program magicznie się skróci. Do C też są gotowe biblioteki.


    Przecież w Android IDE pisze w C. Chyba masz na myśli, aby napisać własną bibliotekę do obsługi wyświetlacza Nokia 5110?

    Nie, Arduino (bo chyba to masz na myśli) używa C++. Niestety implementacja C++ na AVR jest w pewnych istotnych punktach bardzo słaba i stą dużo wyższe zapotrzebowanie na RAM,
    Przejście na C jest o tyle istotne, że prototyp możesz sobie zrobić na czymkolwiek, natomiast finalnych kilkadziesiąt płytek będziesz chciał zrobić na jakimś tanim procku i wtedy dostępne zasoby będą istotnym ograniczeniem. Do obsługi kart SD można użyć FATFS, który działa świetnie.
  • Level 10  
    marcingebus wrote:
    Właśnie rozpocząłem wątek o samym wyświetlaczu i bibliotece do obsługi kart SD.
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=17584331#17584331

    Z grubsza temat został opanowany. Teraz nie wiem ile pamięci zajmują mi zmienne w trakcie realizacji kodu. Są jakieś proste metody na taki debuging, typu: odczytuje jakiś rejestr i wiem ile zajęte/wolne? Albo jakieś przybliżone metody, jeśli nie ma dokładnych? Bo w planach jest jeszcze dodanie RTC i DS18b20.
  • Moderator of Microcontroller designs
    Owszem, ale nie są one proste. Pamięć zajętą statycznie można podglądnąć korzystając z narzędzi dostępnych w toolchainie gcc. POamięć zajętą przez stos i stertę tylko programowo, chyba, że masz debugger, wtedy można sobie zastawić pułapki na dostęp do pamięci.
  • Level 10  
    tmf wrote:
    Owszem, ale nie są one proste. Pamięć zajętą statycznie można podglądnąć korzystając z narzędzi dostępnych w toolchainie gcc. POamięć zajętą przez stos i stertę tylko programowo, chyba, że masz debugger, wtedy można sobie zastawić pułapki na dostęp do pamięci.


    Zadam inaczej pytanie: czy jeśli dla moich zmiennych braknie miejsca w pamięci, to:
    a) uC się zatrzyma, przestanie realizować wszystkie funkcje, czy
    b) wartości zmiennych, niektórych zaczną przyjmować przypadkowe wartości i się będę zastanawiał, czy przekroczyłem zakres czy inne licho.
  • Moderator of Microcontroller designs
  • Helpful post
    Level 31  
    marcingebus wrote:
    Teraz nie wiem ile pamięci zajmują mi zmienne w trakcie realizacji kodu. Są jakieś proste metody na taki debuging, typu: odczytuje jakiś rejestr i wiem ile zajęte/wolne?

    Wiedza ile ram jest zajęte w danej chwili niewiele daje, bo po tej chwili może być wysyłana funkcja z
    Code:

    char bufor[1000];

    Istotniejsze jest jakie jest max zapotrzebowanie na pamięć. W pierwszych rozkazach main() (setup) wypełnij sobie wolny obszar ram jakąś wartością, np 0 czy 0xFF, lub lepiej wzorem, np 0x00, 0xAA, 0x55, 0xFF, później w pętli głównej, co jakiś czas sprawdzaj jaki obszar został nietknięty.
    Adres obszaru "od góry" to niby wskaźnik stosu, ale w trakcie wypełniania ram będą wywoływane funkcje, które zajmują stos,więc nie wypełniaj do wskaźnika stosu, tylko o np 20 bajtów mniej.
    Od dołu, tu jest problem. C to nie ASM i ostatnia zadeklarowana zmienna nie musi być ostatnią. AVR-GCC ma jednak pewną cechę, że zmienne NOINIT umieszcza w ram jako ostatnie. Jak nie używasz NOINIT to zadeklaruj sobie taką zmienną i jej adres będzie ostatnim zajętym adresem ram.

    Prosto i łatwo robi się debugerem ale w Arduino to chyba niemożliwe. Widziałem płytki na AVR i ARM z debugerem, ale w IDE Arduino debugowania nie widziałem.

    Dodano po 26 [minuty]:

    marcingebus wrote:
    Zakładając, że dla każdego akumulatora zrobię dzielnik, to rozdzielczość będzie malała z każdym akumulatorem. Wyniosła by on kolejno:
    1. 12V / 1023 = 12mV
    2. 24V / 1023 = 23mV
    ..
    8. 96V / 1023 = 94mV

    Do pewnych wartości napięć nie musi spadać. Bez problemu znajdziesz wzmacniacze operacyjne na 36V, tak więc do 24V możesz mierzyć tylko napięcie drugiego akumulatora (wzmacniaczem różnicowym, czy odejmując napięcie poprzedniego akumulatora). Jak znajdziesz wzmacniacz na 40V, to bez starty możesz mierzyć napięcie trzech akumulatorów bez straty rozdzielczości. Istnieją wzmacniacze, które przy zasilaniu 5V mogą mierzyć napięcia do 40V, niestety są drogie a w tej aplikacji, ułatwiłyby realizację projektu.
    W każdym razie, nie musisz robić ośmiu układów pomiarowych izolowanych galwanicznie od mikrokontrolera, wystarczy, że zrobisz je trzy.

    Do izolacji transmisji, najtaniej transoptory, np szybki 6N137 albo układy ADUM, sa nawet takie co izolują I2C a nawet USB, niestety, tak tanie jak transoptory nie będą.
    Jeszcze opcja dla leniwych, ADUM1100, ale potrzebujesz 8 szt, a sztuka kosztuje chyba 20zł.

    Jeśli projekt miałbym zrealizować tanio, to rozpatrzyłbym 3 układy pomiarowe, izolacja na transoptorach. Szybkość transmisji nie jest istotna,więc nawet CNY17 może być.
  • Level 10  
    Realizuję podobny układ i poprzez złe podłączenie spaliłem już dwie przetwornice StepDown, jedno Nano, czytnik DS, 18B20.... (zasilanie z badanych aku).
    Jak zrealizowałeś/zrealizowalibyście zabezpieczenie elektroniki przed podaniem złej polaryzacji oraz zbyt dużego napięcia (np.48V zamiast 12V)?
    Wydaje się łatwe, ale jak to zrobić aby nie zaburzyć pomiarów.
  • Level 10  
    LChucki wrote:
    Bez problemu znajdziesz wzmacniacze operacyjne na 36V, tak więc do 24V możesz mierzyć tylko napięcie drugiego akumulatora (wzmacniaczem różnicowym, czy odejmując napięcie poprzedniego akumulatora). Jak znajdziesz wzmacniacz na 40V, to bez starty możesz mierzyć napięcie trzech akumulatorów bez straty rozdzielczości. Istnieją wzmacniacze, które przy zasilaniu 5V mogą mierzyć napięcia do 40V, niestety są drogie a w tej aplikacji, ułatwiłyby realizację projektu.


    Zainspirowany twoją wypowiedzią znalazłem Max4080. Można go kupić w TME za 11zł. Może mieć zasilanie do 70V !!. Na szybko narysowałem jak bym go podłączył, przy 15V, które może wystąpić na akumulatorze od biedy mogę mierzyć nim aż do piątego akumulatora. Narysowałem sobie taki schemat, jak bym to podłączył (dostępne w TME wersje są z mnożnikiem x60, u Mausera można zamówić z mniejszym mnożnikiem, ale chyba, lepiej/prościej mnożnik załatwić dzielnikiem napięcia:
    Odczyt napięcia akumulatorów w Stringu 48x12V

    W trakcie rysowania naszła mnie myśl czy można offse mierzonego napięcia "zgubić" szeregowo łączyć więzej układów Max4080, jak U11. Problem jest z ich zasilaniem, ale to by można obejść, chyba jakimś stabilizatorem dodatkowym względem Ux, zamiast względem GND.

    Jak sądzicie miałby szansę działać taki układ?
  • Level 17  
    Ten układ ma Input Bias Current max 12uA. Dodatkowe napięcie na RS+ można pominąć bo niska rezystancja aku. Na wejściu RS-
    Uin(od I bias) = 1.5K * 12uA = 18mV
    DeltaUout = 18mV*5 = 90mv.

    Ten układ zaprojektowany do pomiaru prądu płynącego przez mały rezystor więc Iinput bias jest bez znaczenia bo
    12uA*10mOhm = praktycznie zero.

    Może warto to przetestować w jakimś programie typu SPICE.

    Można by dodać na wejście RS+ rezystor równy R49||R54 ale dalej nie wiadomo jaka jest zależność Ibias od temperatury, pdf nie podaje tego bo to w typowej aplikacji bez znaczenia.
    TI w swoich pdf podaje wpływ rezystancji szeregowych na wejściach na błąd pomiaru np Link strona 14.

    Na stronie Link są modele tych MAX4080 np MAX4080F