- MCP4921 DAC (przetwornik cyfrowo-analogowy)
- Wymagane składniki
- Schematyczny
- Objaśnienie kodu
- Testowanie konwersji cyfrowo-analogowej za pomocą PIC
Cyfrowe i analogowe są integralną częścią elektroniki. Większość urządzeń ma zarówno ADC, jak i DAC i są używane, gdy istnieje potrzeba konwersji sygnałów z analogowego na cyfrowy lub cyfrowego na analogowy. Również sygnały ze świata rzeczywistego, takie jak dźwięk i światło, mają naturę analogową, więc ilekroć te sygnały ze świata rzeczywistego mają być użyte, sygnały cyfrowe muszą zostać przekonwertowane na analogowe, na przykład w celu wytworzenia dźwięku za pomocą głośników lub do sterowania źródłem światła.
Innym typem przetwornika cyfrowo-analogowego jest modulator szerokości impulsu (PWM). PWM przyjmuje słowo cyfrowe i generuje impuls cyfrowy o zmiennej szerokości impulsu. Kiedy ten sygnał przechodzi przez filtr, wynik będzie czysto analogowy. Sygnał analogowy może zawierać wiele typów danych.
W tym samouczku połączymy DAC MCP4921 z Microchip PIC16F877A do konwersji sygnału cyfrowego na analogowy.
Tutaj, w tym samouczku, zamienimy sygnał cyfrowy na sygnał analogowy i wyświetlimy wejściową wartość cyfrową i wyjściową wartość analogową na wyświetlaczu LCD 16x2. Zapewni 1 V, 2 V, 3 V, 4 V i 5 V jako końcowe wyjście analogowe, które jest pokazane w wideo podanym na końcu. Możesz dowiedzieć się więcej o przetworniku cyfrowo-analogowym w naszym cennym samouczku dotyczącym współpracy przetwornika DAC z płytami Raspberry Pi, Arduino i STM32.
DAC może być używany w wielu zastosowaniach, takich jak sterowanie silnikiem, regulacja jasności diod LED, wzmacniacz audio, kodery wideo, systemy akwizycji danych itp. Przed przejściem bezpośrednio do części łączącej, ważne jest, aby zapoznać się z MCP4921.
MCP4921 DAC (przetwornik cyfrowo-analogowy)
MCP4921 to 12-bitowy przetwornik cyfrowo-analogowy, więc MCP4921 zapewni 12-bitową rozdzielczość wyjściową. Rozdzielczość przetwornika cyfrowo-analogowego oznacza liczbę bitów cyfrowych, które można przekształcić w sygnał analogowy. Ile wartości możemy dzięki temu osiągnąć, opiera się na wzorze. Dla 12-bitów jest to = 4096. Oznacza to, że 12-bitowy przetwornik cyfrowo-analogowy może wytworzyć 4096 różnych wyjść.
Korzystając z tej wartości, można łatwo obliczyć pojedyncze analogowe napięcie krokowe. Do obliczenia stopni wymagane jest napięcie odniesienia. Ponieważ napięcie logiczne dla urządzenia wynosi 5 V, napięcie krokowe wynosi 5/4095 (4096-1, ponieważ punkt początkowy dla sygnału cyfrowego nie jest 1, to jest 0), czyli 0,00122100122 miliwoltów. Zatem zmiana o 1 bit zmieni wyjście analogowe o 0,00122100122.
Więc to była część konwersji. MCP4921 jest 8-biegunowa IC. Schemat pin i opis można znaleźć poniżej.
Układ scalony MCP4921 komunikuje się z mikrokontrolerem za pomocą protokołu SPI. Do komunikacji SPI musi być urządzenie nadrzędne, które przesyła dane lub polecenie do urządzenia zewnętrznego podłączonego jako slave. W systemie komunikacji SPI do jednego urządzenia głównego można podłączyć wiele urządzeń podrzędnych.
Aby przesłać dane i polecenie, należy zapoznać się z rejestrem poleceń.
Na poniższym obrazku pokazano rejestr poleceń,
Rejestr komend jest rejestr 16-bitowy. W poleceniu konfiguracyjnym używane są bity-15 do bit-12. Wprowadzanie danych i konfiguracja są wyraźnie pokazane na powyższym obrazku. W tym projekcie MCP4921 będzie używany jako następująca konfiguracja:
Numer bitu |
Konfiguracja |
Wartość konfiguracji |
Bit 15 |
DAC A |
0 |
Bit 14 |
Niebuforowany |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Bit sterowania wyłączaniem zasilania wyjściowego |
1 |
Tak więc binarny to 0011 wraz z danymi, które są określone przez bity od D11 do D0 rejestru. 16-bitowe dane 0011 xxxx xxxx xxxx muszą być przesłane, gdzie pierwsze 4 bity MSB to konfiguracja, a reszta to LSB. Będzie to jaśniejsze, gdy zobaczysz diagram czasowy polecenia zapisu.
Zgodnie ze schematem czasowym i arkuszem danych, pin CS jest niski przez cały okres zapisywania poleceń do MCP4921.
Teraz przyszedł czas na połączenie urządzenia ze sprzętem i zapisanie kodów.
Wymagane składniki
W przypadku tego projektu wymagane są następujące komponenty:
- MCP4921
- PIC16F877A
- Kryształ 20 MHz
- Wyświetlacz LCD 16x2 znaków.
- Rezystor 2k -1 szt
- Kondensatory 33pF - 2 szt
- Rezystor 4,7k - 1 szt
- Multimetr do pomiaru napięcia wyjściowego
- Płytka prototypowa
- Zasilanie 5 V, ładowarka do telefonu może działać.
- Wiele drutów podłączeniowych lub drutów górskich.
- Środowisko programistyczne Microchip z zestawem Programmer i IDE z kompilatorem
Schematyczny
Schemat obwodu do połączenia DAC4921 z mikrokontrolerem PIC jest podany poniżej:
Obwód jest zbudowany w Breadboard-
Objaśnienie kodu
Pełny kod do konwersji sygnałów cyfrowych na analogowe za pomocą PIC16F877A podano na końcu artykułu. Jak zawsze, najpierw musimy ustawić bity konfiguracyjne w mikrokontrolerze PIC.
// PIC16F877A Ustawienia bitu konfiguracji // Instrukcje konfiguracji linii źródłowej „C” // CONFIG #pragma config FOSC = HS // Bity wyboru oscylatora (oscylator HS) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT wyłączony) # pragma config PWRTE = OFF // Power-up Timer bit Enable (PWRT wyłączony) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR włączony) #pragma config LVP = OFF // Niskie napięcie (pojedyncze zasilanie) Bit włączenia programowania szeregowego w obwodzie (pin RB3 / PGM ma funkcję PGM; programowanie niskonapięciowe włączone) #pragma config CPD = OFF // Bit ochrony kodu pamięci EEPROM danych (ochrona kodu danych EEPROM wyłączona) #pragma config WRT = OFF // Zapisywanie pamięci programu Flash Włącz bity (ochrona przed zapisem wyłączona; cała pamięć programu może być zapisywana przez sterowanie EECON) #pragma config CP = OFF // Bit ochrony kodu pamięci programu Flash (ochrona kodu wyłączona)
Poniższe linie kodu służą do integracji plików nagłówkowych LCD i SPI, a także deklarowana jest częstotliwość XTAL i połączenie pinów CS DAC.
Samouczek i bibliotekę PIC SPI można znaleźć pod podanym linkiem.
#zawierać
Funciton SPI_Initialize_Master () jest nieznacznie zmodyfikowana dla innej konfiguracji wymaganej dla tego projektu. W tym przypadku rejestr SSPSTAT jest skonfigurowany w taki sposób, że dane wejściowe próbkowane na koniec czasu wyprowadzania danych, a także zegar SPI skonfigurowany jako Transmisja zachodzą przy przejściu z trybu zegara aktywnego do stanu bezczynności. Inny jest taki sam.
void SPI_Initialize_Master () { TRISC5 = 0; // Ustaw jako wyjście SSPSTAT = 0b11000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Ustaw jako wyjście dla trybu slave }
Ponadto dla poniższej funkcji SPI_Write () jest nieznacznie zmodyfikowana. Transmisja danych nastąpi po wyczyszczeniu bufora, aby zapewnić doskonałą transmisję danych przez SPI.
void SPI_Write (przychodzące znaki) { SSPBUF = przychodzące; // Zapisz dane podane przez użytkownika w buforze while (! SSPSTATbits.BF); }
Ważną częścią programu jest sterownik MCP4921. Jest to nieco trudna część, ponieważ polecenie i dane cyfrowe są razem dziurkowane, aby zapewnić pełne 16-bitowe dane przez SPI. Jednak ta logika jest wyraźnie pokazana w komentarzach do kodu.
/ * Ta funkcja służy do konwersji wartości cyfrowej na analogową. * / void convert_DAC (wartość int bez znaku) { / * Rozmiar kroku = 2 ^ n, zatem 12 bitów 2 ^ 12 = 4096 W przypadku odniesienia 5 V krok będzie wynosić 5/4095 = 0,0012210012210012 V lub 1 mV (w przybliżeniu) * / kontener int unsigned; unsigned int MSB; unsigned int LSB; / * Krok: 1, zapisano 12-bitowe dane w kontenerze Załóżmy, że dane to 4095, binarnie 1111 1111 1111 * / container = wartość; / * Krok: 2 Tworzenie Dummy 8 bit. Tak więc, dzieląc 256, górne 4 bity są przechwytywane w LSB LSB = 0000 1111 * / LSB = pojemnik / 256; / * Krok: 3 Wysłanie konfiguracji z przebiciem 4-bitowych danych. LSB = 0011 0000 LUB 0000 1111. Wynik to 0011 1111 * / LSB = (0x30) - LSB; / * Krok: 4 Kontener nadal ma wartość 21-bitową. Wyodrębnianie dolnych 8 bitów. 1111 1111 AND 1111 1111 1111. Wynik to 1111 1111, czyli MSB * / MSB = 0xFF & kontener; / * Krok: 4 Wysłanie 16-bitowych danych poprzez podzielenie na dwa bajty. * / DAC_CS = 0; // CS jest niski podczas transmisji danych. Zgodnie z arkuszem danych wymagane jest SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
W funkcji głównej używana jest „pętla for”, w której tworzone są dane cyfrowe do tworzenia wyjścia 1V, 2V, 3V, 4V i 5V. Wartość cyfrowa jest obliczana na podstawie napięcia wyjściowego / 0,0012210012210012 miliwoltów.
void main () { system_init (); wprowadzenie_ekran (); liczba int = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0,0012210012210012; czysty ekran(); lcd_com (FIRST_LINE); lcd_puts ("DANE wysłane: -"); lcd_print_number (liczba); lcd_com (SECOND_LINE); lcd_puts ("Wyjście: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (liczba); __delay_ms (300); } } }
Testowanie konwersji cyfrowo-analogowej za pomocą PIC
Zbudowany obwód jest testowany za pomocą multimetru. Na poniższych ilustracjach napięcie wyjściowe i dane cyfrowe są pokazane na wyświetlaczu LCD. Multimetr pokazuje bliski odczyt.
Kompletny kod z działającym filmem znajduje się poniżej.