Konwerter R2R czyli napięcie analogowe z Arduino na 3 pinach

Konwerter R2R czyli napięcie analogowe z Arduino na 3 pinach

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:

r2rdac-v2

 

 

 

 

 

 

 

 

 

 

 

 

 

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:) :

 

r2rdac-v2.1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I na końcu biblioteka:)

DAC

 

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

Ocena: 4.07/5 (głosów: 56)

Podobne posty

17 komentarzy do “Konwerter R2R czyli napięcie analogowe z Arduino na 3 pinach

  • 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

    Odpowiedz
    • 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 :)

      Odpowiedz
      • 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.

        Odpowiedz
  • 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?

    Odpowiedz
  • 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 :)

    Odpowiedz
    • 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ł ;)

      Odpowiedz
      • 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ć.

        Odpowiedz

Odpowiedz

anuluj

Masz uwagi?