Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Tester/zadajnik pętli prądowej 4-20mA

Mkrasuski 08 Lis 2017 01:34 3423 24
  • Dzień Dobry

    Od jakiegoś czasu, po blisko 20 latach przerwy, wróciłem do majsterkowania i elektroniki i muszę przyznać, że zafascynowały mnie dzisiejsze możliwości jakie oferuje się hobbystom.
    Dostępne dla amatorów technologie, dostęp do wiedzy i możliwości zaopatrzenia się w narzędzia i materiały są zupełnie inne niż przed laty.
    Ostatnich kilkanaście miesięcy próbuję sił w programowaniu mikrokontrolerów, ale nauka języka C grubo po czterdziestce wcale nie jest taka łatwa i krótko mówiąc idzie mi dość opornie.

    Chciałbym zaprezentować tester/zadajnik pętli prądowej 4-20mA jaki zbudowałem i już jakiś czas wykorzystuję w swojej codziennej pracy.

    Tester/zadajnik pętli prądowej 4-20mA


    Przeznaczenie
    Tester umożliwia symulowanie nadajnika (czujnika) w dwuprzewodowej pętli prądowej 4-20mA i wymuszenie przepływu prądu w pętli zgodnie z wartością nastawioną na wyświetlaczu.
    Urządzenie pobiera zasilanie z pętli, podobnie jak typowy czujnik/przetwornik z wyjściem 4-20mA.
    Tester może być też użyty jako zadajnik w falowniku – do utworzenia pętli prądowej trzeba wtedy wykorzystać napięcie +24V dostępne zwykle na złączu sterowania falownika.
    Tester/zadajnik pętli prądowej 4-20mA


    Zasada działania
    Układ wykorzystuje nadajnik pętli prądowej Texas Instruments XTR117 (current loop transmitter) współpracujący z tranzystorem Q1 jako elementem wykonawczym. Jego szczegółowa zasada działania jest b. dobrze opisana w [1]. Transmiter XTR117 sterowany jest prądowo (z przekładnią 100) z przetwornika C/A typu DAC8560.
    Przetwornik C/A i wyświetlacz LCD sterowane są przez ATTINY44A. Do kontroli urządzenia przez użytkownika wykorzystany został enkoder obrotowy.
    Urządzenie pobiera zasilanie z pętli prądowej 4-20mA. Rzeczywisty pobór prądu to ok. 1,16mA.
    XTR117 wyposażony jest w wewnętrzny stabilizator 5V zasilany z pętli ale napięcie zasilania obniżone zostało do 3,3V stabilizatorem U2 aby ograniczyć pobór prądu przez wyświetlacz, procesor i przetwornik C/A.
    Tester/zadajnik pętli prądowej 4-20mA






    Funkcje przyrządu:
    Pokrętło (enkoder): zmiana nastawy prądu na wyświetlaczu w krokach 0,01mA lub 0,10mA w zależności od prędkości obrotu pokrętła
    Przycisk: krótkie wciśnięcie: przełączenie pomiędzy bieżącą nastawą prądu a min=3,5mA
    długie wciśnięcie: zmiana bieżącej nastawy na 4,00mA

    Parametry
    Zasilanie: 9-33V (zasilanie z pętli, pobór prądu ok.1,2mA)
    Zakres: 3,50..22,50mA
    Rozdzielczość: 0,01mA
    Dokładność: lepsza niż 0,006 mA w zakresie 3,50..22,50mA

    Firmware
    Oprogramowanie napisane zostało w języku C w Atmel Studio 7.0.
    ATTINY44A taktowany jest zegarem 1MHz.
    Zastosowany został moduł wyświetlacza LCD ze sterownikiem zgodnym z HT1621 i wejściem szeregowym podobnym do SPI. Wybór wyświetlacza został podyktowany jego małym poborem prądu i wysokim kontrastem przy pracy bez podświetlenia.
    Ponieważ sterownik wyświetlacza wymaga w pewnym momencie przesłania komendy o długości aż 9 bitów nie dałem rady wykorzystać wbudowanego w ATTINY modułu szeregowego i procedura obsługi SPI została napisana w języku C (bit banging).
    Bardzo ważne jest, aby przy zasilaniu 3,3V częstotliwość zegara interfejsu SPI wyświetlacza LCD była mniejsza niż 150kHz. Jest to co prawda opisane w karcie katalogowej sterownika HT1621 ale przeoczyłem to w pierwszej chwili i potem długo drapałem się po głowie bo wyświetlacz nic nie wyświetlał. W wersji finalnej częstotliwość zegara SPI ustalono na poziomie około 40kHz.
    Analogiczna procedura napisana w języku C obsługuje też interfejs SPI przetwornika DAC.
    Tutaj warto zwrócić uwagę, że dane wysyłane do przetwornika należy poprzedzić wysłaniem liczby 0x00, odpowiedni diagram w karcie katalogowej układu DAC8560 może być mylący.

    Praktycznie cały program wykonywany jest w cyklicznym przerwaniu zegarowym.
    Co ok. 1ms odczytywany (próbkowany) jest stan enkodera i zapisywany jako liczba 2-bitowa w 8-bitowym buforze FILO, który mieści próbkę bieżącą i trzy poprzedzające próbki.
    Program reaguje na konkretne wartości danych w buforze FILO (sekwencje próbek) i w ten sposób wykrywa początek i koniec impulsu enkodera w lewo lub w prawo. Jednocześnie zliczana jest ilość próbek pomiędzy sekwencją początku i końca impulsu enkodera co pozwala określić szybkość obrotu.
    W podobny sposób wykrywany jest stan przycisku enkodera ale tutaj mamy 8 próbek 1-bitowych.
    Wyświetlacz i przetwornik C/A odświeżane są co ok. 50ms. Cykl nadawania danych do LCD i przetwornika trwa ok. 1,5ms.
    Tester/zadajnik pętli prądowej 4-20mA


    Chętnie poznam Wasze komentarze dot. programu i pomysły na poprawienie jego „jakości”.
    Nie jestem zadowolony ze sposobu synchronizacji zdarzeń w programie oraz rozwiązań w zakresie uzależnień czasowych np. wydłużona obsługa przerwania powoduje gubienie próbek stanu enkodera.
    Mam ciągle problemy z bardzo elementarnymi rzeczami w C i cierpi na tym czytelność i przejrzystość. Ale przynajmniej skompilował się bez błędów i ostrzeżeń.

    Montaż
    Wszystkie elementy testera/zadajnika zainstalowane są na dwustronnej płytce drukowanej i umieszczone w gotowej plastikowej obudowie, w której wycięte zostały otwory na wyświetlacz i enkoder.
    W wyświetlaczu LCD, przy zasilaniu 3,3V należy wymienić zamontowany fabrycznie rezystor ustalający kontrast wyświetlacza 0805 47kΩ na 1kΩ. Sam wyświetlacz umieszczony jest ponad płytką, na nylonowych wspornikach, bezpośrednio pod wyciętym otworem w obudowie.
    Z boku obudowy, przez gumowy przepust wyprowadzone zostały przewody przyłączeniowe wyposażone w sprężynowe końcówki pomiarowe (test grip).
    Tester/zadajnik pętli prądowej 4-20mA

    Tester/zadajnik pętli prądowej 4-20mA


    Kalibracja
    Istotna dla dokładności przyrządu jest rzeczywista wartość Uref przetwornika DAC i dokładność rezystorów, a przede wszystkim dokładność rezystora R1 o wartości 11kΩ
    Po zmierzeniu Uref dokładnym woltomierzem, wymaganą rezystancję R1+R2+R3 można wyznaczyć ze wzoru:
    R = Uref * 29/65535 * 1e+7 [Ω]


    Początkowo użyłem woltomierza 0,5% i dobierałem rezystancję z rezystorów o tolerancji 1%. Osiągane rozbieżności wynosiły około 0,03..0,04mA w całym zakresie prądowym 3,50..22,50mA. Wartość prądu w pętli weryfikowałem miernikiem FLUKE 772 (pomiar z rozdzielczością 0,01mA).
    Kiedy użyłem multimetru 5.5 cyfry 0,015% do pomiaru Uref i rezystora 11kΩ o tolerancji 0.1% (pozostałe rezystory o tolerancji 1%) rozbieżności pomiędzy nastawami i wartościami prądu zmierzonymi tym multimetrem nie przekroczyła 6µA w całym zakresie pomiarowym.

    Koszty/zaopatrzenie:
    Koszty wykonania prototypu przedstawiają się następująco:
    wyświetlacz LCDTinsharp TF4-8B(R) $ 2,50 Aliexpress
    4-20mA loop transmitterXTR117AIDGKT $ 2,60 TI Store (przesyłka gratis)
    przetwornik DACDAC8560ICDGKT $ 8,50 TI store (przesyłka gratis)
    mikrokontrolerATTINY44A $ 0,47 Aliexpress
    stabilizator 3V3LP2985AIM5-3.3 $ 0,12 Aliexpress
    tranzystor npnBCP56 $ 0,20 Aliexpress
    rezystor 11k 0.1%MCWF08R1102BTL $ 0,66 Farnell + koszt przesyłki
    enkoder obrotowy $ 0,40Aliexpress
    PCB $ 1,50 easyEDA + koszt przesyłki
    obudowa $ 0,90 Aliexpress
    Pozostałekondensatory, złącza itd. $ 1,00 Aliexpress
    Razem: $ 18,85

    Podaję w $ ponieważ tak płaciłem praktycznie za wszystko.
    Sporo elementów było kupowane w większych ilościach np. po 10szt ale podaję ceny jednostkowe, a koszty przesyłki rozłożyłem pomiędzy pojedyncze sztuki.
    Przetwornik DAC8560 otrzymałem jako darmową próbkę.

    Dokumentacja
    Dokumentacja została przygotowana w środowisku easyEDA i tam też zamówiłem PCB.
    W załączeniu schemat i projekt płytki drukowanej (wersja poprawiona w stosunku do prototypu ze zdjęć) wyeksportowane z tego środowiska.
    CL_tester-...171107.zip Download (56.13 kB)
    Current_lo....11.07.zip Download (53.97 kB)

    Materiały źródłowe
    Noty aplikacyjne i „reference designs”:
    Texas Instruments: SLAU526, TIDU299, TIDUAO7 [1]
    Analog Devices: AD5420 datasheet, CN-0270, CN-0278
    i oczywiście: T.Francuz “ Język C dla mikrokontrolerów AVR od podstaw do zaawansowanych aplikacji”


    Fajne!
  • #2 08 Lis 2017 07:33
    Tomq
    Poziom 38  

    Starannie wykonana konstrukcja, bardzo dobry opis i świetna tabela z wyszczególnieniem kosztu elementów.

    Cytat:

    Praktycznie cały program wykonywany jest w cyklicznym przerwaniu zegarowym.

    Co do samego programu, to podstawowa zasada jest taka by przerwanie trwało jak najkrócej. W przerwaniu powinieneś tylko zapisywać wynik pomiaru i przetwarzać go w pętli głównej, a po zakończeniu obróbki usypiać mikrokontroler.

    Cytat:

    Co ok. 1ms odczytywany (próbkowany) jest stan enkodera i zapisywany jako liczba 2-bitowa w 8-bitowym buforze FILO, który mieści próbkę bieżącą i trzy poprzedzające próbki.

    Na pewno 2-bitowa, a nie 2-bajtowa?

  • #4 08 Lis 2017 11:37
    Mkrasuski
    Poziom 12  

    Na pewno 2-bitowa.
    Enkoder ma dwie końcówki - to dwa kolejne piny w uC czyli dwa bity
    Zmienna (bufor) ma 8 bitów i mieści cztery takie dwubitowe próbki w kolejnych bitach.
    Działa to tak:
    bufor jest przesuwany dwa bity w lewo,
    po lewej tracone są dwa bity najstarszej próbki,
    po prawej stronie powstaje miejsce na dwa bity z bieżącej próbki

    Seria 2-bitowych próbek z impulsem enkodera w lewo może np. wyglądać tak:
    3-3-3-3-2-2-2-0-0-1-1-1-1-3-3-3
    Jeżeli impuls enkodera jest dłuższy to próbek będzie więcej, czyli np.
    3-3-3-3-2-2-2-2-2-2-2-2-0-0-0-0-0-0-0-0-1-1-1-1-1-1-1-1-3-3-3-3-3-3

    W buforze mieszczą się tylko cztery próbki więc jeśli np. chcemy wykryć początek impulsu enkodera w lewo to interesują nas "zmiany z 3 na 2"
    czyli sekwencje w rodzaju:
    1-3-3-2 lub 2-3-3-2 lub 3-3-3-2
    co liczbowo przedstawia się jako 0x7E lub 0xBE lub 0xFE i takich wartości szukamy w funkcji switch...case

    Podobnie poszukuje się w buforze sekwencji końca impulsu w lewo, tylko że tutaj reagujemy na "zmiany z 1 na 3"

    Enkoder potrafi "śmiecić". Przyznam, że byłem zaskoczony oglądając pierwszy raz rzeczywiste przebiegi z enkodera.

    Tester/zadajnik pętli prądowej 4-20mA

    Stosując bufor i odpowiednio gęste (ale nie za gęste) próbkowanie oraz reagując tylko na wybrane sekwencje odfiltrowuje się te zakłócenia.

    Pozdrawiam i dziękuje za miłe słowa

    MK

  • #6 08 Lis 2017 13:07
    R-MIK
    Poziom 38  

    Robiłem kilka takich pętli prądowych, na użytek analogowego demultipleksera DMX. Użyłem zwykłych wzmacniaczy operacyjnych, sterowanie z PWM, a nie drogiego specjalizowanego układu i zewnętrznego DAC. Wyświetlacz, cóż, ja bym dał LCD bez sterownika, tyle, ze trzeba dać uC z większą liczba wyprowadzeń.

  • #7 08 Lis 2017 14:18
    M. S.
    Poziom 34  

    Cytat:
    Ostatnich kilkanaście miesięcy próbuję sił w programowaniu mikrokontrolerów, ale nauka języka C grubo po czterdziestce wcale nie jest taka łatwa i krótko mówiąc idzie mi dość opornie.


    Może trochę nie na temat, ale chciałem wspomóc kolegę w nauce programowania stwierdzając, że mam już 54 lata i nie przeszkadza mi to żeby na przyzwoitym poziomie programować ARM'y. Kolego, wiek tu nie jest żadnym tłumaczeniem. Uczyć się trzeba do śmierci. Pozdrawiam.

  • #8 08 Lis 2017 15:31
    Mkrasuski
    Poziom 12  

    M. S. napisał:
    Może trochę nie na temat, ale chciałem wspomóc kolegę w nauce programowania stwierdzając, że mam już 54 lata i nie przeszkadza mi to żeby na przyzwoitym poziomie programować ARM'y. Kolego, wiek tu nie jest żadnym tłumaczeniem. Uczyć się trzeba do śmierci. Pozdrawiam.


    Jeszcze raz dziękuję za miłe słowa otuchy

    To nie jest tak, że nie lubię się uczyć.
    Wykonuję zawód techniczny, dość pokrewny i przyswajanie nowej wiedzy jest tu raczej regułą i koniecznością.
    Widzę to tak, że w programowaniu nie przeskoczyłem jeszcze jakiejś masy krytycznej po której "wszystko staje się łatwiejsze"
    Same zasady języka C i zasady działania µC są stosunkowo zrozumiałe, ale nie potrafię "przenieść się na wyższy poziom abstrakcji", na którym możliwe jest np. zrozumienie i skorzystanie z dorobku innych, z tych wszystkich bibliotek, framework-ów i API. Ciągle odbieram to jak oglądanie filmu od połowy kiedy rozumiem poszczególne sceny ale nie daję rady zorientować się w fabule.
    Kontynuując tę analogię: na razie potrafię sfilmować krótkie proste amatorskie scenki, a przy tym bez przerwy się gubię i często brnę w niepotrzebne szczegóły albo wprost odbijam się od ściany kończąc na "nie rozumiem"
    Program do zadajnika pisałem jakieś 5-6 tygodni i ciągle pamiętam głupie błędy jakie popełniałem, a sam efekt końcowy też mnie nie zachwyca - wyobrażałem sobie coś bardziej uniwersalnego, strukturyzowanego i "event driven" a wyszedł trochę bałagan, tyle że działający.

    Pozdrawiam Forumowiczów

  • #9 08 Lis 2017 16:14
    jaclew
    Poziom 15  

    Mkrasuski napisał:
    Wykonuję zawód techniczny, doœć pokrewny i przyswajanie nowej wiedzy jest tu raczej regułš i koniecznoœciš.
    Widzę to tak, że w programowaniu nie przeskoczyłem jeszcze jakiejœ masy krytycznej po której "wszystko staje się łatwiejsze"
    Same zasady języka C i zasady działania ľC sš stosunkowo zrozumiałe, ale nie potrafię "przenieœć się na wyższy poziom abstrakcji",


    Mam tak samo z C, kiedyœ miałem podstawy na studiach, kilka lat temu widząc jakie są nowe narzędzia i możliwoœści technologiczne dla amatorów,
    zabrałem się poważniej za moje hobby sprzed lat. Na razie bawię się platformą Arduino, powoli coraz więcej wsadzam w kod instrukcje języka C.
    Co do projektu - oprogramowanie w Twoim wykonaniu to dla mnie na razie niedośœcigniony wzór do naśœladowania.
    Widać w tym przemyœlaną koncepcję, staranną analizę. Szacunek. I nie ma co być tak skromnym, że C to słaba strona u kolegi :)

    Wykonanie też profesjonalne, użycie enkodera dopełnia tego obrazu.
    Szkoda tylko, że LCD nie ma podœświetlenia.
    Kondensator C1 jest jakoś dobierany doświadczalnie?

  • #10 08 Lis 2017 16:50
    Mkrasuski
    Poziom 12  

    jaclew napisał:
    Szkoda tylko, że LCD nie ma podœświetlenia.
    Kondensator C1 jest jakoś dobierany doświadczalnie?


    Kol. jaclew

    Podświetlanie LCD i zasilanie z pętli 4-20mA wykluczają się - nie starcza mocy.
    Na początku pracy nad projektem rozważałem zastosowanie przetwornicy buck (np. LM5165) lub pompy ładunkowej (LTC3255).
    Potem siadłem do Excella i wszystko się rozjechało.
    Jeżeli chcemy utrzymać szeroki zakres napięć zasilania (gł. minimalne napięcie zasilania pętli tzw. compliance voltage, u mnie ok. 9V) to w najlepszym przypadku 2-3V (a częściej 5-6V i wtedy trzeba podnieść napięcie zasilania pętli) tracimy na odbiorniku sygnału i przewodach pętli.
    To co zostaje u nas na zaciskach wykorzystujemy do zasilania, czyli mamy do dyspozycji w skrajnie niekorzystnym przypadku w okolicach 7V * 3,5mA a to już nie wystarczy na podświetlenie i pozostałe układy.

    Na końcu opisu konstrukcji zamieściłem odniesienie do materiałów źródłowych, to z nich czerpałem "natchnienie" do budowy układu i członu wejściowego.
    Piszą tam o kondensatorze 10nF z uwagi na "EMC compliance" ale nie podają źródła - to pewnie jakaś norma przemysłowa lub "dobre praktyki"

  • #11 08 Lis 2017 17:10
    Mikroprocesorowiec
    Poziom 11  

    Zamiast

    Kod: c
    Zaloguj się, aby zobaczyć kod

    do opóźnień używaj
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jak dostawiasz nopy (czasem nie ma innego rozsądnego rozwiązania) to opóźnienie zależy od częstotliwości taktowania mikrokontrolera, juk użyjesz _delay, to to zależność (najczęściej) nie występuje.

    Strasznie rozbudowana ta funkcja obsługi eknodera. To mozna zrobic na jednym INT. Czasem trzeba się wspomóc dodatkowym timerem (sprzętowym lub programowym) ale przy 1MHz, pewnie takiej konieczności by nie było.

  • #12 08 Lis 2017 17:15
    __Maciek__
    Poziom 19  

    Bardzo fajny projekt.

    Kiedyś też popełniłem zadajnik na XTR117 ... z tą różnica, że zamiast DAC zwykły potencjometr. Wystarczyło mi że działa i zadaje prąd od ok. 3,5mA do ok 24mA ... skala brutalnie narysowana ręcznie na obudowie. Plus Mojego rozwiązania to wbudowana ładowarka, ogniwo Li-Ion i przetwornica na 24VDC. Dzięki temu nie muszę nosić ze sobą baterii, mogę symulować wszystko z jednego urządzenia mieszczącego się w kieszeni. ( przydało mi się szczególnie do testowania zaworów, a możliwość odpalenia zaworu z dodatkowym zaworkiem elektromagnetycznym dla systemów SRS ( safety related systems) to bajka .. sam zadajnik wystarczy aby załączyć cewkę, oraz wysterować zawór żadnych dodatkowych baterii, akumulatorów .... ). Przydaje się to szczególnie podczas rozruchów mechanicznych ... gdy mechanicy przychodzą i proszą o otwarcie poszczególnych zaworów. Dlatego dokładność nie była/jest potrzebna.

    Myślałem nad rozbudową o pomiar + bajery .... coś na wzór chińskich zadajników ( 4-20mA , 0-10V , PT100, TC, mV itp .. ) ale czasu mało i dużo innych tematów.

    Niemniej gratulacje !

  • #13 08 Lis 2017 20:55
    Janusz_kk
    Poziom 13  

    BK_klp napisał:
    Moim zdaniem mamy nowego lidera w konkursie.

    Bez przesady, tak jak kolega R-MIK napisał można to zrobić znacznie prościej,
    kod programu także daleki jest od kanonu pisania dobrych programów.

  • #14 09 Lis 2017 08:08
    ^ToM^
    Poziom 29  

    Janusz_kk napisał:
    BK_klp napisał:
    Moim zdaniem mamy nowego lidera w konkursie.

    Bez przesady, tak jak kolega R-MIK napisał można to zrobić znacznie prościej,
    kod programu także daleki jest od kanonu pisania dobrych programów.


    No tak, ale konkurs nie polega przecież na tym, że ktoś będzie oceniał, czy nie da się programu napisać prościej. Można to pewnie zrobić nawet jeszcze prościej niż napisał R-MIK, tylko po co. Ocena kodu to czynność czysto subiektywna. Dla jednego kod będzie poprawny, inny będzie widział że to i owo można by ulepszyć a trzeci powie, że cały kod jest do bani. Przecież tu nie o to chodzi.
    Moim zdaniem projekt b. fajny, najważniejsze że urządzenie działa i spełnia pokładane w nim przez autora nadzieje.

    Pozdrawiam!
    Tomek

  • #15 09 Lis 2017 17:53
    acctr
    Poziom 12  

    Ja mam pytanie odnośnie PCB z EasyEDA - jaki poniosłeś koszt sumaryczny za wykonanie PCB (czyli koszt płytek i wysyłka) oraz jak długo czekałeś na przesyłkę.
    No i czy jesteś zadowolony z jakości wykonania PCB (laminat, przelotki, itp)?

    Natomiast co do programu to zgodzę się z opiniami wyżej, że w przerwaniu powinno się jak najmniej wrzucać i całkowicie unikać wywołań funkcji z wnętrza ISR. Przykładowo w Twoim programie jest taki przepływ:
    ISR -> LCD_code_to_ASCII() -> itoa()
    gdzie w itoa jest wypełniany jakiś bufor. Tutaj akurat przerwanie jest regularnie co jakiś czas i procesor się wyrobi ze wszystkim.
    Ale to jest potencjalnie niebezpieczny flow, ponieważ nadejście kolejnego przerwania może nadpisywać bufor.
    Możesz to zmienić z minimalnym nakładem pracy - przenosząc cały kod z ISR do jakiegoś if-a umieszczonego w pętli głównej. W warunku if-a umieścić flagę, która będzie ustawiana w ISR a kasowana na wyjściu z if-a.

  • #16 09 Lis 2017 18:20
    Janusz_kk
    Poziom 13  

    acctr napisał:
    Ja mam pytanie odnośnie PCB z EasyEDA - jaki poniosłeś koszt sumaryczny za wykonanie PCB (czyli koszt płytek i wysyłka) oraz jak długo czekałeś na przesyłkę.


    Na allpcb zrobią Ci to w max 5 dni z wysyłką, a za płytki do 100mm zapłacisz 5$+0 wysyłka :) o tu cytat od obeznanej osoby
    "Płytki do 100x100 kosztują 5$ z kosztami przesyłki (kurier 48h) "

  • #17 09 Lis 2017 19:25
    tmf
    Moderator Mikrokontrolery Projektowanie

    acctr napisał:
    Ja mam pytanie odnośnie PCB z EasyEDA - jaki poniosłeś koszt sumaryczny za wykonanie PCB (czyli koszt płytek i wysyłka) oraz jak długo czekałeś na przesyłkę.
    No i czy jesteś zadowolony z jakości wykonania PCB (laminat, przelotki, itp)?

    Natomiast co do programu to zgodzę się z opiniami wyżej, że w przerwaniu powinno się jak najmniej wrzucać i całkowicie unikać wywołań funkcji z wnętrza ISR. Przykładowo w Twoim programie jest taki przepływ:
    ISR -> LCD_code_to_ASCII() -> itoa()
    gdzie w itoa jest wypełniany jakiś bufor. Tutaj akurat przerwanie jest regularnie co jakiś czas i procesor się wyrobi ze wszystkim.
    Ale to jest potencjalnie niebezpieczny flow, ponieważ nadejście kolejnego przerwania może nadpisywać bufor.
    Możesz to zmienić z minimalnym nakładem pracy - przenosząc cały kod z ISR do jakiegoś if-a umieszczonego w pętli głównej. W warunku if-a umieścić flagę, która będzie ustawiana w ISR a kasowana na wyjściu z if-a.


    Dyskusja OT, ale warto sprostować kilka nieprawidłowych tez z twojej wypowiedzi. Po pierwsze dla zwykjlego ISR (bez NO_BLOCK) kolejne przerwanie niczego nie nadpisze, bo nie zostanie obsłużone dopóki obsługa bieżącego się nie zakończy. W zwykłych AVR, z jednopoziomową obsługa przerwań typowo nie ma więc problemu. Funkcje ISR powinny być możliwie krótkie, ale nie należy ich skracać za wszelką cenę. Np. proponowane wyrzucenie części ciała ISR poza i umieszczenie w pętli głównej z testownaiem flagi to w większości przypadków zła rada i takie działanie najczęściej nie ma sensu.
    Programista powinien sobie mniej więcej zdawać sprawę ile trwa wykonanie ISR, uwzględnić jak często ISR są wykonywane i jaka jest dla całej aplikacji wymagana latencja przerwań i responsywność reszty kodu.

  • #18 09 Lis 2017 20:31
    Mkrasuski
    Poziom 12  

    R-MIK napisał:
    Robiłem kilka takich pętli prądowych, na użytek analogowego demultipleksera DMX. Użyłem zwykłych wzmacniaczy operacyjnych, sterowanie z PWM, a nie drogiego specjalizowanego układu i zewnętrznego DAC.


    Obiecałem sobie nie komentować niewiele wnoszących postów ale zaintrygowany spojrzałem do projektu DMX multiplexer i do jego programu.

    Zastosowany tam został układ tzw. pompy Howlanda i pomysłowy układ polaryzacji -4V do przesunięcia zakresu prądu wyjściowego.
    Program jest bardzo przejrzysty, b. dobrze skomentowany i co tu dużo mówić, dużo lepszy niż mój. Szybko znalazłem to co spodziewałem się znaleźć.

    Niestety w układzie Howlanda nie będzie można zrealizować zasilania przyrządu z pętli ani nawet zbliżyć się do parametrów „drogiego specjalizowanego układu” bez kompromisów lub poniesienia kosztów zbliżonych lub nawet większych niż właśnie ten „drogi specjalizowany układ”.

    Aby nie być gołosłownym, postaram się to szerzej objaśnić:
    1. Układ Howlanda działa poprawnie pod warunkiem ścisłego dopasowania rezystorów, a właściwie to ich stosunku odpowiednimi grupami.
    Przy niedopasowaniu jego parametry drastycznie pogarszają się.
    Tolerancja rezystorów 1% nie jest ścisłym dopasowaniem przy postulacie rozdzielczości 0,01mA. Wymagane jest 0.1% lub lepiej, a to wpływa na cenę. Przy czterech-sześciu precyzyjnych rezystorach i budowie pojedynczych egzemplarzy to już drożej niż „drogi specjalizowany układ”
    2. Zastosowany w DMX wzmacniacz TL082 ma typowo offset rzędu 3mV a „specjalizowany układ” 30x mniej.
    Do tego TL082 pobiera w spoczynku około 1,5mA. To raczej sporo przy zasilaniu z pętli 4-20MA i może nie starczyć dla reszty obwodów, zwłaszcza że układ Howlanda, nawet zmodyfikowany nie grzeszy ultra-wysoką sprawnością.
    Potrzebny jest wzmacniacz operacyjny o znacznie lepszych parametrach, a to wpływa na cenę.
    Przykładowo, spróbowałbym zastosować wzmacniacz z wewnętrznymi precyzyjnymi rezystorami korygowanymi laserem (np. coś z serii INA Texas Instruments) ale to już może być dwa razy drożej niż „drogi specjalizowany układ”.
    3. Układ Howlanda wymaga zasilania symetrycznego lub w tym przypadku pojedynczego i kolejnych precyzyjnych rezystorów do dokładnej polaryzacji.
    4. Kolejna kwestia to wymagane wysokie napięcie zasilania, minimum 15V, a lepiej więcej.
    Typowy element pomiarowy w pętli (np. wejście PLC) ma rezystancję rzędu 250Ω (a spotkałem kiedyś nawet 500Ω) co daje 5V (a nawet 10V) przy prądzie 20mA plus spadek na przewodach (nawet kilkadziesiąt Ω). Napięcie wyjściowe wzmacniacza musi być jeszcze wyższe aby dodatkowo pokonać spadek na rezystorze ustalającym transkonduktancję (np. R15 w projekcie DMX) i jeszcze pozostać poza obszarem nasycenia wzmacniacza, bo to przecież nie jest rail-to-rail.
    To raczej sporo baterii w przyrządzie przenośnym który ma wydać z siebie aż 20mA sygnału użytecznego. I wzmacniacz musi jeszcze to wytrzymać.
    Jednak wolę uzyskać zasilanie z pętli 4-20mA stosując „drogi specjalizowany układ”. Działa on do 50V chociaż sam świadomie ograniczyłem tę wartość do ok. 33V.
    5. W programie DMX multiplexer zastosowano 8-bitowy PWM.
    To rozdzielczość zaledwie 256 punktów i błędy wnoszone przez całkujący układ RC.
    Prezentowany zadajnik ma rozdzielczość 19000 punktów właśnie dzięki „drogim specjalizowanym układom”.
    6. Producent „drogiego specjalizowanego układu” jednocześnie proponuje skojarzony z nim i przetestowany wejściowy układ zabezpieczeń przed zakłóceniami w środowiskach przemysłowych który wykorzystałem
    Wyjścia analogowe w DMX multiplexer nie posiadają ŻADNYCH zabezpieczeń i moim zdaniem, w takim stanie projekt nie powinien nigdy opuścić stołu w laboratorium, a zamiast tego „rekomendowany jest osobom zajmującym się wyposażeniem technicznym sceny”.

    Dla zainteresowanych, w opisie projektu przytoczyłem materiały źródłowe gdzie faktycznie pokazane jest m.in. jak zrobić taki układ prościej, zasilany z pętli, ale trochę mniej dokładny (prosty DAC, dopasowany OP-AMP, tranzystor i TL431)
    Wystarczyło spojrzeć.

    MK

  • #19 09 Lis 2017 22:00
    R-MIK
    Poziom 38  

    Mkrasuski napisał:
    5. W programie DMX multiplexer zastosowano 8-bitowy PWM.

    DMX operuje na danych b-bit, nie było więc sensu aby użyc trybu 10-bit.

    Dodano po 3 [minuty]:

    Mkrasuski napisał:
    Wyjścia analogowe w DMX multiplexer nie posiadają ŻADNYCH zabezpieczeń i moim zdaniem, w takim stanie projekt nie powinien nigdy opuścić stołu w laboratorium, a zamiast tego „rekomendowany jest osobom zajmującym się wyposażeniem technicznym sceny”.

    Idea urządzenia jest taka, aby podłączyc pod DMX stare rozwiazania analogowe. Wymaganiem DMX jest to, że kabel musi dochodzić do urządzenia. Połączenie pomiędzy demultiplekserem DMX a urządzeniem będzie krótkie, a wręcz demultiplekser bedzie w nie wbudowany. Stosowanie zabezpieczeń w takiej sytuacji to przerost formy nad treścią.

    Dodano po 4 [minuty]:

    Mkrasuski napisał:
    Zastosowany w DMX wzmacniacz TL082 ma typowo offset rzędu 3mV a „specjalizowany układ” 30x mniej.
    Do tego TL082 pobiera w spoczynku około 1,5mA. To raczej sporo przy zasilaniu z pętli 4-20MA i może nie starczyć dla reszty obwodów

    Jeśli tester ma być zasilany z petli, to dało by sie układ źródła pradowego zrealizować inaczej. Ujemne napięcie nie jest wymagane, sa wzmacniacze rail-2-rail.
    Gdybym robił kilka testerów pewnie tez bym użył specjalizowanego scalaka, jeśli natomiast miałby być to większa ilośc, można by szukac innego rozwiązania.


    - Rozdzielczość 19000 punktów to teoria czy praktyka?
    - Czy do takich prostych testów nie wystarczy 10-bit (1024punkty)?
    - PWM 12 czy 16-bit można zrealizowac na AVR, niestety nie będzie szybki ale tu szybkość raczej nie jest potrzebna.
    To są dość istotne sprawy, decydujące o tym jak zbudowac urządzenie.

  • #20 09 Lis 2017 22:58
    acctr
    Poziom 12  

    tmf napisał:
    Dyskusja OT, ale warto sprostować kilka nieprawidłowych tez z twojej wypowiedzi. Po pierwsze dla zwykjlego ISR (bez NO_BLOCK) kolejne przerwanie niczego nie nadpisze, bo nie zostanie obsłużone dopóki obsługa bieżącego się nie zakończy.


    Nie bardzo rozumiem co uważasz za nieprawidłowość w mojej wypowiedzi. Przecież napisałem, że
    acctr napisał:
    Tutaj akurat przerwanie jest regularnie co jakiś czas i procesor się wyrobi ze wszystkim.


    Na prawdę nie wiem gdzie widzisz te błędne tezy bo nie podajesz konkretnego przykładu.
    Nie twierdzę, że należy skracać funkcje obsługujące przerwania za wszelką cenę tylko "jak najmniej".
    To tylko propozycja refaktoringu tego konkretnego kodu w kierunku ""zdarzeniowości".
    acctr napisał:
    Np. proponowane wyrzucenie części ciała ISR poza i umieszczenie w pętli głównej z testownaiem flagi to w większości przypadków zła rada i takie działanie najczęściej nie ma sensu.

    Tutaj generalizujesz i pisząc o "większości przypadków" pewnie masz na myśli krytyczne czasowo procedury, np multipleksowanie wyświetlacza.
    Tak jak wcześniej napisałem, tutaj procesor się wyrabia w czasie i spokojnie można dać kod ISRa do main(). Powód przeniesienia do main() kodu z ISR jest taki, że kod będzie czytelniejszy i łatwiejszy w utrzymaniu.
    Podam tutaj ogólny przykład: kiedy kod w przerwaniu się rozrośnie i czas jego wykonania nie wystarczy do nadejścia kolejnego przerwania programista zacznie kombinować co tu zmienić żeby tego uniknąć. Kiedy struktura kodu ma cechy maszyny stanów, łatwiej jest to wszystko utrzymać - fragmenty krytyczne czasowo wrzuca do ISR a pozostałe do main(). Eventy, flagi pozwolą wszystko ze sobą zsynchronizować.
    I twierdzisz że to jest błędne rozumowanie?

    acctr napisał:
    Programista powinien sobie mniej więcej zdawać sprawę ile trwa wykonanie ISR, uwzględnić jak często ISR są wykonywane i jaka jest dla całej aplikacji wymagana latencja przerwań i responsywność reszty kodu.

    To brzmi jak , w sam raz do umieszczenia w poradniku "Kim chcę zostać w przyszłości" dla niezdecydowanej młodzieży. To że programista powinien byś świadomy co za kod pisze to jest oczywista oczywistość :)

  • #21 10 Lis 2017 10:00
    tmf
    Moderator Mikrokontrolery Projektowanie

    @acctr Jeżeli kod ISR trwa zbyd długo i nie ulegnie zakończeniu przed kolejnym przerwaniem to co wg ciebie da przeniesienie go do pętli głównej programu? Tam będzie wykonywany szybciej? Nie, po prostu zgudbisz cżęść przerwań. Jeśli kod się nie wyrabvia to są tylko dwie opcje- poprawić kod, tak aby sie wyrabiał, lub zmienić MCU na szybszy.

  • #22 10 Lis 2017 10:35
    Mkrasuski
    Poziom 12  

    R-MIK napisał:
    Idea urządzenia jest taka, aby podłączyc pod DMX stare rozwiazania analogowe. Wymaganiem DMX jest to, że kabel musi dochodzić do urządzenia. Połączenie pomiędzy demultiplekserem DMX a urządzeniem będzie krótkie, a wręcz demultiplekser bedzie w nie wbudowany. Stosowanie zabezpieczeń w takiej sytuacji to przerost formy nad treścią.


    Czytam to tak: „do krótkich przejażdżek nie zapinamy pasów, a jak się już udało skomercjalizować to po co poprawiać, i tak hobbysta weźmie”.
    Jednak pozostanę przy własnej tezie – ponieważ nie znalazłem tych zastrzeżeń/wyjaśnień w artykule więc będę traktował to literalnie. Jako raczej marną próbę usprawiedliwienia inżynierskiego niechlujstwa lub braku szacunku dla potencjalnych klientów.

    R-MIK napisał:
    Jeśli tester ma być zasilany z petli, to dało by sie układ źródła pradowego zrealizować inaczej. Ujemne napięcie nie jest wymagane, sa wzmacniacze rail-2-rail.
    Gdybym robił kilka testerów pewnie tez bym użył specjalizowanego scalaka, jeśli natomiast miałby być to większa ilośc, można by szukac innego rozwiązania.


    Podałem oba rozwiązania w opisie projektu, przy czym jedno jest w materiałach źródłowych.

    R-MIK napisał:
    - Rozdzielczość 19000 punktów to teoria czy praktyka?


    I tu popełniłem pomyłkę w rachunkach. Rozpiętość 19mA pomiędzy 3,50mA a 22,50mA przy rozdzielczości 0.01mA daje 1900 punktów a nie 19000 jak napisałem. Dziękuję.

    R-MIK napisał:
    - Czy do takich prostych testów nie wystarczy 10-bit (1024punkty)?


    Do najprostszych testów wystarczy bateryjka 9V i potencjometr 1kΩ.
    Przystępując do budowy miałem trochę inne ambicje. To w końcu hobby, a więc to bardzo poważna sprawa.

    Podam jeszcze jako rodzaj dygresji:
    Standardowa karta AI sterownika PLC SIMATIC (seria ET200s) ma rozdzielczość 13 bitów:
    Tester/zadajnik pętli prądowej 4-20mA
    Są jeszcze karty high speed i high feature o rozdzielczości 15 bitów, a to tylko fragment portfolio tej firmy.
    Falownik, regulator mieszanki, napędy pozycjonujące, zawory i przepustnice z siłownikami, analizator gazu, analizator spalin – mógłbym jeszcze długo wymieniać.

    R-MIK napisał:
    To są dość istotne sprawy, decydujące o tym jak zbudowac urządzenie.


    Zgadzam się, i dlatego staram się cierpliwie, rzetelnie i wyczerpująco prowadzić tę polemikę. I oczekuję wzajemności.
    Poświęciłem sporo czasu na zbudowanie zadajnika, z czego przynajmniej dobre kilkadziesiąt roboczogodzin na „badania podstawowe” czyli podglądanie i zrozumienie „jak to robią inni”.
    I dlatego żadną miarą nie zadowolą mnie ogólniki w rodzaju „budowałem takie, tylko prostsze i lepsze, a ten konkretny jest bez sensu przekombinowany”.
    Czuje się uprawniony aby zawołać „Sprawdzam!” i chyba czegoś właśnie dowiodłem.

    Posiada Kolega i wiedzę i umiejętności, więc teraz pozostaje poczekać aż Kolega coś udowodni, a nie tylko wygłosi tezy.
    Warunki brzegowe to zakres i rozdzielczość oraz wymóg zasilania z pętli.
    Ze swej strony deklaruję maksimum obiektywizmu i staranności w ocenie proponowanych rozwiązań.

    Nie leży w mojej naturze głośne gdakanie przy każdym zniesionym jajku ale proszę wierzyć, że będę gdakał dopóki moje jajko jest większe.

    Pozdrawiam serdecznie i zachęcam do współzawodnictwa

    MK

  • #23 10 Lis 2017 10:53
    R-MIK
    Poziom 38  

    Mkrasuski napisał:
    R-MIK napisał:
    Idea urządzenia jest taka, aby podłączyc pod DMX stare rozwiazania analogowe. Wymaganiem DMX jest to, że kabel musi dochodzić do urządzenia. Połączenie pomiędzy demultiplekserem DMX a urządzeniem będzie krótkie, a wręcz demultiplekser bedzie w nie wbudowany. Stosowanie zabezpieczeń w takiej sytuacji to przerost formy nad treścią.


    Czytam to tak: „do krótkich przejażdżek nie zapinamy pasów, a jak się już udało skomercjalizować to po co poprawiać, i tak hobbysta weźmie”.
    Jednak pozostanę przy własnej tezie – ponieważ nie znalazłem tych zastrzeżeń/wyjaśnień w artykule więc będę traktował to literalnie. Jako raczej marną próbę usprawiedliwienia inżynierskiego niechlujstwa lub braku szacunku dla potencjalnych klientów.

    Trzeba jeszcze wiedzeć co to korekta. Wiele wypowiedzi (zwłaszcza tytułowych) jest nie moich, wiele jest wycinanych (uznawane za mało istotne). Proszę porównać sobie arykuł "2010-11_26_EP_AVT-5262_Centrala_telefoniczna_2x4-Clip" zamieszczony w EP i oryginał dostraczony redakcji zamieszczony na mojej stronie. Po tej lepkórze, łatwo sie domyśleć, że autor nie dostaje artykułu do korekty przed akceptacją.

    Dodano po 2 [minuty]:

    Mkrasuski napisał:
    R-MIK napisał:
    - Rozdzielczość 19000 punktów to teoria czy praktyka?


    I tu popełniłem pomyłkę w rachunkach. Rozpiętość 19mA pomiędzy 3,50mA a 22,50mA przy rozdzielczości 0.01mA daje 1900 punktów a nie 19000 jak napisałem.

    To tylko 10 razy więcej :-) To zonacza, ze użycie PWM w trybie 10-it dałoby podobny efekt, więc punkt dla mnie. Pisałem też, że mozna zrealizować PWM 12 czy więcej bitowy, tyle, że będzie miał niższą częstotliwośc, co w tym przypadku nie ma znaczenia.

    Dodano po 2 [minuty]:

    Mkrasuski napisał:
    R-MIK napisał:
    - Czy do takich prostych testów nie wystarczy 10-bit (1024punkty)?


    Do najprostszych testów wystarczy bateryjka 9V i potencjometr 1kΩ.

    Przyznam, że brałem pod uwagę potencjometr cyfrowy w roli rezystora zmiennego oraz pomiar napięcia na nim przez ADC uC.

    Dodano po 2 [minuty]:

    Mkrasuski napisał:
    Warunki brzegowe to zakres i rozdzielczość oraz wymóg zasilania z pętli.

    Będzie zapotrzebowanie, zajmę się tematem. Na tą chwilę takiej potrzeby nie ma.
    Dotychczas było tylko zapotrzebowanie podłączenia do DMX starych rozwiązań. Zrobiłem, działa.

  • #24 10 Lis 2017 11:12
    Mkrasuski
    Poziom 12  

    R-MIK napisał:
    Trzeba jeszcze wiedzeć co to korekta. Wiele wypowiedzi (zwłaszcza tytułowych) jest nie moich, wiele jest wycinanych (uznawane za mało istotne). Proszę porównać sobie arykuł "2010-11_26_EP_AVT-5262_Centrala_telefoniczna_2x4-Clip" zamieszczony w EP i oryginał dostraczony redakcji zamieszczony na mojej stronie. Po tej lepkórze, łatwo sie domyśleć, że autor nie dostaje artykułu do korekty przed akceptacją.


    Wolałbym raczej zobaczyć DMX multiplekser przed i po korekcie

    Mkrasuski napisał:
    I tu popełniłem pomyłkę w rachunkach. Rozpiętość 19mA pomiędzy 3,50mA a 22,50mA przy rozdzielczości 0.01mA daje 1900 punktów a nie 19000 jak napisałem. Dziękuję.


    Niestety nie mogę nawet próbować zasłonić się korektą.

    R-MIK napisał:
    Będzie zapotrzebowanie, zajmę się tematem. Na tą chwilę takiej potrzeby nie ma.


    Szczerze żałuję. Wciągnęła mnie ta dyskusja.
    Jak dla mnie EOT. Do pierwszego merytorycznego postu Kolegi.

    Załączam pozdrowienia

    MK

  • #25 10 Lis 2017 18:35
    acctr
    Poziom 12  

    tmf napisał:
    co wg ciebie da przeniesienie go do pętli głównej programu? Tam będzie wykonywany szybciej?

    Oczywiście, że nie. W przypadku nachodzenia na siebie przerwań od TIM0 w ISR powinny się znaleźć:
    - obsługa GP_timer1, GP_timer2
    do main() można wrzucić:
    - obsługa przycisków,
    - obsługa SPI
    Trzeba by jednak parę rzeczy pozmieniać. Np. wszędzie widać CL_status, zarówno w obsłudze przycisków jak i LCD i
    dobrze byłoby te dwa konteksty odseparować od siebie.
    No ale to tylko takie gdybanie, nie będę się rozpisywał w OT bo znów padną zarzuty o "nieprawidłowe tezy".

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME