Witam!:)
Jest to mój pierwszy artykuł i liczę na to, że się Wam spodoba:)
Chciałbym Wam przedstawić konwerter DAC R2R
Cóż to ten konwerter?
DAC czyli Digital to Analog Converter zamienia język binarny mikrokontrolera na wartości analogowe. Działa to na całkiem innej zasadzie niż sygnał PWM. Sygnał PWM ustala średnie napięcie poprzez szybkie wyłączanie i włączanie napięcia, zaś R2R DAC zmienia napięcie poprzez dzielniki napięcia z rezystorów (stąd nazwa R2R, ponieważ drugi rezystor jest dwa razy większy od pierwszego). To tak w dużym uproszczeniu…
Jeśli ktoś chce się bardziej zagłębić w temat polecam link poniżej.
http://makezine.com/2011/02/15/dac/
http://www.ikalogic.com/8-bit-digital-to-analog-converter-dac/
A tutaj schemat takiego konwertera ze strony Makezine:
Mój pomysł na ulepszenie takiego DAC był poprzez dodanie do niego rejestru przesuwnego 74HC595 i napisanie biblioteki dedykowanej specjalnie dla Arduino i tego właśnie rejestru z podłączonym DAC.
No to nie przedłużając…połączenie:) :
I na końcu biblioteka:)
Tutaj zatrzymam się na chwilkę i wyjaśnię kilka kwestii dotyczących działania funkcji (czy raczej metod ;) ) w mojej bibliotece.
Mamy do dyspozycji 4 funkcje:
-setVoltage = ustawiamy na wyjściu DAC wybraną wartość od 0-255 dokładnie tak samo jak w PWM.
Jest jednak pewien haczyk! W przeciwieństwie do sygnału PWM 255 nie odpowiada równym 5V. W przypadku konwertera R2R musimy odjąć od 5V jeden “stopień”, czyli przy zasilaniu przez 5V naszą maksymalną wartością będzie około 255/256 * 5V = 4,98V
-sineWave = generuje funkcję sinusoidalną nie zatrzymując reszty programu delayem, jednak precyzyjność funkcji zależy od linii kodu poza nią. Jeśli powiedzmy pętla void loop() będzie długa, to if-y zawarte w funkcji sineWave() nie zawsze będą trafiać na ten idealny moment generowania. Funkcja działa na podobnej zasadzie co przykład “Blink without delay” w Arduino. W funkcji podajemy częstotliwość. Może być ułamkiem, gdyż zmienna jaką przyjmuje funkcja jest “float” i wyrażana jest w Herzach. Możemy na przykład wpisać “nazwa.sineWave(0.5); i wyślemy wtedy komunikat o wygenerowaniu funkcji o częstotliwości 0.5 Hz. Do tej funkcji jako jedynej (z generujących sinusoidę) można dodać jakiś czujnik, np potencjometr ustalający ilość Hz.
-preciseSineWave = generuje precyzyjną funkcję sinusoidalną w oparciu o delay w mikrosekundach. Dokładność jest niezależna od linii kodu w pętli głównej, jednak funkcja ta zatrzymuje cały program – dopóki generowana jest sinusoida program nie robi nic innego. Do tej funkcji wpisujemy kolejno: nazwa.preciseSineWave(ilość Hz, minimalna wartość napięcia, maksymalna wartość napięcia,ilość powtórzeń fali); Minimalna i maksymalna wartość napięcia odpowiada za zakres oscylacji napięcia w sinusoidzie.
-infinitePreciseSineWave – jak powyżej, lecz funkcja oparta jest o pętle while(1); i wykonuje się w nieskończoność. Użyteczna tylko w wypadku kiedy uC nie ma robić nic innego jak tylko generować daną funkcję. Wartości:
nazwa.preciseSineWave(ilość Hz, minimalna wartość napięcia, maksymalna wartość napięcia);
To już koniec, mam nadzieję, że owa biblioteka wraz z pomysłem na wykorzystanie 74HC595 się komuś przyda a nawet spodoba:)
Pozdrawiam wszystkich i życzę miłej zabawy przy składaniu!:)
bartibv
Super wpis :) 5 ode mnie
Ode mnie 5, bardzo fajny pomysł na prosty DAC. tego właśnie niedawno szukałem!
AA właśnie, chciałbym dodać, że to to jest pierwsza, surowa wersja tej biblioteki…w miarę nabywania wiedzy przeze mnie i czasu będę bibliotekę aktualizował…już widzę kilka znacznych błędów w niej które mogę łatwo usprawnić:p przepraszam, bo tak wyszło troche jak z Ubisoftem który sprzedaje niegotowe gry i potem dodaje patche 30 gigowe ;D nie chciałem, żeby to tak wyglądało ale wyszło jak zawsze xD
Lepiej było podlinkować od razu: http://www.ikalogic.com/8-bit-digital-to-analog-converter-dac/ – na ten tekst powołuje się autor podlinkowanego artykułu i zawiera szerszy opis. ;)
Temat warto byłoby rozszerzyć o scalone układy DAC jak i potencjometry cyfrowe.
PS. Wedytuj post i zrób normalny odnośnik. Kopiowanie URL-a tylko po to aby sprawdzić co za ciekawe treści się pod nim znajdują jest strasznie irytujace.
No tak, ale stronka jest po angielsku i tłumaczy to wszystko dość szczegółowo…myślę, że dla początkujących taka biblioteczka będzie akurat, wyręcza ze wszystkiego :)
Ekhm? Ale sam podałeś link do angielskojęzycznej strony, w czym więc problem? Zresztą mój komentarz dotycz tylko właśnie tego odnośnika, żeby go poprawić (żeby dało się po ludzku kliknąć) i ewentualnie żeby zmienić źródło na pierwotne, które IMO ma lepiej rozpisany temat.
Wygląda to trochę jak covox którego robiłem ponad 20 lat temu :) A dokładnie to ta część ZA rejestrem przesuwnym. Ktoś pamięta ten układ?
Dokładnie, pierwsze co powiedziałem na głos jak zobaczyłem rysunek – COVOX :)
Ale odgrzebaliście ;O znowu się coś nauczyłem bo tych czasów nie pamiętam ^^
Super projekt ale nie lepiej skorzystać z jakiegoś gotowego rozwiazania pod i2c lub spi:
Mcp4725
Mcp4921
Mcp4922
Kiedyś brałem jako darmowego sampla z mcp dla raspberry pi także mysle ze i teraz tez nie było by problemu :)
Najtańszy układ z tych które zaproponowałeś na ebay u chinola kosztuje 12 zł. Rejestr przesuwny detalicznie kosztuje 3 zł za 2 czyli 1,50 zł i kilka rezystorów to już groszowe sprawy:) razem mamy DAC za 2zł ;)
A na TME MCP4901 kosztuje niecałe 4zł (pierwszy próg ilościowy), więc na pewno da się taniej od chinola. Na allegro jest TDA 1543 za 6zł, ale oferuje również trochę więcej (dwa kanały, 16bit, prosty protokół szeregowy). Trzeba tylko trochę pogrzebać.
Pingback: Daryl
Pingback: julian
Pingback: Roger
Pingback: Dean
Pingback: vincent