Skaczący wynik pomiaru na LCD

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Skaczący wynik pomiaru na LCD

Post autor: Zbyszek » 13 lut 2018, 22:15

Witam,
Urządzenie niby proste a jest problem. Przetwornik 4-20mA.
Jeżeli na wejściu ADC Atmegi jest napięcie 2,425V to na wyświetlaczu ma się wyświetlić wartość 450, a jeżeli na ADC Atmegi jest napięcie 0,809V to na wyświetlaczu ma się wyświetlić wartość 600. Nawet jak uśredniłem wynik ( ze 100 pomiarów ) to ostatnia cyfra skacze np. przy wartości 550 cały czas skacze 549, 550, 551 i tak w kółko. Bez uśredniania wyniku przy wartości ustawionej 550 na LCD pokazują się wyniki w zakresie od 539 do 563.
Schemat w załączniku poniżej. Bardzo proszę o podpowiedź jak to ugryźć. W normalnej sytuacji ta skacząca wartość nie miała by znaczenia ale w tym przypadku jest to bardzo ważne. Podłączając miernik pod piny, wartość napięcia jest stała, tzn. nie skacze, a wynik na LCD tak.
  1. $regfile = "m8def.dat"
  2. $crystal = 8000000
  3.  
  4.  
  5. '----- KONFIGURACJA WYŚWIETLACZA -----------------------------------------------
  6.  
  7. Config Lcd = 16 * 2
  8. Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5
  9. Cursor Off , Noblink
  10. Cls
  11.  
  12. '----- KONFIGURACJA PORTÓW WEJŚCIA I WYJŚCIA / SCL i SDA / 1 WIRE / ALIASY -----
  13.  
  14. Config Portb.0 = Output : Reset Portb.0 : Dodaj Alias Portb.0
  15. Config Portb.1 = Output : Reset Portb.1 : Disp Alias Portb.1
  16. Config Portb.2 = Output : Reset Portb.2
  17. Config Pinb.3 = Input : Set Portb.3 : Dn Alias Pinb.3
  18. Config Pinb.4 = Input : Set Portb.4 : Up Alias Pinb.4
  19. Config Pinb.5 = Input : Set Portb.5 : Menu Alias Pinb.5
  20. Config Portc.0 = Output : Reset Portc.0
  21. Config Portc.1 = Output : Reset Portc.1
  22. Config Portc.3 = Output : Reset Portc.3
  23. Config Portc.4 = Output : Reset Portc.4
  24. Config Portc.5 = Output : Reset Portc.5
  25. Config Portd.6 = Output : Set Portd.6 : Buzer Alias Portd.6
  26. Config Portd.7 = Output : Reset Portd.7 : Odejmij Alias Portd.7
  27.  
  28. '----- KONFIGURACJA ADC --------------------------------------------------------
  29.  
  30. Config Adc = Single , Prescaler = 128 , Reference = Internal
  31. Start Adc
  32. 'Config ADC = Single | Free
  33. 'Prescaler = Auto | 2| 4| 8 | 16 | 32 | 64 | 128
  34. 'Reference = Off | Avcc | Internal
  35.  
  36. '----- KONFIGURACJA TIMERÓW I PRZERWAŃ -----------------------------------------
  37.  
  38. Config Timer0 = Timer , Prescale = 256
  39. On Timer0 Generator_01s
  40. Enable Timer0
  41.  
  42. Enable Interrupts
  43.  
  44. '----- DEKLARACJA STAŁYCH I ZMIENNYCH ------------------------------------------
  45.  
  46. Dim Impuls As Byte , Licznik As Byte
  47.  
  48. Dim Suma_pary As Single , Krok As Word
  49. Dim Para As Word , Para_1 As Word , Para_2 As Word , Para_3 As Single , Para_4 As Word , Para_5 As Word
  50.  
  51. '----- STARTOWY ODCZYT EEPROM --------------------------------------------------
  52.  
  53.  
  54. '----- WARTOŚCI ZMIENNYCH USTALANE PRZY STARCIE --------------------------------
  55.  
  56.  
  57. Licznik = 0
  58.  
  59.  
  60. '----- PĘTLA GŁÓWNA ------------------------------------------------------------
  61.  
  62. Disp = 1
  63. Buzer = 0 : Waitms 500 : Buzer = 1
  64.  
  65. Do
  66.  
  67. If Licznik = 8 Then
  68.    Gosub Pomiar_ciśnienia
  69.       Locate 1 , 5 : Lcd "PARA " ; Para
  70.       Locate 2 , 13 : Lcd Para_2 ; " "
  71.       Licznik = 0
  72. End If
  73.  
  74. Loop
  75.  
  76. '*************************************
  77.  
  78. Pomiar_ciśnienia:
  79.  
  80. Suma_pary = 0
  81.    For Krok = 1 To 100
  82.       Para_1 = Getadc(2)
  83.       Suma_pary = Suma_pary + Para_1
  84.    Next Krok
  85.       Para_2 = Suma_pary / 100
  86.          Para_3 = Para_2 / 4.86
  87.             Para_4 = Para_3
  88.                Para = 656 - Para_4
  89. Return
  90.  
  91. '*************************************
  92.  
  93. Odejmowanie:
  94.  
  95.  
  96. Return
  97.  
  98. '*************************************
  99.  
  100. Dodawanie:
  101.  
  102.  
  103. Return
  104.  
  105. '*************************************
  106.  
  107. Przygotuj_odejmowanie:
  108.  
  109.  
  110. Return
  111.  
  112. '*************************************
  113.  
  114. Przygotuj_dodawanie:
  115.  
  116.  
  117. Return
  118.  
  119. '*************************************
  120.  
  121.  
  122. '*************************************
  123.  
  124. Generator_01s:
  125.  
  126. Load Timer0 = 250
  127.    Incr Impuls
  128.       If Impuls = 12 Then                                   '12*8ms=96ms
  129.          Impuls = 0
  130.          Incr Licznik
  131.       End If
  132.  
  133. Return
  134.  
  135. '*************************************
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Skaczący wynik pomiaru na LCD

