Strona 1 z 2

Dziwny błąd pomiaru napięcia ADS1110

: 28 mar 2021, 15:39
autor: Michał6201
Witam

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:
  1.  
  2.          ' OBSŁUGA ADS1110 VER.2
  3.  
  4.  
  5.  $regfile = "m32def.dat"
  6. $crystal = 11059200
  7.  
  8. ' Konfiguracja LCD 2X16
  9.     Config Lcdpin = Pin , E = PortA.3 , Rs = PortA.2 , Db7 = PortA.7 , Db6 = PortA.6 , Db5 = PortA.5 , Db4 = PortA.4
  10.     Config Lcd = 16x2
  11.     Cursor Off
  12.     Cls
  13.  
  14. ' Konfiguracja I2C
  15. $lib "i2c_twi.lbx"
  16. Config Scl = Portc.0
  17. Config Sda = Portc.1
  18. I2cinit
  19. Config Twi = 100000
  20.  
  21.  
  22.  
  23. ' Konfiguracj zmiennych
  24. Dim Default As Byte
  25. Dim Napiecie As Single
  26. Dim Pga As Integer
  27. Dim Addressw As Byte
  28. Dim Addressr As Byte
  29. Dim Pomiarh As Byte
  30. Dim Pomiarl As Byte
  31. Dim Voltages As String * 10
  32. Pga = 1 'stopien wzmocnienia
  33. 'Dim Sig As String * 1 'Deklaracja dodatkowej zmiennej - znak
  34. Dim Pomiarll As Byte
  35.  
  36. 'Default = &B10001100 ' ustawienie parametrów pracy, Bez tego rejestru układ ma fabryczne ustawienia
  37. Addressw = &B10011110 '158; adres zapizu danych dla [ED7]
  38. Addressr = &B10011111 '159; adres odczytu danych dla [ED7]
  39.  
  40. 'Addressw = &B10010110 '150; adres zapizu danych dla [ED3]
  41. 'Addressr = &B10010111 '151; adres odczytu danych dla [ED3]
  42.  
  43. '=====GŁÓWNA PĘTLA=====
  44.  
  45. Do
  46. Gosub Odczyt                                                'Skoko do procedury odczytu danych
  47. Cursor Off
  48. Gosub Wyswietl                                              'Skok do proceduty wyświetlenia wyniku na LCD
  49. Waitms 250
  50. Waitms 250
  51. Loop
  52. End
  53. '=====KONIEC GŁÓWNEJ PĘTLI=====
  54.  
  55.  
  56. '-------PROCEDURA ODCZYTU DANYCH Z ADS1110-----
  57.  
  58. Odczyt:
  59. I2cstart
  60. I2cwbyte Addressr       'Adres Do Odczytu
  61. I2crbyte Pomiarh , Ack  'Odczyt Pomiaru
  62. I2crbyte Pomiarl , Nack
  63. I2cstop 'Bit Stopu
  64.  
  65. Pomiarll = Pomiarl + 0009
  66.  
  67. Napiecie = Pomiarh * 256        'Przekształcenie
  68. Napiecie = Napiecie + Pomiarll
  69.  
  70. Napiecie = Napiecie * 2.048  'Dla ADS1110 wpisujemy napięcie referencyjne = 2.048V
  71. Napiecie = Napiecie / 32768
  72. Napiecie = Napiecie / Pga
  73. Napiecie = Napiecie * 1      'Współczynnik K podziału (dzielnik rezystorowy) jeśli brak dzielnika, to wpisz 1
  74.  
  75. Return
  76.  
  77. '-----PROCEDURA WYŚWIETLENIA WARTOŚCI MIERZONEGO NAPIĘCIA NA LCD-----
  78. Wyswietl:'Wyświetlenie Pomiaru Na Lcd
  79. Voltages = Fusing(napiecie , "&&.&&&&") 'Zaokrąglenie Wart. Napięcia
  80. Locate 1 , 1
  81. Lcd "ADS1110[ED7] V.2"
  82.  Locate 2 , 1
  83. Lcd Voltages ; "V       "
  84. Return
  85.  


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.

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 0:00
autor: niveasoft
Rano się coś pomyśli ;) Dziś już mam dość :D

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 1:04
autor: Michał6201
Będę Ci wdzięczny za pomoc.
Zauważyłem, pewną zależność z tymi błędami pomiarowymi. Może to coś pomoże:

Dziury w pomiarach pojawiają się w następujących wartościach mierzonego napięcia:

