logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8][bascom] niepoprawny wynik przetwornika ADC

misiek_0000 16 Lip 2008 17:08 3881 15
REKLAMA
  • #1 5348320
    misiek_0000
    Poziom 10  
    Witam

    W moim projekcie używam Atmegi8L do przetwarzania napięcia przesłanego z czujnika ciśnienia (MPX5700AP) i do wyświetlenia tej wartości na wyświetlaczu LCD. Jednak otrzymane wyniki sz bardzo rozbieżne i na pewno nieprzystające do rzeczywistości... (wyświetla od 30 do 70kPa)
    Podejrzewam dwie rzeczy:
    1) błędy w odpowiednim skonfigurowaniu przetwornika (zwłaszcza jeśli chodzi o napięcie odniesienia)
    2) błędy w przeliczaniu danych z przetwornika

    Poniżej zamieszczam schemat i kod programu, za wszelkie podpowiedzi będę wdzięczny :)

    [atmega8][bascom] niepoprawny wynik przetwornika ADC

    ****
    Wartości elementów:
    C1,C2,C3=10 µF
    R1=10 kΩ
    ****

    
    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 1a
    Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2
    Config Lcdpin = Pin , Db6 = Portd.1 , Db7 = Portd.0
    Config Lcdpin = Pin , E = Portd.4 , Rs = Portd.5
    
    Dim Wartosc As Word
    Dim A As Single
    Dim B As Single
    
    Config Adc = Single , Prescaler = Auto , Reference = Off
    
    Start Adc
    
    Do
    Cls
    
    Wartosc = Getadc(0)
    A = Wartosc * 700    'wartosc odczytana * max zakres czujnika (700kPa)
    B = A / 1024            ' i podzielone przez rozdzielczosc przetwornika
    
    Lcd "P=" ; Fusing(b , "#.##") ;
    Lcd "kPa"
    
    Waitms 500
    Loop
    
    End
    
  • REKLAMA
  • #2 5348561
    dawid512
    Poziom 32  
    Cytat z noty:
    Cytat:
    0.2 to 4.7 V OUTPUT


    Przyjmijmy ze max napiecie na wyjsciu przetwornika to 5V(4.8V).
    A wiec:
    
    Dim Wart_nap As String * 5
    .....
    
    Wartosc = Getadc(0) 
    A=Wartosc * 0.0048
    Wart_nap = Fusing(A , "##.&&")
    
    


    Teraz to co podasz na ADC0 czyli napiecie w zakresie 0-5V bedziesz mial w zmiennej Wart_nap.
  • Pomocny post
    #3 5352177
    K_o_n_r_a_d
    Poziom 23  
    Tak skonstruowany układ będzie bardzo niedokładny.
    1. Napięcie odniesienia przetwornika jest podłączone zewnętrznie do napięcia zasilania.
    2. Napięcie zasilania nie jest filtrowane.
    3. Napięcie zasilania czujnika (mające wpływ na wskazania) nie jest w ogóle filtrowane. Przeczytaj i obejrzyj rysunki tu (Twoja podstawowa lektura do tego układu): http://www.freescale.com/files/sensors/doc/data_sheet/MPX5700.pdf?pspll=1
    4. Sygnał wyjściowy z przetwornika tez nie jest filtrowany.
    5. Przyjrzyj się wykresowi w nocie i danym o błędzie czujnika.
    Wszystko to jest powodem problemu.
  • #4 5352607
    misiek_0000
    Poziom 10  
    1) Na forum przeczytałem ze można (nawet ze jest to wewnętrznie zwarte) wiec nie rozumiem dlaczego miałby to być błąd... W końcu chce mieć napięcie odniesienia 5v...No chyba ze chodzi Ci o filtrowanie napięcia referencyjnego?
    2) Myślałem ze stabilizator na wejściu zasilania załatwi sprawę ale skoro uważasz inaczej to sie dołoży się kondensator :)
    3,4,5) Przepraszam nie zwrociłem uwagi na ten mały rysuneczek
    :oops:
    Jutro trawie nowa płytke wiec dołoże co trzeba i zobaczę czy błędy będą mniejsze.

    Pytanie co do kodu - czy obliczenia wygladają na poprawne ? Bo coś czuje ze znów coś oczywistego pominąłem...
    
    .......
    
    Start Adc
    Do
    Cls
    
    Wartosc = Getadc(0)
    A = Wartosc * 0.00458  'Wartość z przetwornika * (max napięcie na'przetworniku/1024) czyli 0,00485
    
    B = A - 0.2                    'Ponieważ czujnik daje 0,2V gdy P=0kPa
    Wart_nap = Fusing(B , "##.&&")
    Lcd Wart_nap
    
    C = B * 155.55             'Napięcie *kPa/V 
    Wart_cisnienia =Fusing(C , "##.&&")
    Lcd Wart_nap
    
    Waitms 500
    Loop
    
    .......
    
  • REKLAMA
  • #5 5353064
    K_o_n_r_a_d
    Poziom 23  
    Podłączać oczywiście, że możesz, ale nie zawsze jest to dobre rozwiązanie. Wewnętrznie zwarta jest tylko masa cyfrowa i analogowa i to nie we wszystkich mega8 (łatwo to sprawdzić miernikiem). AVCC i VCC w żadnym AVRe nie jest zwarta. W nocie do megi8 masz pokazane jak podłączać AVCC (dławik + kondensator). Napięcie zasilania jest za mało stabilne na napięcie odniesienia, tym bardziej, że zależy Ci na dokładności.

    W kodzie wyżej kilka wartości i szczegółów moim zdaniem inaczej powinno być. Napięcie na wejściu uK to nie zmienna B a zmienna A. Wartość przetwornika należy pomnożyć przez 0.004888 i tak samo licząc C też inaczej zaokrąglić stałą, zmniejszając błąd obliczeń:
    ...
    Wartosc = Getadc(0)
    A = Wartosc * 0.00489
    B = A - 0.2                    'Ponieważ czujnik daje 0,2V gdy P=0kPa
    Wart_nap = Fusing(A , "##.&&")
    Lcd Wart_nap
    
    C = B * 155.556             'Napięcie *kPa/V 
    ...

    Nie wiem w jakim celu wyświetlasz wartość napięcia. Domyślam się, że tylko w celach sprawdzenia działania. Jeśli tak to w przyszłości usuwając to możesz znacznie uprościć obliczenia a tym samym skrócić czas wykonywania i objętość programu a nawet obliczenia wykonac na typach całkowitych a nie zmiennoprzecinkowych, ale to już na samym końcu jeśli będzie taka potrzeba.
  • #7 5354013
    misiek_0000
    Poziom 10  
    Cytat:
    W nocie do megi8 masz pokazane jak podłączać AVCC (dławik + kondensator). Napięcie zasilania jest za mało stabilne na napięcie odniesienia, tym bardziej, że zależy Ci na dokładności.

    Wrzucilem kondensatory tylko prosze o sprawdzenie czy wartosci sa dobre...
    [atmega8][bascom] niepoprawny wynik przetwornika ADC
    Cytat:

    W kodzie wyżej kilka wartości i szczegółów moim zdaniem inaczej powinno być. Napięcie na wejściu uK to nie zmienna B a zmienna A.

    Czujnik w zaleznosci od podanego cisnienia daje od 0.2V(ala P=0) do 4,7V(dla P=700kPa). Wg mnie skoro "poziom zera" (sorki nie wiem jak to inaczej nazwac) jest na 0,2V to wlasnie taka wartosc musze odjac od wyniku i to jest dopiero napiecie ktore moze przeliczac na cisnienie...

    Cytat:

    Wartość przetwornika należy pomnożyć przez 0.004888 i tak samo licząc C też inaczej zaokrąglić stałą, zmniejszając błąd obliczeń:


    Co masz na mysli piszac inaczej zaokraglic? Wychodzi mi dokladnie 155,(5) i nie mam pomyslu jak to mozna zmienic...

    Cytat:

    Nie wiem w jakim celu wyświetlasz wartość napięcia. Domyślam się, że tylko w celach sprawdzenia działania.

    Dokladnie
    Cytat:

    Jeśli tak to w przyszłości usuwając to możesz znacznie uprościć obliczenia a tym samym skrócić czas wykonywania i objętość programu a nawet obliczenia wykonac na typach całkowitych a nie zmiennoprzecinkowych, ale to już na samym końcu jeśli będzie taka potrzeba.

    Usunac moge tylko wyswietlanie a nie obliczenia bo przeciez jak sobie nie policze napiecia to cisnienia tez nie :) Wiec nie ma ucieczki przed liczbami zmiennoprzecinkowymi :/
  • REKLAMA
  • #9 5354672
    misiek_0000
    Poziom 10  
    Oczywiscie napisal jak to przeliczac

    Sensitivity =6,4mV/kPa

    czyli jak napisalem wczesniej na 1V przypada 155,(5)kPa... jak tu przejsc na liczby calkowite?
  • REKLAMA
  • #11 5354724
    misiek_0000
    Poziom 10  
    Przydala by sie do jednego miejsca po przecinku, wtedy przy przeliczeniu na hektopascale mialbym liczbe calkowita ale przy 10 bitowym przetworniku nie uzyskam wiekszej dokladnosci niz do kilopascala... o ile uda sie taka uzyskac
  • #13 5354806
    misiek_0000
    Poziom 10  
    Niekonicznie atmosferyczne :D Zal przy takim zakresie skupiac sie tylko na tym wiec chce zeby mial szeroka skala. Niekoniecznie do 700 ale z 500kPa chcialbym zeby mial.
  • #14 5354824
    Balu
    Poziom 38  
    Hmm ja bym się na twoim miejscu skupił bardziej na... ciśnieniu atmosferycznym i wziął napięcie odniesienia 1.25V albo 2.048V... masz do 280kPa zakres... i rozdzielczość przetwornika 2mV/bit:>
  • #15 5355122
    misiek_0000
    Poziom 10  
    Balu napisał:
    Hmm ja bym się na twoim miejscu skupił bardziej na... ciśnieniu atmosferycznym i wziął napięcie odniesienia 1.25V albo 2.048V... masz do 280kPa zakres... i rozdzielczość przetwornika 2mV/bit:>


    Masz dar przekonywania.. a ja dar utrudniania sobie zycia :)
    Znalazlem czujnik MPX 4115AP :D
    Zakres 15-115kPA
    Podobnie jak poprzedni operuje na napieciu z zakresu 0,2 (15kPa) do 4,7(115kPa). Kod wyglada mi na poprawny ale wszelkie zastrzeżenia chetnie przyjme :)
    
    Do
    Cls
    
    Wartosc = Getadc(0)
    A = Wartosc * 0.0048
    B = A - 0.2
    Wart_nap = Fusing(b , "##.&&")
    Lcd Wart_nap
    
    C = Wart_nap * 1000 / 46
    D = C + 15
    Wart_c = Fusing(d , "##.&&")
    Lcd Wart_c
    
    Waitms 500
    Loop
    


    Prosze jeszcze o sprawdzenie schematu bo chce dolozyc transmisje szeregowa i nie wiem czy sie nie pogubilem na tych kondensatorach...
    Szczegolnie z jednym mam spory problem:
    C7 podpiety z jednej strony do 2 nozki (V+) Max232 a z drugiej... datasheet max podaje ze do + natomiast widzialem projekty w ktorych bylo to podpiete do GND i dzialalo (i w ksiazce Programowanie mikrokontrolerów AVR w języku BASCOM,Wiązania Marcin tez tak jest...)
    Ponizej schemat.
    [atmega8][bascom] niepoprawny wynik przetwornika ADC

    Dodano po 11 [minuty]:

    Zapomnialem zadac najwazniejszego pytania...
    Moge miec LCD na tym samym porcie gdzie sa linie TxD iRxd ktorych musze uzywac do transmisji czy bedzie to ze soba kolidowac w jakis sposob?
REKLAMA