Post autor: Pikczu » 14 lut 2018, 10:05

Mozesz pozbyc sie osatniej cyfry zrob shift right,1.
Ale koniecznie dodaj cos w stylu
  1. If para <> nowa_para Then                      '
  2. para = nowa_para
  3.  Locate 1 , 5 : Lcd "PARA " ; Para
  4.       Locate 2 , 13 : Lcd Para_2 ; " "
  5.  
  6. end if
Chodzi oto zeby nie wyswietlac na wyswietlaczu za kazdym razem jaka program wejdzie w pomiar tylko w tedy gdy dane beda nowe.
To napewno poprawi efekt wizulany na lcd, wspomniany shift right ,1 powinien poprawic pomiary, ale pomysl moze nad wiekszym kondensatorem C8.
Moze byc jescze spowodowane mala filtracja zasilania wzmacniacza operacyjnego.

Przepraszam za brak polskich znakow pisze z pracy.
Pikczu
Ostatnio zmieniony 14 lut 2018, 19:10 przez Pikczu, łącznie zmieniany 1 raz.
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Skaczący wynik pomiaru na LCD

Post autor: Zbyszek » 14 lut 2018, 10:54

Próbowałem już wcześniej zwiększać C8, ale to nie przynosi rezultatów. Nie za bardzo rozumiem kod który mi napisałeś. Mógłbyś mi coś konkretnego sklecić z tym shift right ?
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Skaczący wynik pomiaru na LCD

Post autor: Zbyszek » 14 lut 2018, 11:36

Wstawiłem linijkę Shift Para , Right , 1 ale to mi tylko podzieliło wynik przez 2 i w tym podzielonym ostatnia cyfra też skacze
Awatar użytkownika
niveasoft
Posty: 1221
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Skaczący wynik pomiaru na LCD

Post autor: niveasoft » 14 lut 2018, 12:22

"Wstawiłem linijkę Shift Para , Right , 1 ale to mi tylko podzieliło wynik przez 2" :D

Word pomieści 64 wyniki do 1023. <-przeczytaj jeszcze raz "Word pomieści 64 wyniki do 1023"
To znaczy że można napisać:
  1. Dim Adc_read As Word
  2.  
  3. Adc_read = Getadc(0)
  4. Adc_read = Adc_read + Getadc(0)
  5. Shift Adc_read, 1, Right
  6. 'wynikiem jest dodanie do siebie dwóch pomiarów i dopiero wtedy podzielenie przez dwa
idąc dalej można tak dodawać do siebie 64 wyniki i na końcu zrobić Shift 5 :D
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Skaczący wynik pomiaru na LCD

Post autor: Zbyszek » 14 lut 2018, 13:48

pisząc tak
Shift Adc_read, 1, Right
wywala mi błędy, musiałem napisać tak
Shift Adc_read, Right, 1
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Skaczący wynik pomiaru na LCD

Post autor: Zbyszek » 14 lut 2018, 13:53

zrobiłem tak:

Suma_pary = 0
For Krok = 1 To 64

Para_1 = Getadc(2)
Para_1 = Para_1 + Getadc(2)
Shift Para_1 , Right, 1

Suma_pary = Suma_pary + Para_1
Next Krok
Para_2 = Suma_pary / 64


... i dalej jest to samo, cały czas skacze o to cholerne 1
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Skaczący wynik pomiaru na LCD

Post autor: Henryk » 14 lut 2018, 14:24

Witam :D
@ Zbyszek , napisałeś przetwornik 4-20mA , te przetworniki pracują w pętli prądowej.
Jak uzyskujesz napięcie dla ADC :?:
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Skaczący wynik pomiaru na LCD

Post autor: Zbyszek » 14 lut 2018, 14:45

Zerknij na schemat, mierzę napięcie które odkłada się na rezystorze R15. 1,113V dla wartości 450 i 1,348V dla wartości 600. Jeżeli to wrzucisz na ADC to zmiany są mniejsze niż 150 ( 600-450 ). Trzeba to rozszerzyć aby zmiany były większe. Po przejściu przez US2A otrzymuję 2,425V dla wartości 450 i 0,809V dla wartości 600. Zmiany są wtedy na tyle duże że wynik trzeba podzielić. Jak zauważyłeś US2A pracuje jako wzmacniacz różnicowy i rozszerza wartość oraz przesuwa ją do zakresu 0 ... 2,5V, ale też odwraca wynik, ale odwracam to z powrotem programowo ( 1023 - wartość ). Zostało wolne US2B więc zrobiłem na nim zwykły wtórnik emiterowy, który tak jak kondensatorki blokujące 100nF, jeszcze nikomu nie zaszkodziły.

Myślę że rozwiązaniem problemu było by wyświetlanie wyniku wtedy jak on się faktycznie zmieni, tylko jak to zrobić, i jak Bartek tu nie pomoże to będzie problem :D
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Skaczący wynik pomiaru na LCD

Post autor: Zbyszek » 14 lut 2018, 15:02

Wiem, można założyć większy rezystor i wtedy można pominąć US2 ... otóż w tym przypadku nie można bo ten miernik pracuje z dwoma innymi założonymi w innych pomieszczeniach i pracuje z nimi w szeregu. Większy rezystor w pętli powodował przekłamania wskazań na tamtych miernikach.
ODPOWIEDZ