15,9mV - 16,5mV
31,9mV - 32,5mV
47,9mV - 48,5mV
63,9mV - 64,5mV
78,9mV - 80,5mV
i tak dalej...

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 1:05
autor: niveasoft
Podłączyłeś to dobrze?
Pomiar na pin 1 a pin 6 do masy.
Ta dziura to możliwe, że przez to +9 bo jak pojawi się piętnasty bit oznaczający minus...
Nie powinno się dodawać do bajtów Integera przed złożeniem go w całość bo w bajcie High bit 7 oznacza bit 15 w całości który oznacza minus.
Na domyślnych ustawieniach powinien mierzyć sam automatycznie do 15 próbek na sekundę więc konfigurować go chyba nie trzeba.

16bit tutaj jest od -32768 do +32767. W Single Ended jednak niby połowa rozdzielczości.
Może lepiej obliczyć Const K = 2.48 / 32768
  1. Const K = 2.48 / 32768
  2. Dim New_adc As Integer
  3. New_adc = Makeint(Pomiarl,Pomiarh)
  4. Napiecie = New_adc * K

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 1:39
autor: Michał6201
Tak, dobrze podłączony. pin6 do gnd, pin1 wejście in+

W tym kodzie mierzy płynnie, ale poniżej 16mV pokazuje 0,0000V
  1.  
  2. $regfile = "m32def.dat"
  3. $crystal = 11059200
  4.  
  5. ' Konfiguracja LCD 2X16
  6.     Config Lcdpin = Pin , E = PortA.3 , Rs = PortA.2 , Db7 = PortA.7 , Db6 = PortA.6 , Db5 = PortA.5 , Db4 = PortA.4
  7.     Config Lcd = 16x2
  8.     Cursor Off
  9.     Cls
  10.  
  11. ' Konfiguracja I2C
  12. $lib "i2c_twi.lbx"
  13. Config Scl = Portc.0
  14. Config Sda = Portc.1
  15. I2cinit
  16. Config Twi = 100000
  17.  
  18.  
  19.  
  20. ' Konfiguracj zmiennych
  21. Dim Default As Byte
  22. Dim Napiecie As Single
  23. Dim Pga As Integer
  24. Dim Addressw As Byte
  25. Dim Addressr As Byte
  26. Dim Pomiarh As Byte
  27. Dim Pomiarl As Byte
  28. Dim Voltages As String * 10
  29. Pga = 1 'stopien wzmocnienia
  30. 'Dim Sig As String * 1 'Deklaracja dodatkowej zmiennej - znak
  31. 'Dim Pomiarll As Byte
  32.  
  33. 'Default = &B10001100 ' ustawienie parametrów pracy, Bez tego rejestru układ ma fabryczne ustawienia
  34. Addressw = &B10011110 '158; adres zapizu danych dla [ED7]
  35. Addressr = &B10011111 '159; adres odczytu danych dla [ED7]
  36.  
  37. 'Addressw = &B10010110 '150; adres zapizu danych dla [ED3]
  38. 'Addressr = &B10010111 '151; adres odczytu danych dla [ED3]
  39.  
  40. '=====GŁÓWNA PĘTLA=====
  41.  
  42. Do
  43. Gosub Odczyt                                                'Skoko do procedury odczytu danych
  44. Cursor Off
  45. Gosub Wyswietl                                              'Skok do proceduty wyświetlenia wyniku na LCD
  46. Waitms 250
  47. Waitms 250
  48. Loop
  49. End
  50. '=====KONIEC GŁÓWNEJ PĘTLI=====
  51.  
  52.  
  53. '-------PROCEDURA ODCZYTU DANYCH Z ADS1110-----
  54.  
  55. Odczyt:
  56. I2cstart
  57. I2cwbyte Addressr       'Adres Do Odczytu
  58. I2crbyte Pomiarh , Ack  'Odczyt Pomiaru
  59. I2crbyte Pomiarl , Nack
  60. I2cstop 'Bit Stopu
  61.  
  62.  
  63.  
  64. Napiecie = Pomiarh * 256        'Przekształcenie
  65. Napiecie = Napiecie + Pomiarl
  66.  
  67. If Napiecie >= 32767 Then 'jesli Napiecie(word) >= 32767
  68. Napiecie = 0
  69. Napiecie = 65527 - Napiecie 'oblicz wartosc dopelnienia do 65535 65527
  70. 'Sig = "-" 'i ustaw zmienna Sig na znak minus
  71. End If
  72.  
  73. Napiecie = Napiecie * 2.048  'Dla ADS1110 wpisujemy napięcie referencyjne = 2.048V
  74. Napiecie = Napiecie / 32768
  75. Napiecie = Napiecie / Pga
  76. Napiecie = Napiecie * 1      'Współczynnik K podziału (dzielnik rezystorowy) jeśli brak dzielnika, to wpisz 1
  77.  
  78.  
  79. If Pomiarh = 0 Then  ' Autozerowanie
  80. napiecie = 0
  81. end if
  82.  
  83. Return
  84.  
  85. '-----PROCEDURA WYŚWIETLENIA WARTOŚCI MIERZONEGO NAPIĘCIA NA LCD-----
  86. Wyswietl:'Wyświetlenie Pomiaru Na Lcd
  87. Voltages = Fusing(napiecie , "&&.&&&&") 'Zaokrąglenie Wart. Napięcia
  88. Locate 1 , 1
  89. Lcd "ADS1110[ED7] V.2"
  90.  Locate 2 , 1
  91. Lcd Voltages ; "V       "
  92. Return
  93.  

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 1:45
autor: niveasoft
Ty tego dalej nie rozumiesz. Nie możesz wrzucać pierwszego bajtu do Single i potem go mnożyć x 256.
Zrozum. Prawdopodobnie pokazuje tam minus. Możesz dopisać offset później, ale na razie nie oszukuj.
  1.  
  2. $regfile = "m32def.dat"
  3. $crystal = 11059200
  4.  
  5. ' Konfiguracja LCD 2X16
  6.     Config Lcdpin = Pin , E = PortA.3 , Rs = PortA.2 , Db7 = PortA.7 , Db6 = PortA.6 , Db5 = PortA.5 , Db4 = PortA.4
  7.     Config Lcd = 16x2
  8.     Cursor Off
  9.     Cls
  10.  
  11. ' Konfiguracja I2C
  12. $lib "i2c_twi.lbx"
  13. Config Scl = Portc.0
  14. Config Sda = Portc.1
  15. I2cinit
  16. Config Twi = 100000
  17.  
  18.  
  19.  
  20. ' Konfiguracj zmiennych
  21. Dim Default As Byte
  22. Dim Napiecie As Single
  23. Dim Pga As Integer
  24. Dim Addressw As Byte
  25. Dim Addressr As Byte
  26. Dim Pomiarh As Byte
  27. Dim Pomiarl As Byte
  28. Dim Voltages As String * 10
  29. Pga = 1 'stopien wzmocnienia
  30. 'Dim Sig As String * 1 'Deklaracja dodatkowej zmiennej - znak
  31. 'Dim Pomiarll As Byte
  32.  
  33. 'Default = &B10001100 ' ustawienie parametrów pracy, Bez tego rejestru układ ma fabryczne ustawienia
  34. Addressw = &B10011110 '158; adres zapizu danych dla [ED7]
  35. Addressr = &B10011111 '159; adres odczytu danych dla [ED7]
  36.  
  37. 'Addressw = &B10010110 '150; adres zapizu danych dla [ED3]
  38. 'Addressr = &B10010111 '151; adres odczytu danych dla [ED3]
  39.  
  40. '=====GŁÓWNA PĘTLA=====
  41.  
  42. Do
  43. Gosub Odczyt                                                'Skoko do procedury odczytu danych
  44. Cursor Off
  45. Gosub Wyswietl                                              'Skok do proceduty wyświetlenia wyniku na LCD
  46. Waitms 250
  47. Waitms 250
  48. Loop
  49. End
  50. '=====KONIEC GŁÓWNEJ PĘTLI=====
  51.  
  52.  
  53. '-------PROCEDURA ODCZYTU DANYCH Z ADS1110-----
  54.  
  55. Odczyt:
  56. I2cstart
  57. I2cwbyte Addressr       'Adres Do Odczytu
  58. I2crbyte Pomiarh , Ack  'Odczyt Pomiaru
  59. I2crbyte Pomiarl , Nack
  60. I2cstop 'Bit Stopu
  61.  
  62.  
  63.     Const K = 2.48 / 32768
  64.     Dim New_adc As Integer
  65.     New_adc = Makeint(Pomiarl,Pomiarh)
  66. 'tu możesz dodać offset
  67.    ' Napiecie = Napiecie + 9            'na przykład
  68.     Napiecie = New_adc * K
  69.  
  70. Return
  71.  
  72. '-----PROCEDURA WYŚWIETLENIA WARTOŚCI MIERZONEGO NAPIĘCIA NA LCD-----
  73. Wyswietl:'Wyświetlenie Pomiaru Na Lcd
  74. Voltages = Fusing(napiecie , "&&.&&&&") 'Zaokrąglenie Wart. Napięcia
  75. Locate 1 , 1
  76. Lcd "ADS1110[ED7] V.2"
  77.  Locate 2 , 1
  78. Lcd Voltages ; "V       "
  79. Return

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 1:55
autor: niveasoft
Może to Tobie da do myślenia.
Minus jeden to jest szesnaście jedynek i tak to wyśle ADS w dwóch bajtach
Wstaw pierwsze osiem jedynek do Single i pomnóż x256.
Teraz dodaj kolejne osiem jedynek i wyświetl wynik.
Zgadza się? Wątpię.

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 2:00
autor: niveasoft
A teraz zerknij co wyświetli jak to zrobisz "porządnie".

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 2:14
autor: Michał6201
Zrobiłem to co napisałeś i działa płynnie :)
Jedynie wynik zaniża o 0,5mV

