Skocz do zawartości

OldSkull

Users
  • Zawartość

    1 453
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    24

OldSkull zajął 1. miejsce w rankingu.
Data osiągnięcia: 8 sierpnia 2020.

Treści użytkownika OldSkull zdobyły tego dnia najwięcej polubień!

O OldSkull

  • Urodziny 04.12.1987

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Poznań/Leszno
  • Zawód
    Inżynier elektronik
  • Moje zainteresowania:
    Projektowanie, RFID

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

Osiągnięcia użytkownika OldSkull

Pionier

Pionier (12/19)

  • Za 25 postów
  • Za 5 postów
  • Za 100 postów
  • Za 1 tys. postów
  • Młodszy konstruktor

Odznaki

131

Reputacja

  1. Przechodzę ostatnie dni przez tą samą męczarnię. Niestety problem tkwi w tym, że nie ma zintegrowanego środowiska dla RP2040. Z tego co zauważyłem kluczowe są: - CMakeLists.txt - niektóre biblioteki wymagają dopisania, niektóre nie. Wydaje mi się, że podstawowe biblioteki z SDK wymagają. - Pliki .json - nie znalazłem NIGDZIE opisu co powinno się w nich znaleźć, a bez nich nie uzyskamy plików .bin, .uf2, .hex, .elf - więc nie uzyskamy wsadu do procesora. Ja po prostu skopiowałem je z przykładów z SDK. Bardzo słabe jest to, że aby poznać podstawy w C/Cpp trzeba by być już doświadczonym z json. - Bardzo często jeśli coś działało i przestało należy zrobić restart Visual Studio. Poza tym: - Brakuje dobrego i prostego opisu jak operować na PIO - Visual Studio zazwyczaj nie podświetla błędu, tylko trzeba szukać w tej tonie tekstu wyrzucanego w logu - jeśli problem jest z linkowaniem albo zależnościami - include z biblioteki zewnętrznej może nie działać, nawet jeśli ten sam include w Twoim main.c działa. Nie wiem dlaczego tak jest, ale potwornie przeszkadza, bo niektóre biblioteki są OK, a inne powodują, że człowiek rzuca mięsem. - co do zasady przykłady nie mają wklejonego spakowanego projektu, co niestety oznacza, że zwykle nie działają, bo trzeba coś dodatkowo skonfigurować, tylko nie wiadomo co (na początku). Nie wiem czy powyższe Ci jeszcze pomoże, ale może komuś innemu tak - jakbym przeczytał gdzieś powyższe jak się zabierałem do RP2040 to bym oszczędził sporo czasu i nerwów. Cały czas nie wiem jak wiele z powyższych rozwiązać "poprawnie". Chociażby aby uzyskać wsad, uruchamiam "Debug", który generuje wsad, po czym się wykrzacza z braku połączenia. Nie mam nigdzie opcji "Build" i nie mogę jej włączyć.
  2. Czy jesteś w stanie podać parametry transmisji? Na którym RPi ile fps, jaka rozdzielczość, jaki bitrate i jaka kompresja? Poza tym bardzo fajny opis.
  3. Ode mnie pierwsze dwa tipsy: 1. Złącza. Bardzo często samodzielnie zagniatane złącza potrafią się rozpaść jeśli nie korzystaliśmy z zagniatarki. Lutowanie ich do pinu powoduje, że punkt "kruchości" przenosi się na przewód, dalej potrafią się rozlecieć w krótkim czasie. Rozwiązaniem jest dodawanie odgiętek - np. poprzez oblewanie złącz (ale tak aby nie straciły swojej funkcjonalności - trzeba uważać) klejem hot-glue. Polecam 🙂 2. Złota reguła elektroników i elektryków: układ (prawidłowo) zasilany działa zwykle lepiej. Bardzo często (tak w 90% przypadków) problemy, które napotykam w układach wynikają ze złych warunków pracy - a to są skoki albo spadki napięć zasilania albo rezystancja linii jest zbyt wielka albo wręcz układ jest kiepsko podłączony (np. przez kiepski lut). Jakkolwiek by nie szukać przyczyn - zawsze warto się zastanowić nad tym jakie napięcia i prądy dopływają do układu i czy są one odpowiednie. Pozostałe 10% to błędy w projekcie 😉
  4. To nie ST się nie popisało tylko Pololu. Przy sterowaniu silników DC zawsze masz trzaski - po prostu zasilanie silnika musi być odpowiednio filtrowane i tyle. A jak nie pomaga to trzeba dać transil. Sterowałem z tego mostka silniki około 150-180W na 24V i było ok. Ale uwaga. Silnik 500W jest za mocny - to jest 20A prądu znamionowego, czyli prądem rozruchu (40-80A) spalisz ten mostek - musiałbyś mieć zewnętrzne zabeczpieczenie nadprądowe i to szybkie.
  5. @PiotrusPan - mam wrażenie jakbym tam był 😉 Ja pamiętam kilka przestróg: 1. Nie zostawiać akumulatorów niepilnowanych, a przynajmniej przy partyzanckim ładowaniu 2. Pamiętać aby sprawdzić zarówno prąd jak i napięcie oraz czy ogniwa nie są rozbalansowane. 3. Dobrze mieć pod ręką worek z piaskiem albo jakiś środek gaśniczy.
  6. Sabre, skąd wiesz, że ma 900W? Producent nie podaje szczegółów, a niektórzy sprzedawcy podają nawet 6kW (w co akurat wierzyć nie można). Aczkolwiek widać, że to zasilacz impulsowy (aczkolwiek parametry na papierze spoko) tylko duże zakłócenia z sieci, wręcz bardzo duże.
  7. Tu masz rację. Aczkolwiek dalej uważam, że błąd był w bloku ifdef, a nie w klasie. W każdym razie dziękuję za zwrócenie uwagi - już poprawiłem. A nie przyznaję się, gdyż są to rozwiązania dopuszczalne, nawet jeśli nie zalecane. To tak jak z instrukcjami skoku - niektóre są dobre, a niektóre złe - goto złe, a break i continue dobre. Wszystko zależy od sytuacji. Tutaj ciała funkcji są w miejscach, które nie ograniczają czytelności kodu, a nawet ją zwiększają - tym samym jako dozwolony zapis, można go stosować.
  8. To jest wymuszone działaniem niektórych kompilatorów. Jeśli jeden plik dołączasz do wielu innych to preprocessor czasami zapamiętuje daną definicję, i potem czasami nie chce do tego innego pliku zrobić include pliku h. Niestety to przeżyłem. Natomiast ważne co się includuje - jeśli robi się to z plikami, które są poprawnie chronione w sobie to nic się nie stanie. Tutaj #include jest chroniony. Ale jakiś nasz własny include mógłby nie być. Nie sypią. Poza tym nie przesadzajmy - tylko konstruktor klasy jest w pliku .hpp. Technicznie rzecz biorąc coś takiego jest dozwolone - i nie pogarsza czytelności. Ba, jest to spotykane nawet w przykładach - aczkolwiek zwykle tylko jako "return cośtam" w getterach. np. http://www.cplusplus.com/forum/articles/10627/ pozwalają na to aby wszystkie ciała funkcji klasy były w pliku .h. To też zresztą wynika z własnych przeżyć z obsługą klas w praktyce. Spotkałem się z sytuacją, gdzie były problemy z czymś w stylu ": Mul(mul), Div(div), Vcc(Vref), ADCmax(ADCmaxValue) ". Innymi słowy: warningów nie ma, błędów tym bardziej, działa jak trzeba, jest czytelne i zgodne z poradnikami (przynajmniej niektórymi) - gra gitara. W pliku .h definicji funkcji nie ma.
  9. Z mojej strony zestaw podwójny, robiący to samo - tylko, że jeden w C, drugi C++ z wykorzystaniem klas. voltage_calc.h #ifndef _VOLT_CAL_H_ #define _VOLT_CAL_H_ #endif #include <stdint.h> void VoltageCalcInit(uint32_t mul, uint32_t div, uint32_t Vcc, uin32_t ADCmax, uint32_t initialValue); uint8_t VoltageCalcUpdate(uint32_t adcValue); uint32_t VoltageCalcGet(void); voltage_calc.c /* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Name of the author of this software will be mentioned in any source file where part, or whole, of this code is used. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * Author: M. Matuszak * Date: 2015-06-05 */ #include <stdint.h> #include "voltage_calc.h" uint32_t calcMul = 10, calcDiv = 1; uint32_t calcVcc = 0, calcADCmax = 1023; uin16_t calcSums = 16, calcLastDiv = 512; uin32_t calcBuffer = 0, calcValue = 0, calcCounter = 0; /* * Init library. Define Division value of Eg. resistor divider by (mul/div), reference voltage (Vcc) and maximum ADC value * Errors (due to inaccuracy of components) can be best eliminated by calibration of Vcc. */ void VoltageCalcInit(uint32_t mul, uint32_t div, uint32_t Vcc, uin32_t ADCmax, uint32_t initialValue) { calcMul = mul; calcDiv = div; calcVcc = Vcc; calcADCmax = ADCmax; //below gives No of sums: (Vcc*MUL) / (ADCmax*DIV) calcSums = Vcc*mul/div/ADCmax; //calculate how many times adc value should be added //calculate last addition od 8 bit shifted value //- (calcSums>>1) is added, because rounding is down, and should be to the closest calcLastDiv = ((ADCmax*div)<<8) / (Vcc*mul-calcSums*ADCmax*div) - (calcSums>>1); calcValue = initialValue; } /* * Add next ADC measurement to buffer. Update value if ready. */ uint8_t VoltageCalcUpdate(uint32_t adcValue) { calcBuffer += adcValue; calcCounter++; if(calcCounter >= calcSums) { calcValue = calcBuffer + (adcValue<<8)/calcLastDiv; calcBuffer = 0; calcCounter = 0; return 1; } return 0; } /* * Get measured value */ uint32_t VoltageCalcGet(void) { return calcValue; } Biblioteka ta pozwala na łatwe oraz dokładne mierzenie napięcia do wartości wygodnej. Wykorzystuje zjawisko "oversampling", dzięki czemu dokładność rośnie. Funkcje inicjuje się za pomocą funkcji VoltageCalcInit. Należy do niej podać wartość dzielnika (np. rezystancyjneg), czyli ile razy napięcie wejściowe jest wyższe od mierzonego wg wzoru: mul/div. Należy również podać napięcie referencyjne ADC (Vcc) oraz maksymalną wartość przyjmowaną przez przetwornik (np. dla 10b może być 1023). Wartość początkowa służy uniknięciu sytuacji, w której przy odczycie pomiaru przed zakończeniem pierwszej serii, byłaby obecna wartość '0'. Uaktualnianie następuje poprzez wpisanie funkcją VoltageCalcUpdate() wyniku pomiaru z przetwornika. Odczyt poprzez VoltageCalcGet(); Po wykonaniu odpowiedniej ilości pomiarów, wartość pomiarowa jest uaktualniana a bufory czyszczone. Zalety: - duża rozdzielczość. Np. dla zakresu do 30V można uzyskać rzędu kilku-kilkunastu mV. - większa dokładność niż w przypadku zwykłego mnożenia pojedynczego pomiaru. - łatwość użycia, - modularność, - niezależny od architektury układu Wady: - opóźnienie w wykonaniu pomiaru, - potrzeba więcej pamięci niż w przypadku mnożenia jednego wyniku, - tylko jedno wejście pomiarowe. Tą wadę eliminuje wersja w formie klasy. Przy okazji: dopisałem licencję (o której ludzie tutaj zapominają). Bez obaw, jest mniej restrykcyjna nawet niż MIT - pozwala właściwie chyba na wszystko. [ Dodano: 13-06-2015, 13:19 ] I druga część. To samo co powyżej, ale w formie klasy. AdcCalc.hpp /* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Name of the author of this software will be mentioned in any source file where part, or whole, of this code is used. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * Author: M. Matuszak * Date: 2015-06-05 */ #include <stdint.h> #ifndef _ADC_CALC_H_ #define _ADC_CALC_H_ class AdcCalc { uint32_t Mul = 11, Div = 1; uint32_t Vcc = 3300, ADCmax = 1023; uin16_t Sums = 16, LastDiv = 512; uin32_t Buffer = 0, Value = 0, Counter = 0; public: uint8_t Update(uint32_t adcValue); uint32_t Get(void); /* * Init library. Define Division value of Eg. resistor divider by (mul/div), reference voltage (Vcc) and maximum ADC value * Errors (due to inaccuracy of components) can be best eliminated by calibration of Vcc. */ AdcCalc(uint32_t mul = 11, uint32_t div = 1, uint32_t initialValue = 12000, uint32_t Vref = 3300, uin32_t ADCmaxValue = 1023): Mul(mul), Div(div), Vcc(Vref), ADCmax(ADCmaxValue) { //below gives No of sums: (Vcc*MUL) / (ADCmax*DIV) Sums = Vcc*mul/div/ADCmax; //calculate how many times adc value should be added //calculate last addition of 8 bit shifted value //- (Sums>>1) is added, because rounding is down, and should be to the closest LastDiv = ((ADCmax*div)<<8) / (Vcc*mul-Sums*ADCmax*div) - (Sums>>1); Value = initialValue; } } #endif AdcCalc.cpp /* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Name of the author of this software will be mentioned in any source file where part, or whole, of this code is used. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* * Author: M. Matuszak * Date: 2015-06-05 */ #include <stdint.h> #include "AdcCalc.hpp" /* * Add next ADC measurement to buffer. Update value and return 1 if ready. */ uint8_t AdcCalc::Update(uint32_t adcValue) { Buffer += adcValue; Counter++; if(Counter >= Sums) { Value = Buffer + (adcValue<<8)/calcLastDiv; Buffer = 0; Counter = 0; return 1; } return 0; } /* * Get measured value */ uint32_t AdcCalc::Get(void) { return Value; } Biblioteka robi dokładnie to samo, ale umożliwia wykorzystywanie dla wielu pomiarów na raz. Reguła jest ta sama: podajemy "przekładnię" wartości mierzonej na napięcie, maksymalną wartość napięcia w wybranej jednostce (polecam mV - np. 3300 dla 3.3V) itd. Przykładowo aby zainicjować pomiary napięcia i prądu: AdcCalc napiecie(11, 1, 12600, 3300, 1023); AdcCalc prad(20, 1, 0, 3300, 1023); //rezystor pomiarowy 50m Ohm Przy czym nie wszystkie wartości podczas inicjowania trzeba wpisywać, gdyż C++ dopuszcza domyślne wartości danych wejściowych. I tak samo można np. obsługiwać czujniki itp. działające proporcjonalnie. Uaktualnianie: napiecie.Update(adc1); prad.Update(adc2); Pobieranie za pomocą funkcji Get. Ogromną zaletą jest to, że można biblioteki wykorzystać do bardzo wielu wejść pomiarowych - ogranicza nas tylko pamięć, ilość tych wejść oraz czas obsługi. Zalety: - ogromna elastyczność - uniwersalność - czytelność kodu - bezpieczniejsze niż wersja w C jeśli chodzi o ochronę zmiennych. Trudniej popsuć. Wady: - nieco wolniejsze działanie - nie każde środowisko dla mikrokontrolerów obsługuje C++ - nieco więcej pamięci przy wykorzystaniu dla tylko jednego kanału Poza tym wady i zalety jak w poprzedniej wersji. Komentarz do obu wersji: - dokładność dzielnika ostatniej wartości jest ustalana z operatorem przesunięcia o 8 bitów. Dzięki temu dokładność jest większa, ale wymaga użycia zmiennych 32b, co może działać wolniej niż 16b na procesorach 8b - pobieranie odbywa się za pomocą funkcji Get - dzięki temu przypadkowo nie nadpiszemy wartości - wzory są wypisane w komentarzach - obie wersje mają dopisaną licencję. Uważam, że jest ważna, a nie jest określona. Teoretycznie jeśli podajecie do publicznej wiadomości kod i ktoś go wykorzysta i przez błąd w jego działaniu, który nie był opisany coś się stanie to za niego odpowiadacie. Warto aby dopisać minimum zrzeczenia się odpowiedzialności. A inne zapisy po to aby ktoś mógł sobie z tego kodu w ogóle korzystać. W przeciwnym razie jest on po to aby sobie ktoś poczytał ale nie używał. Edit: poprawiony błąd, dzięki Elvis.
  10. @corsair: bardzo przydatne te Twoje funkcje, ale byłyby jeszcze lepsze gdyby to samo robiły na zmiennych stałoprzecinkowych - wtedy obliczenia idą szybciej.
  11. Cześć, Możesz wyjaśnić C3 i C4? Producenci zalecają raczej 10uF, ty dałeś 100uF.
  12. Wrzucam kolejne dwa schematy. Dotyczą one mostków H bezpiecznych dla elektryki robota - nie da się ich tak wysterować aby mogło dojść do zwarcia. 1. Mostek na bazie przekaźnika typu DPDT (Dual Pole, Dual Terminals) 1. W mostku tym regulacja PWM odbywa się za pomocą pojedynczego tranzystora MOSFET typu N. O sterowaniu bramki można poczytać w dyskusji w tym temacie, tym samym zagłębiać się nie zamierzam. 2. Zmiana kierunku następuje poprzez zmianę wysterowania przekaźnika. Należy tutaj pamiętać na diodzie podłączonej równolegle do cewki przekaźnika. Chroni ona tranzystor bipolarny. 3. Zatrzymanie następuje poprzez wyłączenie sterowania MOSFETem. 4. Poniżej MOSFETa znajduje się rezystor pozwalający na pomiar prądu. Sygnał ten można filtrować filtrem RC a nawet podać na detektor szczytu. Ale to temat na inną okazję. 5. Rezystor sterujacy tranzystorem bipolarnym należy tak dobierać aby nie przekroczyć dopuszczalnych prądów procesora. 6. D1 - Powinna to być dioda szybka (Schottky lub Transil). Przy czym prąd znamionowy tej diody może być nawet nieco niższy niż prąd maksymalne silnika, gdyż pracuje ona tylko w momencie wyłączenia tranzystora MOSFET. Liczy się prąd średni oraz prąd szczytowy. 7. Kondensator na silniku. Tutaj bardzo wiele osób popełnia bardzo poważny błąd. Otóż dają kondensator dużej wartości. Efekt? Przy załączeniu MOSFETa nawet na chwilę jest on ładowany a później zasila silnik. Zmniejsza to mocno zakres sterowania napięciem na silniku i co gorsza ta charakterystyka mocno zależy od prądu silnika. Należy się wystrzegać dużych wartości. Wystarczy powiedzieć, że dla silnika pobierającego podczas dużego obciążenia 5-6A, a w zwarciu 15-18A wystarczy 1nF! Natomiast pod względem napięcia warto zachować zapas. na 24-30V nie należy dawać 35V, tylko 50V a nawet 100V. 8. Ale zarazem szpilki napięć od prądu zwracanego przez silnik jakoś trzeba łapać. W tym celu warto dawać transila (diody TVS - Tłumik Napięć Przejściowych). Jest to taki specyficzny typ diody łączący wiele cech diod Zenera oraz Schottky - mają w miarę nieźle określone napięcie przebicia oraz bardzo krótki czas załączenia. Wstawiony SMAJ30A nadaje się bardzo dobrze do układów zasilanych z akumulatorów 24V (Czyli max. 25.2-29V napięcia początkowego). Dzięki tej mądrej diodzie między innymi nasz przekaźnik będzie dłużej żył jeśli będziemy chcieli nagle zmienić kierunek. 9. Złącze. Może to brzmieć banalnie, ale złącze do podłączenia silnika jest ważne. Po pierwsze musi przenieść duże prądy. Wiele złącz sobie z tym nie daje rady jeśli sterujemy np. silnikami od wkrętarek - przy 10A potrafią się nagrzewać, a przy 15A podtapiać. Po drugie dobrze jeśli złącze uniemożliwia przypadkowe podłączenie na odwrót - przy pracy nad prototypem często coś odpinamy i łatwo o pomyłkę. Zaproponowane tutaj złącze Ma obie te cechy - ale niestety jest duże. Warto czasami samemu poszukać lub dopasować do zastosowania. Np. modelarskie złącza bananowe (lutowane) mają niezłe parametry a korzystając z wersji męskich i żeńskich raczej się nie pomylimy. 2. Oparte o przekaźniki SPDT (Single Pole, Dual Terminals) Jedyna różnica to dwa przekaźniki - czyli dwie cewki sterowane niezależnie. 1. W tym przypadku jest możliwe hamowanie poprzez zwarcie wyjść na silnik. Należy w tym celu podać ten sam sygnał na cewki obu przekaźników. Niewątpliwą zaletą jest to, że układ niezasilony jest automatycznie hamowany! Warto o tym pamiętać wszędzie tam, gdzie po wyłączeniu na silnik może być wywierany moment z zewnątrz. schemat1.sch
  13. Ze wszystkim masz z grubsza rację, ale z tym to nie do końca. Nawet tranzystory załączane poziomami logicznymi nie otwierają się na duże prądy (przykładowo IRLR024N przy 3V przewodzi nawet nie 3A) oraz mają podwyższoną rezystancję przewodzenia przy napięciu Vgs 3-3.3V. Przy ATmegach jest prościej (5V, spora wydajność prądowa wyjść), ale przy ARMach już gorzej (mocno ograniczona liczba nóżek wysokoprądowych, napięcie <=3.3V). W sumie zachęciłeś mnie do spłodzenia innych schematów. Zobaczymy czy znajdę czas 🙂 Ciebie również zachęcam do zrobienia schematu, który uznasz za dobry, słuszny i przydatny. Spotkałem już się z sytuacją, kiedy procesor wyłączając się od spadku napięcia zasilania zapamiętał ostatni stan nóżek. Tranzystor ulegał w takiej sytuacji przepaleniu, gdyż jego napięcie bramki wpadało w zakres w którym działał jako źródło prądowe. Czasami rozwiązania analogowe są najlepsze, szczególnie jeśli chodzi o zabezpieczenia. Program się może zawiesić, procesor wyłączyć, a część analogoowa będzie dalej działać.
  14. Jest pewien problem - większość komparatorów (fakt- na pewno nie wszystkie) któregoś z warunków nie spełni. Obojętnie czy to będzie Open Collector, napięcie zasilania/wejść/wyjść. Wzmacniacz nie jest idealnym komparatorem - ale będzie działał dobrze. Zresztą symbol komparatora i wzmacniacza jest taki sam. Dla kogo to jest? Dla ludzi, którzy jakimś cudem zamiast zaopatrywać się w TME/Farnell/itd. zaopatrują się w sklepie za rogiem. Dla ludzi, którzy mieli już problemy przy mostkach na elementach dyskretnych. Oraz dla tych, którzy szukają rozwiązania za wszelką cenę najtańszego - TLC274 ma 4 kanały, co wystarcza na 4 MOSFETy, czyli dolne strony dwóch mostków. Różnica rzędu około 8-10zł (mniej przy wielokanałowych). Dużo, mało? trudno powiedzieć. Natomiast zaletą jest również właśnie ten ustawialny Offset. Jeśli podepniemy tam coś takiego: Zabezpieczenie przed zbyt niskim napięciem Przy spadku napięcia zasilania powoduje w połączeniu z poprzednim schematem wyłączenie mosfetów. Zaletą jest to, że nie będziemy sterować tranzystorów zbyt niskim napięciem. Programowanie napięcia progowego odbywa się za pomocą R7, R9, R10. C3 oraz R7 odpowiadają za opóźnienie załączania i wyłączania zabezpieczenia oraz filtrowanie. Można to oczywiście zrobić inaczej (np. na innych kanałach wzmacniacza U1) ale można i tak. Edit: dodałem plik .sch ster-mosfet.sch
  15. Czy przeszkadzało Wam kiedykolwiek, że silniki generują hałas w trakcie sterowania PWM? Poniżej przedstawiam schemat sterowania dolnego mosfeta typu N, który pozwala na sterowanie > 20kHz. Jest to doskonała baza na sterowanie PWM w mostkach H - albo dla tranzystora wykonawczego w konstrukcjach opartych o przekaźniki albo jako sterowanie mosfetów dolnych mostków opartych o elementy mocy dyskretne. Rzeczy na które należy zwrócić uwagę: 1. U1 - dobór wzmacniacza jest tutaj kluczowy. - Należy pamiętać o tym, że okres PWM dla 20kHz wynosi 50us. Przy 12V (niecałych) napięcia międzyszczytowego i 10% półokresu czasu narastania zbocza (to i tak dużo, przez 10% czasu MOSFET się może mocno nagrzewać) otrzymujemy minimum 4.8V/us. I to jest pierwszy parametr na który musimy zwrócić uwagę. Bardzo wiele wzmacniaczy ma ten parametr znacznie gorszy co uniemożliwia ich wykorzystanie. - Napięcie zasilania - sprawa oczywista, musi obejmować napięcie, którym karmimy układ. - Zakres napięć wejściowych Common mode. Tutaj czasami trudno jest doczytać się w dokumentacji jeśli się nie uważa. Przykładowo TL084: przy zasilaniu +-15V przyjmuje napięcia dopiero od -12V - czyli 3V powyżej dolnej wartości. Oznacza to, że zasilając 0-12V przyjmie dopiero powyżej 3V. Poniżej tej wartości działanie może nie być poprawne. Co gorsza czasami może być dobre co znacznie utrudnia znalezienie problemu. Dodatkowo podany jest zakres napięć wyjściowych - tutaj widać odstęp 3V od zasilania, co oznacza, że w podanym przykładzie dawałby 3-9V - a przy 3V niektóre MOSFETy już przewodzą. - Prąd wyjściowy. Całe szczęście zwarty wzmacniacz operacyjny w ogólnym przypadku się nie popsuje - ale wydajność ma znaczenie jeśli byśmy chcieli pominąć tranzystory bipolarne i sterować MOSFET bezpośrednio ze wzmacniacza. Dodatkowo tutaj (lub gdzieś indziej) może być podana informacja, że układ wymaga pull-up z zewnątrz i sam potrafi robić tylko "sinking", czyli zwierać do masy. 2. Tranzystory bipolarne można czasem pominąć o ile parametry wzmacniacza są odpowiednie. Odpowiadają za dostarczanie odpowiedniego prądu. 3. Kondensator C1 służy filtrowaniu szpilek zakłóceń, które wzmacniacz mógłby próbować przenieść. 4. Układ ma histerezę, co również poprawia działanie. 5. Dioda zenera jest wstawiona zapobiegawczo. Ma większe znaczenie jeśli 12V jest niestabilizowane, tylko prosto z akumulatora. 6. Dzielnik R4, R5 jest ustawiony dla progu 1.56V, co odpowiada zasilaniu logiki 3-3.3V. Dla 5V warto zmienić wartości. Modyfikując schemat można nawet dodać zabezpieczenia przed zbyt niskim lub zbyt wysokim napięciem zasilania. 7. MOSFET należy dobrać odpowiedni dla zastosowania. Warto zwrócić uwagę na napięcia bramki aby przy 12V nie następowało przebicie. Równocześnie w podanym układzie w pełni otwarte będą chyba wszystkie popularne i tanie tranzystory typu N-MOSFET. Dobrany wzmacniacz działa bardzo dobrze, spełnia powyższe warunki, jest łatwo dostępny i dość tani. Oczywiście można poszukać lepszego, gdyż Slew rate ma na granicy (około 5V/us), ale warto sprawdzić dokładnie dokumentację. Edit: dodałem plik .sch ster-mosfet.sch
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.