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

[ATMEGA8][bascom] amperomierz-niestabilny pomiar

nouki 19 Cze 2008 21:27 15765 53
  • #1 5266021
    nouki
    Poziom 25  
    Cześć.

    Wiem że było wiele razy to pisane ale mam problem jakiego nie znalazłem jeszcze w opisach a mianowicie:

    Mam podpięty miernik na mega8 i mierze spadek na oporniku 0,1 ohma
    Wedle miernika przy 5A wynosi on 560mv
    Amperomierz na mega8 wskazuje wartość nie stała lecz skacze od 10 do 30 albo cos koło tego(zależnie jaki mnożnik przyjmę)
    Napięcie jest ok i jest jak powinno być
    program wygląda tak:

    
    ...
    ..
    Dim Wart_ab1 As Word
    Dim A1 As Single
    Dim Wart_a1 As String * 3
    .
    .
    Start Adc
    .
    .
    Wart_ab1 = Getadc(0)
    Locate 1 , 1
    Lcd Wart_ab1
    A1 = Wart_ab1 * 0.0049
    Wart_a1 = Fusing(a1 , "#.&&")
    
    Locate 2 , 1
    Lcd "A2 " ; Wart_a1
    .
    .
    


    nie mam pojęcia co jest nie tak

    p.s wartość nanodze Aref wynosi 5.03 i jest stała
  • #2 5266188
    bogi
    Poziom 29  
    Spróbuj zablokować elektrolitem 24 nogę atmegi. Zakładam że dałeś kondensator blokujący na zasilaniu atmegi.

    Powodzenia
  • #3 5266209
    nouki
    Poziom 25  
    nie moge dac kondensatora bo ta noga dokonuje pomiary innego tak jak pozostałe adc
    adc0 - prad 1
    adc1- prad 2
    adc 3 i 4 napiecie
  • #5 5266334
    nouki
    Poziom 25  
    adc4 pomiar napiecia - jest ok
    adc3 pomiar napiecia - jest ok
    adc1 pomiar pradu
    adc0 pomiar pradu

    pomiar dokonywany jest na oporniku 0,1 ohma jak pisałem wzgledem masy napiecie jakie jest na spadku jest stałe i nie pulsuje. uref- jest stale nie pulsuje-5v
    pomiar tak jak jest teraz w programie skacze od ok 10 do 30 paru i tak w koło rośnie i spada ale nie jest stałe kondensator nic nie daje.

    
              $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.3 , Db6 = Portd.2 , Db7 = Portd.1 , E = Portd.6 , Rs = Portd.7
    Config Lcd = 16 * 2
    Cursor Off
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    
    
    Dim Wart_ac As Word
    Dim V As Single
    Dim Wart_nap As String * 3
    
    Dim Wart_ac1 As Word
    Dim V1 As Single
    Dim Wart_nap1 As String * 3
    
    Dim Wart_ab As Word
    Dim A As Single
    Dim Wart_a As String * 3
    
    Dim Wart_ab1 As Word
    Dim A1 As Single
    Dim Wart_a1 As String * 3
    
    
    Start Adc
    
    Do
    'Cls
    
    Wart_ac = Getadc(4)
    V = Wart_ac * 0.0197
    Wart_nap = Fusing(v , "#.&&")
    
    Locate 1 , 1
    Lcd "V1 " ; Wart_nap
    
    Wart_ac1 = Getadc(2)
    V1 = Wart_ac1 * 0.0197
    Wart_nap1 = Fusing(v1 , "#.&&")
    
    Locate 2 , 1
    Lcd "V2 " ; Wart_nap1
    
    
    Wart_ab = Getadc(1)
    A = Wart_ab* 0.0049
    Wart_a = Fusing(a , "#.&&")
    
    Locate 1 , 10
    Lcd "A1 " ; Wart_a
    
    Wart_ab1 = Getadc(0)
    A1 = Wart_ab1 * 0.0049
    Wart_a1 = Fusing(a1 , "#.&&")
    
    Locate 2 , 10
    Lcd "A2 " ; Wart_a1
    
    Waitms 100
    Loop
    End
  • #7 5266405
    nouki
    Poziom 25  
    nie bardzo da rade zwiekszyć rezystor bo prad jest do 20A wiec moc tracona bedzie trudna do wychłodzenia.
    Myślałem bardziej nad wyświetlaniem średniej z np 10 pomiarów ale nie bardzo wiem jak to zmienić bo ucze się dopiero i licze na pomocną dłoń
  • #8 5266435
    Balu
    Poziom 38  
    W czym problem?
    
    Dim counter as byte
    dim I_1_sum as single
    dim I_2_sum as single
    
    w pętli głównej:
    
    incr counter
    i_1_sum=i1_sum+biezaca_wartosc_z_adc
    i_2_sum=i2_sum+biezaca_wartosc_z_adc
    
    if counter=10 then
    counter=0
    i_1_sum=i_1_sum/10
    i_2_sum=i_2_sum/10
    wyswietl_sobie
    i1_sum=0
    i2_sum=0
    end if
    


    P.S. Radzę używać więcej niż 10 - np 16 lub 32 *ew 8* - myślę że pomimo całego syfu jaki robi bascom takie dzielenie ma jednak zoptymalizowane lepiej:)

    Dodałem znaczniki [code] https://www.elektroda.pl/rtvforum/topic1015361.html
    [zumek]
  • #9 5266454
    dawid512
    Poziom 32  
    Witam.

    Ostatnio wykonałem sobie zasilacz w którym też mierze spadek napięcia na rezystorze 0,1Ω tyle że mam jeszcze podłączony do tego wzmacniacz operacyjny. Wynik pomiaru tez strasznie mi skakał ale zrobiłem sobie wyświetlanie wyniku z 50 pomiarów. Dzięki czemu wynik nie skacze i jest stabilny. Oto kod jak to zrobić:
    
    
    Odczyt = 0
    For Krok = 1 To 100
    W = Getadc(1)
    Odczyt = Odczyt + W
    Next Krok
    Wynik = Odczyt / 50
    
    zmienna "wynik" to wartość z 50 pomiarów
    
    krok jako byte
    odczyt jako word
    wynik rownież jako word
    
    


    Pozdrawiam Dawid.
  • #10 5266463
    Balu
    Poziom 38  
    Taaa tylko czemu robisz to do 100?:)
    Poza tym wydaje mi się że mój program o tyle przyjemniej zadziała, że nie będzie mierzył w kółko jednego tylko po kolei;) A prąd odświeżał poprostu co jakiś czas:)
  • #11 5266462
    marek_Łódź
    Poziom 36  
    Najprostszy dolnoprzepustowy filtr programowy:

    dim vs as single, sr as single, kfil as single, kfil1 as single, vi as integer
    
    coef=0.0049
    kfil=...                            'stała "czasowa" filtracji
    kfil1=kfil+1
    
      vi=getadc(...)
      sr=vi*coef                    'inicjowanie sredniej
    do
      ...
      vi=getadc(...)
      vs=vi*coef
      sr=kfil*sr
      sr=sr+vs
      sr=sr/kfil1      'średnia "ciągnięta"
      locate ....
      lcd fusing(sr,"##.#");
    ...
    loop
  • #12 5266661
    nouki
    Poziom 25  
    przy Sredniej z 250 pomiarów wychodzi dopiero w miare ok bo zmienia sie "Setna" a reszta jest stała:)) ale jak co czekam na inne sugestje
  • #13 5266761
    dawid512
    Poziom 32  
    Masz rację Balu zapomniałem zmienić wartość w pętli for. U mnie wynik jest stabilny przy wykonywaniu 50 pomiarów.
  • #14 5267038
    seba_x
    Poziom 31  
    zasil procek przez dławik , pomaga mimo znanego błędu , potem średnia , u mnie średnia ze 100 pomiarów i wynik jest "sztywny"
  • #15 5267513
    dawid512
    Poziom 32  
    Cytat:
    zasil procek przez dławik
    Dokładnie podaj 5V przez dławik na AVCC. Pamiętaj także o kondensatorach 100nF jak najbliżej procka na zasilaniu i na każdym kanale A\D którego używasz.
  • #16 5267766
    Freddy
    Poziom 43  
    Spróbuj dac układ typu MAX471, co prawda już nie produkowany, ale zamiast niego są MAX4070 np. jest to tzw. Current-Sense Amplifiers. Powinno Ci pomóc.
  • #17 5267875
    nouki
    Poziom 25  
    zaobserwowane:
    jeśli dokładam do zasilacza warsztatowego to wyniki są stałe napiecie jedno i 2 takie samo jak i prąd taki sam i nie skacze.
    Jeśli podłącze to do ładowarki i próbuje dokonywać pomiarów to dzieje się tak jak opisuje i napięcie i prąd skacze.
    na 250 pomiarów i uśrednienia jest miedzy 5 pomiarami nawet +,-1.4 odskoku.
    ładowarka ma napięcie stałe bo przeglądałem na oscyloskopie( idealna plaska linia) filtracja 10000uF. Wyjście nie jest sterowane Pwm tylko przez tranzystor npn więc nie rozumie nic.
    Miernik nie pokazuje wachań jest zawsze stały wynik( prąd skacze max 0,01) wynikający z prawa Ohma
  • #18 5267912
    bogi
    Poziom 29  
    A co się dzieje na wejściach pomiarowych? Też skacze?
  • #19 5267917
    dawid512
    Poziom 32  
    Mam dla ciebie jeszcze jedną propozycję wyjętą z mojego zasilacza:

    [ATMEGA8][bascom] amperomierz-niestabilny pomiar

    Układ działa w taki sposób że przy prądzie 1A na wyjściu wzmacniacza operacyjnego pojawia się 1V. Potencjometrem dokładnie sobie możesz to wyregulować. Przy zasilaniu pojedynczym napięciem 5V maksymalny zmierzony prad to nieco ponad 3A ale myślę ze jeżeli zasilisz wzmacniacz operacyjny wiekszym napieciem to bedziesz mogl mierzyc wiekszy prad.
    U mnie w zasilaczu wynik jest stabilny przy wykonywaniu 50 pomiarow( kod podany przeze mnie wczesniej) zmienia sie czasem jedynie ostatnia cyfra.

    Pozdrawiam Dawid.
  • #20 5268362
    nouki
    Poziom 25  
    na wejściach pomiarowych jest podpięty miernik i nie skacze jest stała wartość.
    Wymienię procesor bo juz kiedyś też miałem problem z pwm i nie wiem czy to czasem nie ta sama sztuka:)

    P.s wymieniłem procesor i nic to nie zmieniło.

    Jest jedna zasada ze pierwszy pomiar czy to z 10 czy z xxx jest zawsze ok wartość jest w 100% zgodna ze wskazaniem miernika
    może by to jakoś wykorzystać ??

    Dodano po 3 [godziny] 35 [minuty]:

    Podłączyłem to do zasilacza stabilizowanego i dałem w takim samym układzie jak tu czyli przez 0,1 ohma.
    Więc jest tak biorę sobie wartość i dziele ja przez 16.7 i jest tyle ile powinno być tylko mankament jest taki że układ nie działa płynnie a skokowo czyli jest 0.20A a następny jest 0.80A Im więcej siedzę tym mniej rozumie to:))


    
    y = y / 16.7
    y = Fusing(y, "#.##")
    Locate 1 , 10
    Lcd "A2 " ; Wart_n1 
    

    Dodano po 15 [minuty]:

    Już kapuje on zaokragla jeśli mamy ponad 5 to jest juz pełna liczba.
    0.04A to 0.0A, , 0.046A to 0,1A

    napięcie jest tak i jest ok
    
    x = Wart_ac * 0.0050
    x= x * 4
    Wart_n4 = Fusing(x , "#.##")
    Locate 2 , 1
    Lcd "V2 " ; Wart_n4
    


    Dodałem znaczniki [code] https://www.elektroda.pl/rtvforum/topic1015361.html
    [zumek]
  • #22 5270414
    nouki
    Poziom 25  
    ale jest jeszcze inna zasada jak mam podpięte powiedzmy 24ohmy obciążenie to wyniki sa zgodne z miernikiem, lecz jeśli podepne powiedzmy 6 ohm to sa juz za wysokie o jakieś 0.5A (pomiar jeden tylko bez średniej) a jak dam opornik 1 ohm 2 ohmy to wynik staje sie niestabilny

    P.s jeśli by było coś nie tak w układzie jaki mam to nie dokonywał by pomiaru i skakał by ciągle więc nie sadze że to wina złego układu.
  • #24 5270452
    nouki
    Poziom 25  
    
    
    $crystal = 1000000
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.3 , Db6 = Portd.2 , Db7 = Portd.1 , E = Portd.6 , Rs = Portd.7
    Config Lcd = 20 * 4
    Cursor Off
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    
    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
    Dim Wart_ac As Integer
    Dim Wart_ac1 As Integer
    Dim Wart_ab2 As Integer
    Dim Wart_ab1 As Integer
    Dim Wart_n1 As String * 3
    Dim Wart_n2 As String * 3
    Dim Wart_n3 As String * 3
    Dim Wart_n4 As String * 3
    Dim X As Byte
    Dim I_1_sum As Single
    Dim I_2_sum As Single
    Dim U_1_sum As Single
    Dim U_2_sum As Single
    Config 1wire = Portc.5
    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32
    
    Start Adc
    X = 0
    Do
    
    
    
      1wreset                                                   'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
                                                   'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    
      T1 = T * 0.0625                                           'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    
    Napis = Fusing(t1 , "#.#")
    
      Locate 3 , 1
      Lcd "Wynik: " ; Napis ; " " ; Chr(1) ; "C"                'wyświetl wynik ze zmiennej Single
    
    
    
    
    
    
    Wart_ab1 = Getadc(0)
    Wart_ab2 = Getadc(1)
    Wart_ac1 = Getadc(2)
    Wart_ac = Getadc(4)
    
    
    I_1_sum = Wart_ab1
    I_2_sum = Wart_ab2
    U_1_sum = Wart_ac1
    U_2_sum = Wart_ac
    
                                           
    I_1_sum = I_1_sum / 167
    I_1_sum = I_1_sum * 10
    Wart_n1 = Fusing(i_1_sum , "#.##")
    Locate 1 , 10
    Lcd "A2 " ; Wart_n1
    
                                               
    I_2_sum = I_2_sum / 16.7
    Wart_n2 = Fusing(i_2_sum , "#.##")
    Locate 2 , 10
    Lcd "A2 " ; Wart_n2
    
                                              
    U_1_sum = Wart_ac1 * 0.0051
    U_1_sum = U_1_sum * 4
    Wart_n3 = Fusing(u_1_sum , "#.##")
    Locate 1 , 1
    Lcd "v1 " ; Wart_n3
    
                                               
    U_2_sum = Wart_ac * 0.0051
    U_2_sum = U_2_sum * 4
    Wart_n4 = Fusing(u_2_sum , "#.##")
    
    Locate 2 , 1
    Lcd "V2 " ; Wart_n4
    
    Loop
    End
    
    


    Schematu brak narysuje jakoś niebawem

    Zasilanie to 2 stabilizatory 12v i 5v oba maja po 1000uf i po 100n podpięte na wejsciach i wyjsciach.
    wszystkie adc maja po 2,2uf przd dzielnikiem dla napięcia i przed 10kohma na prąd.
    Noga Avcc jest przez dławik i dodatkowo przy samej nodze 100n
    ref jest przez 100n zaraz przy wyjściu
  • #25 5270513
    Freddy
    Poziom 43  
    Zobacz sobie na post pt. "Mega meter" umieściłem to kiedys z DIY zagranica, tam jest ciekawie zrobiony pomiar prądu.
  • #26 5270574
    nouki
    Poziom 25  
    zastanawiałem się na tym ale to ma pomiar tylko pojedyńczy i nie bardzo da się zobaczyć kod źródłowy bo go .....:)
  • #27 5270597
    Freddy
    Poziom 43  
    bo go ...... co ?
    Jest przecież, to ten mały około 30kB, ten drugi to do PC, ale jak chcesz to mogę Ci go podesłać na emaila
  • #29 5270617
    dawid512
    Poziom 32  
    Cytat:
    przed 10kohma na prąd.
    Masz rezystor do linii adc podlaczony?? Masz przyczyne zlych wynikow. Zastanawia mnie tez czy aby na pewno masa atmegi jest tez masa zasilacza? A jak podlaczyles rezystor pomiarowy 0.1Ω? Bo mam nadzieje ze wlaczyles go w szereg do galezi masy.
  • #30 5270628
    nouki
    Poziom 25  
    dawid512 napisał:
    Cytat:
    przed 10kohma na prąd.
    Masz rezystor do linii adc podlaczony?? Masz przyczyne zlych wynikow. Zastanawia mnie tez czy aby na pewno masa atmegi jest tez masa zasilacza? A jak podlaczyles rezystor pomiarowy 0.1Ω? Bo mam nadzieje ze wlaczyles go w szereg do galezi masy.


    Czy jest 10 k czy go nie ma to jest tak samo więc to raczej nie ma nic do ... Masa skoro jest brane z jednego trafa i mostka jako może być inna masa opornik raczej podpięty do masy bo jak by było gdzie indziej to juz bym uszkodził mege:)

    Czytaj teraz sprawdzam na zasilaczy stabilizowanym a nie w pozostałym układzie.
REKLAMA