Przy zwartym wejściu in+ do gnd, pokazuje wartość: -0,0005V
Dodając tam offset, nie zmieniło to wyniku pomiaru.
  1.  
  2. regfile = "m32def.dat"
  3.     $crystal = 11059200
  4.  
  5.     ' Konfiguracja LCD 2X16
  6.         Config Lcdpin = Pin , E = PortA.3 , Rs = PortA.2 , Db7 = PortA.7 , Db6 = PortA.6 , Db5 = PortA.5 , Db4 = PortA.4
  7.         Config Lcd = 16x2
  8.         Cursor Off
  9.         Cls
  10.  
  11.     ' Konfiguracja I2C
  12.     $lib "i2c_twi.lbx"
  13.     Config Scl = Portc.0
  14.     Config Sda = Portc.1
  15.     I2cinit
  16.     Config Twi = 100000
  17.  
  18.  
  19.  
  20.     ' Konfiguracj zmiennych
  21.     Dim Default As Byte
  22.     Dim Napiecie As Single
  23.     Dim Pga As Integer
  24.     Dim Addressw As Byte
  25.     Dim Addressr As Byte
  26.     Dim Pomiarh As Byte
  27.     Dim Pomiarl As Byte
  28.     Dim Voltages As String * 10
  29.     Pga = 1 'stopien wzmocnienia
  30.  
  31.  
  32.     'Default = &B10001100 ' ustawienie parametrów pracy, Bez tego rejestru układ ma fabryczne ustawienia
  33.     Addressw = &B10011110 '158; adres zapizu danych dla [ED7]
  34.     Addressr = &B10011111 '159; adres odczytu danych dla [ED7]
  35.  
  36.     'Addressw = &B10010110 '150; adres zapizu danych dla [ED3]
  37.     'Addressr = &B10010111 '151; adres odczytu danych dla [ED3]
  38.  
  39.     '=====GŁÓWNA PĘTLA=====
  40.  
  41.     Do
  42.     Gosub Odczyt                                                'Skoko do procedury odczytu danych
  43.     Cursor Off
  44.     Gosub Wyswietl                                              'Skok do proceduty wyświetlenia wyniku na LCD
  45.     Waitms 250
  46.     Waitms 250
  47.     Loop
  48.     End
  49.     '=====KONIEC GŁÓWNEJ PĘTLI=====
  50.  
  51.  
  52.     '-------PROCEDURA ODCZYTU DANYCH Z ADS1110-----
  53.  
  54.     Odczyt:
  55.     I2cstart
  56.     I2cwbyte Addressr       'Adres Do Odczytu
  57.     I2crbyte Pomiarh , Ack  'Odczyt Pomiaru
  58.     I2crbyte Pomiarl , Nack
  59.     I2cstop 'Bit Stopu
  60.  
  61.  
  62.         Const K = 2.048 / 32768
  63.         Dim New_adc As Integer
  64.         New_adc = Makeint(Pomiarl,Pomiarh)
  65.     'tu możesz dodać offset
  66.        Napiecie = Napiecie + 9            'na przykład
  67.         Napiecie = New_adc * K
  68.  
  69.     Return
  70.  
  71.     '-----PROCEDURA WYŚWIETLENIA WARTOŚCI MIERZONEGO NAPIĘCIA NA LCD-----
  72.     Wyswietl:'Wyświetlenie Pomiaru Na Lcd
  73.     Voltages = Fusing(napiecie , "&&.&&&&") 'Zaokrąglenie Wart. Napięcia
  74.     Locate 1 , 1
  75.     Lcd "ADS1110[ED7] V.4"
  76.      Locate 2 , 1
  77.     Lcd Voltages ; "V       "
  78.     Return
  79.  

Re: Dziwny błąd pomiaru napięcia ADS1110

: 29 mar 2021, 2:15
autor: niveasoft
Dodaj eksperymentalnie coś więcej niż 9.
Można to chyba nawet policzyć... Przy stałych można pisać skomplikowane równania z nawiasami bo liczy to komputer a nie procek. Dlatego lepiej to mieć policzone niż w kółko mnożyć i dzielić co odczyt.
  1. Const Offset = 32768 /(2.048 / 0.0005)                    'wychodzi 8 jeśli jeszcze nie śpię
  2. Napiecie = Napiecie + Offset            'na przykład    
...no ale jak się nie zgadza ... Sprawdź miernik :D Wpięty w tę samą masę :?:
Zamiast 0.0005 możesz spróbować wpisać np. 0.0010