Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATMEGA8][bascom] amperomierz-niestabilny pomiar

nouki 19 Jun 2008 21:27 15432 53
Tespol
  • #1
    nouki
    Level 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:

    Code:

    ...
    ..
    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
  • Tespol
  • #2
    bogi
    Level 29  
    Spróbuj zablokować elektrolitem 24 nogę atmegi. Zakładam że dałeś kondensator blokujący na zasilaniu atmegi.

    Powodzenia
  • Tespol
  • #5
    nouki
    Level 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.

    Code:

              $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
    nouki
    Level 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
    Balu
    Level 38  
    W czym problem?
    Code:

    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
    dawid512
    Level 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ć:
    Code:


    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
    Balu
    Level 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
    marek_Łódź
    Level 36  
    Najprostszy dolnoprzepustowy filtr programowy:

    Code:
    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
  • #13
    dawid512
    Level 32  
    Masz rację Balu zapomniałem zmienić wartość w pętli for. U mnie wynik jest stabilny przy wykonywaniu 50 pomiarów.
  • #14
    seba_x
    Level 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
    dawid512
    Level 32  
    Quote:
    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
    Freddy
    Level 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
    nouki
    Level 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
    bogi
    Level 29  
    A co się dzieje na wejściach pomiarowych? Też skacze?
  • #19
    dawid512
    Level 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
    nouki
    Level 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:))


    Code:

    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
    Code:

    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
    nouki
    Level 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
    nouki
    Level 25  
    Code:


    $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
    Freddy
    Level 43  
    Zobacz sobie na post pt. "Mega meter" umieściłem to kiedys z DIY zagranica, tam jest ciekawie zrobiony pomiar prądu.
  • #27
    Freddy
    Level 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
  • #28
    nouki
    Level 25  
    maiło być tak ale link sie nie wkleił


    zastanawiałem się na tym http://elfly.pl/multimetr/multimetr.htm ale to ma pomiar tylko pojedyńczy i nie bardzo da się zobaczyć kod źródłowy bo go .....:)
  • #29
    dawid512
    Level 32  
    Quote:
    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
    nouki
    Level 25  
    dawid512 wrote:
    Quote:
    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.