Zrobiłem do mojego zasilacza układ mierzący napięcia oparty na przetworniku ADC ADS1110.
Mierzę nim na suwaku potencjometra napięcie z przedziału od 0V do 150mV. (regulacja ograniczenia prądowego)
Schodzę z napięciem w dół od 150mV i nagle poniżej 16,4mV wyświetla mi się wartość 0,000V po czym od 15,9mV do zera znów schodzi płynnie. Myślałem, że uszkodzony jest potencjometr. Sprawdziłem napięcie multimetrem i na multimetrze schodzi płynnie do zera, bez żadnych przerw.
Oto kod jaki mam do odczytu napięcia:
- ' OBSŁUGA ADS1110 VER.2
- $regfile = "m32def.dat"
- $crystal = 11059200
- ' Konfiguracja LCD 2X16
- Config Lcdpin = Pin , E = PortA.3 , Rs = PortA.2 , Db7 = PortA.7 , Db6 = PortA.6 , Db5 = PortA.5 , Db4 = PortA.4
- Config Lcd = 16x2
- Cursor Off
- Cls
- ' Konfiguracja I2C
- $lib "i2c_twi.lbx"
- Config Scl = Portc.0
- Config Sda = Portc.1
- 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
- 'Dim Sig As String * 1 'Deklaracja dodatkowej zmiennej - znak
- Dim Pomiarll As Byte
- '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]
- 'Addressw = &B10010110 '150; adres zapizu danych dla [ED3]
- 'Addressr = &B10010111 '151; adres odczytu danych dla [ED3]
- '=====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
- Pomiarll = Pomiarl + 0009
- Napiecie = Pomiarh * 256 'Przekształcenie
- Napiecie = Napiecie + Pomiarll
- Napiecie = Napiecie * 2.048 'Dla ADS1110 wpisujemy napięcie referencyjne = 2.048V
- Napiecie = Napiecie / 32768
- Napiecie = Napiecie / Pga
- Napiecie = Napiecie * 1 'Współczynnik K podziału (dzielnik rezystorowy) jeśli brak dzielnika, to wpisz 1
- Return
- '-----PROCEDURA WYŚWIETLENIA WARTOŚCI MIERZONEGO NAPIĘCIA NA LCD-----
- Wyswietl:'Wyświetlenie Pomiaru Na Lcd
- Voltages = Fusing(napiecie , "&&.&&&&") 'Zaokrąglenie Wart. Napięcia
- Locate 1 , 1
- Lcd "ADS1110[ED7] V.2"
- Locate 2 , 1
- Lcd Voltages ; "V "
- Return
Skąd ten problem dziurą w pomiarze pomiędzy 15,9mV a 16,4mV?
Może jakiś problem z tym kodem jest?
Bardzo proszę o pomoc.
Dodam jeszcze, że nie zawsze w tych samych wartościach przeskakuje wyświetlany wynik. Czasami udaje się zejść poniżej 16mV, ale wtedy bardzo powoli kręcę potencjometrem.
Może gubi jakieś bity po drodze?
Dodam, że I2C odseparowałem od mikrokontrolera za pomocą ADUM1250.