ADLAR jeszcze raz

Proste przykłady do częstych pytań.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1212
Rejestracja: 17 sie 2015, 12:13
Kontakt:

ADLAR jeszcze raz

Post autor: niveasoft » 12 maja 2019, 11:57

Gdyby komuś nie było potrzebne odczytywanie ADC z dokładnością 10bit tylko wystarczy mu 8bit czyli zakres 0=255 to może użyć tej gotowej funkcji wykorzystującej funkcję ADC ustawianej bitem ADLAR.
Wykonuje się w 0.01ms (107taktów).
  1. $regfile = "m8adef.dat"
  2. $crystal = 8000000
  3. $hwstack = 32
  4. $swstack = 8
  5. $framesize = 24
  6.  
  7.  
  8. Config Submode = New
  9.  
  10. Config Lcd = 16x2
  11. Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2
  12. Cursor Off , Noblink
  13. Cls
  14.  
  15. Config Adc = Single , Prescaler = Auto , Reference = Avcc
  16.  
  17. Dim Adc_read As Byte
  18.  
  19. '-[ODCZYT ADC TYLKO OSIEM BIT]-
  20. Function Get_adc(byval Chnl As Byte)as Byte
  21.     Local Mux_byte As Byte
  22.  
  23.   Select Case Chnl
  24.    Case 0 : Mux_byte = &B01100000                           'REF=AVCC,ADLAR=ON
  25.    Case 1 : Mux_byte = &B01100001
  26.    Case 2 : Mux_byte = &B01100010
  27.    Case 3 : Mux_byte = &B01100011
  28.    Case 4 : Mux_byte = &B01100100
  29.    Case 5 : Mux_byte = &B01100101
  30.    Case Else
  31.     Get_adc = 0
  32.     Exit Function
  33.   End Select
  34.  
  35.   'po zmianie kanału lepiej pominąc pierwszy odczyt
  36.   Admux = Mux_byte                                          'ustaw kanał
  37.   Adcsr.adsc = 1                                            'wystartuj konwersję
  38.   Bitwait Adcsra.adsc , Reset                               'poczekaj na zakonczenie
  39.   Adcsr.adsc = 1                                            'wystartuj konwersję
  40.   Bitwait Adcsra.adsc , Reset                               'poczekaj na zakończenie
  41.   Get_adc = Adch                                            'odczytaj wynik
  42.  
  43. End Function
  44.  
  45.  
  46. Do
  47.   Adc_read = Get_adc(0)
  48.   Locate 1 , 3 : Lcd Adc_read ; "  "
  49.   Waitms 100
  50. Loop
Pikczu
Posty: 389
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: ADLAR jeszcze raz

Post autor: Pikczu » 12 maja 2019, 12:51

Dostałeś już Nextiona ?
Sorry że zaśmiecam jakiś czat by się przydał.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: ADLAR jeszcze raz

Post autor: Jacek » 12 maja 2019, 12:56

Cześć tak chat jak najbardziej.
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1212
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: ADLAR jeszcze raz

Post autor: niveasoft » 12 maja 2019, 13:04

Pomyślę nad czatem (jak to zrobić) bo nie mam rozeznania.
Nextion już tydzień leży. Fajna maszyna 7" 800x480 w obudowie. Wersja enchanced. Ma niby więcej wewnętrznego flash i jeden port 8 pin z czego cztery to mogą być PWM.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: ADLAR jeszcze raz

Post autor: pimowo » 11 paź 2020, 22:13

Zaciekawił mnie ten sposób pomiaru i nie byłbym sobą gdybym tego nie wypróbował, a że teraz coś takiego będę potrzebował to ta podpowiedź Bartka jak znalazł :D

Proszę o ocenę czy wszytko dobrze zrozumiałem i zrobiłem
*założenia:
- ATmega328, wew. oscylator 8MHz
- ma to być pomiar baterii 2x AA (3V)
- wewnętrzne napięcie odniesienia 1.1V
- chcę używać tylko jednego pinu ADC
.
  1. $regfile = "m328pdef.dat"
  2. $crystal = 8000000
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 64
  6.  
  7. Config Submode = New
  8.  
  9. Config Adc = Single , Prescaler = Auto , Reference = Internal
  10. Stop Adc
  11.  
  12. '--- rezystorowy dzielnik napięcia dla pomiaru baterii 0-4,4V ---
  13. '
  14. '                  30k
  15. '                  __
  16. '        ADC --*--|__|-- VCC
  17. '              |
  18. '              |   __
  19. '              *--|__|-- GND
  20. '
  21. '                  10k
  22.  
  23. '   V_bat = ADC * (Vref / 256) * 4
  24. '   V_bat = ADC * 0.0171875
  25.  
  26. Dim V_bat As String * 8
  27.  
  28. Sub Pomiar_baterii
  29.  
  30.    Start Adc
  31.  
  32.    Admux = &B11100101
  33.    Adcsr.adsc = 1                                           'wystartuj konwersję
  34.    Bitwait Adcsra.adsc , Reset                              'poczekaj na zakończenie
  35.    Adcsr.adsc = 1                                           'wystartuj konwersję
  36.    Bitwait Adcsra.adsc , Reset                              'poczekaj na zakończenie
  37.  
  38.    Local Pomiar As Word : Pomiar = 0
  39.  
  40.    For Helpx = 1 To 8
  41.  
  42.       Pomiar = Pomiar + Adch
  43.  
  44.    Next
  45.  
  46.    Stop Adc
  47.  
  48.    Shift Pomiar , Right , 3
  49.    Pomiar = Pomiar * 167                                    '
  50.    Pomiar = Pomiar / 100
  51.  
  52.    V_bat = Str(pomiar)
  53.    V_bat = Format(v_bat , "0.00")                           '<- taka postać mnie interesuje
  54.  
  55.    Print #pc , "ADC: " ; Adch ; " Bateria: " ; V_bat ; "V"  '<- to mi docelowo nie potrzebne
  56.  
  57. End Sub
  58.  
  59. Do : Loop : End
.
Odczyty zgadzają się z miernikiem.
Może podpowiecie czy da się tu jeszcze coś poprawić? ;)

<ciach>
To co pokazałem to jest wycinek z większego kodu.

<ciach>
Zrobiłem wszytko aby wszytko zrobić na liczbach całkowitych :shock:
ODPOWIEDZ