Jako, że zabieram się za budowę zasilacza, postanowiłem przy okazji przyjrzeć się przetwornikowi ADS1110 do pomiaru napięcia. Jest to 16 Bitowy przetwornik analogowo cyfrowy z własnym napięciem odniesienia.
Kupiłem go już dawno temu, ale nigdy nie miałem okazji sprawdzić jak on działa.
Dzisiaj w końcu wykonałem malutką płytkę pod ten przetwornik.
Komunikacja z mikrokontrolerem odbywa się poprzez i2c. ADS1110 dostępny jest w ośmiu różnych wersjach adresowych. Każdy z nich oznaczony jest jako EDx. gdzie x oznacza dany wariant. Mi trafił się ED7. Czyli jego adres to 10011110 (158). Wykaz adresów podany jest w datascheet.
Przy napisaniu kodu do obsługi przetwornika posłużyłem się fragmentami kodów znalezionych w internecie.
Po każdym uruchomieniu układ sam resetuje się i pracuje z ustawieniami fabrycznymi. Jeśli chcemy je mienić, to musimy zapisać rejestr konfiguracji.
Oto Bity rejestru DEFAULT:
7 - W trybie ciągłej konwersji STRD określa kiedy nowe dane do odczytu są gotowe. Jeśli 1, to dane są już odczytane, jeśli 0, to dane są nowe i nie odczytane
6 - bez zmian. Musi być 0
5 - bez zmian. Musi być 0
4 - Wartość 1 dla ustawienia pojedynczej konwersji, zaś wartość 0 ustawia nam ciągłą konwersję
3 i 2 - tu wybieramy szybkość magistrali I2C. Wartości 1 i 1 ustawiają prędkość domyślną
1 i 0 - ustawienie wartości wzmocnienia (1,2,4,8) Dla obydwóch bitów wartość 0 daje nam wzmocnienie = 1 i jest to standardowe ustawienie.
W załączeniu działający kod:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- ' OBSŁUGA ADS1110 VER.2
- $regfile = "m8adef.dat"
- $crystal = 8000000
- ' Konfiguracja LCD 2X16
- Config Lcdpin = Pin , E = PortD.0 , Rs = PortD.1 , Db7 = PortD.2 , Db6 = PortD.3 , Db5 = PortD.4 , Db4 = PortD.5
- Config Lcd = 16x2
- Cursor Off
- Cls
- ' Konfiguracja I2C
- $lib "i2c_twi.lbx"
- Config Scl = Portc.5
- Config Sda = Portc.4
- I2cinit
- Config Twi = 100000
- ' Konfiguracj zmiennych
- Dim Default As Byte
- Dim Napiecie As Single
- Dim Pga As Integer
- Dim Addressw As Byte
- Dim Addressr As Byte
- Dim Pomiarh As Byte
- Dim Pomiarl As Byte
- Dim Voltages As String * 10
- Pga = 1 'stopien wzmocnienia
- ' Default = &B10001100 ' ustawienie parametrów pracy, Bez tego rejestru układ ma fabryczne ustawienia
- Addressw = &B10011110 '158; adres zapizu danych dla [ED7]
- Addressr = &B10011111 '159; adres odczytu danych dla [ED7]
- '=====GŁÓWNA PĘTLA=====
- Do
- Gosub Odczyt 'Skoko do procedury odczytu danych
- Cursor Off
- Gosub Wyswietl 'Skok do proceduty wyświetlenia wyniku na LCD
- Waitms 250
- Waitms 250
- Loop
- End
- '=====KONIEC GŁÓWNEJ PĘTLI=====
- '-------PROCEDURA ODCZYTU DANYCH Z ADS1110-----
- Odczyt:
- I2cstart
- I2cwbyte Addressr 'Adres Do Odczytu
- I2crbyte Pomiarh , Ack 'Odczyt Pomiaru
- I2crbyte Pomiarl , Nack
- I2cstop 'Bit Stopu
- Napiecie = Pomiarh * 256 'Przekształcenie
- Napiecie = Napiecie + Pomiarl
- 'Dla ADS1100 wpisujemy napięcie referencyjne = 2.048V
- Napiecie = Napiecie * 2.048
- Napiecie = Napiecie / 32768
- Napiecie = Napiecie / Pga
- Napiecie = Napiecie * 10.6 'Współczynnik K podziału (dzielnik rezystorowy)
- Return
- '-----PROCEDURA WYŚWIETLENIA WARTOŚCI MIERZONEGO NAPIĘCIA NA LCD-----
- Wyswietl: 'Wyświetlenie Pomiaru Na Lcd
- Voltages = Fusing(napiecie , "00.&&&&") 'Zaokrąglenie Wart. Napięcia
- Locate 1 , 1
- Lcd "ADS1110[ED7] V.2"
- Locate 2 , 1
- Lcd "U=" ; Voltages ; "V " '
- Return
Niby niewiele, ale dlaczego tak się dzieje? Jakieś zakłócenia?
Natomiast po podłączeniu do mierzonego napięcia (+5V) zarówno ADS1110 a także miernika, różnica wyświetlanej wartości, to 0.006V -> ADS1110 pokazał 5,0489V natomiast miernik 5,0423V
Co tym sądzicie?