Prezentowany przetwornik C/A umożliwia zamianę 10-bitowego słowa cyfrowego na wartość napięcia. Zastosowana rozdzielczość przetwornika pozwala na uzyskanie 1024 poziomów napięcia. Komunikacja z przetwornikiem odbywa się poprzez magistralę I²C, dzięki czemu do ustalenia wartości napięcia wyjściowego potrzebne są jedynie dwie linie sygnałowe. Dzięki temu możliwe było znaczne ograniczenie liczby wyprowadzeń przetwornika, a tym samym zmniejszenie wymiarów płytki. Przetwornik może pracować w jednym z dwóch trybów: aktywnym oraz czuwania. W normalnym trybie na wyjściu generowane jest napięcie, a układ pobiera prąd o wartości około 0,35 mA. W trybie czuwania wartość pobieranego prądu spada do około 0,5 µA. W tym stanie przetwornik zostaje wyłączony, pracuje tylko moduł komunikacji I²C. Wybór trybu pracy jest dokonywany poprzez odpowiedni wpis do rejestru konfiguracyjnego.
Schemat elektryczny przetwornika jest przedstawiony na rys. 1. Jak widać, do jego budowy zastosowano zaledwie kilka elementów. Właściwym przetwornikiem jest układ US1, który wymaga do pracy zewnętrznego źródła napięcia odniesienia. Wartość napięcia doprowadzonego do wejścia Vref jest jednocześnie maksymalną wartością napięcia wyjściowego przetwornika. Napięcie Vref może przyjmować wartość od 0 V do VCC-1,2 V. W przedstawionym układzie zastosowano diodę referencyjną typu LM385, która dostarcza napięcie równe 2,5 V. Mieści się ono w wymaganym zakresie. Wyjście przetwornika można obciążać prądem o maksymalnej wartości 2 mA. Jeśli wymagana jest większa wydajność prądowa, to na wyjściu przetwornika należy dołączyć odpowiedni bufor zrealizowany np. na wzmacniaczu operacyjnym. Wszystkie sygnały potrzebne do komunikacji zostały wyprowadzone na złącze CON1.
Układ przetwornika został zmontowany na niewielkiej płytce (rys. 2), którą można następnie wlutować poprzez złącze CON1 do płytki budowanego urządzenia. W projekcie zastosowano większość elementów w obudowach SMD, dlatego montaż należy przeprowadzić z dużą precyzją. Przetwornik należy podłączyć z układem nadrzędnym, zgodnie z opisem sygnałów na złączu CON1.
Procedury obsługi przetwornika
Na list. 1 przestawione są procedury służące do obsługi przetwornika C/A. Przetwornik posiada jeden stały adres na magistrali I²C równy 90h. Adres ten nie może zostać zmieniony, dlatego do magistrali może być podłączony tylko jeden taki element. Układ TC1321 posiada trzy rejestry: konfiguracji, danej z przetwornika (starszy bajt), danej z przetwornika (młodszy bajt).
#define address 0x90 //adres ukladu I²C
#define Standby 1 //tryb obnizonej mocy
#define Normal 0 //normalny tryb pracy
#define hi(x) (*(&x+1)) //starszy bajt zmiennej long(MSB)
#define low(x) (*(&x)) //mlodszy bajt zmiennej long (LSB)
//******************************************************//
// Procedura zapisu wartości przetwornika C/A //
//******************************************************//
void WriteTC(long value)
{
value<<=6; //przesuniecie bitow
i2c_start(); //I²C START
i2c_write(address); //Wyslij adres ukladu I²C
i2c_write(0);
i2c_write(hi(value)); //wyslij starszy bajt wartosci
i2c_write(value); //wyslij mlodszy bajt wartosci
i2c_stop(); //I²C STOP
}
//******************************************************//
//******************************************************//
// Procedura odczytu wartości przetwornika C/A //
//******************************************************//
long ReadTC(void)
{ long value;
i2c_start(); //I²C START
i2c_write(address); //Wyslij adres ukladu I²C
i2c_write(0x00);
i2c_start(); //Ponowny I²C START
i2c_write(address|1); //I²C START i przelacz
//na odczyt
hi(value)=i2c_read(); //odbierz starszy bajt
// +ACK(potwierdzenie)
low(value)=i2c_read(0); //odbierz mlodszy bajt
//bez potwierdzenia
i2c_stop(); // I²C STOP
return(value>>6); //zwroc liczbe 0...1023
}
//******************************************************//
//******************************************************//
// Ustawianie trybu pracy ukladu TC1321 //
//******************************************************//
void SetTCMode(char mode)
{
i2c_start(); //I²C START
i2c_write(address); //Wyslij adres ukladu I²C
i2c_write(1); //wyslij adres komendy
i2c_write(mode); //wyslij wartosc
i2c_stop(); //I²C STOP
}
//******************************************************//
void main()
{long i=0;
SetTCMode(Normal);
//*****Generowanie przebiegu piloksztaltnego***//
while(1)
{
for(i=0;i<1024;i++)
{delay_ms(10);
WriteTC(i); } //zapisz wartosc do TC
}
}
//******************************************************//
Do obsługi zastosowano trzy procedury:
- SetTCMode – ustala tryb pracy: czuwania lub aktywny. Jeśli jako parametry zostanie podana „1”, to układ TC1321 przejdzie w tryb czuwania, parametr równy „0” wprowadzi układ w stan aktywny. Procedura zapisuje dane do rejestru konfiguracyjnego umieszczonego pod adresem równym 1.
- „WriteTC – procedura zapisuje wartość do rejestrów przetwornika C/A, jako parametr należy podać liczbę z zakresu 0÷1023, której wpis spowoduje ustalenie odpowiedniej wartości napięcia na wyjściu przetwornika. Napięcie to jest określone wzorem: Vout=Vref(DATA/1024).
- ReadTC – procedura odczytuje aktualną wartość rejestrów przetwornika i zwraca tę wartość jako parametr.
Przykładowy ciąg instrukcji zawarty w pętli While(1) generuje na wyjściu przetwornika przebieg piłokształtny.
Krzysztof Pławsiuk, EP
krzysztof.plawsiuk@ep.com.pl
- R1: 1 kΩ (1206)
- R2: 100 Ω (1206)
- C1: 4,7 µF/10 V (6032)
- C2: 100 nF (1206)
- D1: LM385-2,5V (TO92)
- US1: TC1321 (SO8)
- CON1: goldpin 1×5 męski kątowy