Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATMEGA8][bascom] amperomierz-niestabilny pomiar

nouki 19 Cze 2008 21:27 14712 53
  • #1 19 Cze 2008 21:27
    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:

    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

    0 29
  • #2 19 Cze 2008 22:05
    bogi
    Poziom 28  

    Spróbuj zablokować elektrolitem 24 nogę atmegi. Zakładam że dałeś kondensator blokujący na zasilaniu atmegi.

    Powodzenia

    0
  • #3 19 Cze 2008 22:09
    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

    0
  • #4 19 Cze 2008 22:21
    Balu
    Poziom 38  

    Co?
    A co to ma do rzeczy?:>

    0
  • #5 19 Cze 2008 22:39
    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.

    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

    0
  • #6 19 Cze 2008 22:42
    Balu
    Poziom 38  

    Może warto by zwiększyć rezystor / wstawić OPa?

    0
  • #7 19 Cze 2008 22:54
    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ń

    0
  • #8 19 Cze 2008 22:59
    Balu
    Poziom 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]

    0
  • #9 19 Cze 2008 23:04
    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ć:

    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.

    0
  • #10 19 Cze 2008 23:06
    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:)

    0
  • #11 19 Cze 2008 23:06
    marek_Łódź
    Poziom 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

    0
  • #12 19 Cze 2008 23:52
    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

    0
  • #13 20 Cze 2008 00:32
    dawid512
    Poziom 32  

    Masz rację Balu zapomniałem zmienić wartość w pętli for. U mnie wynik jest stabilny przy wykonywaniu 50 pomiarów.

    0
  • #14 20 Cze 2008 08:13
    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"

    0
  • #15 20 Cze 2008 11:38
    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.

    0
  • #17 20 Cze 2008 13:32
    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

    0
  • #18 20 Cze 2008 13:39
    bogi
    Poziom 28  

    A co się dzieje na wejściach pomiarowych? Też skacze?

    0
  • #19 20 Cze 2008 13:41
    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.

    0
  • #20 20 Cze 2008 20:09
    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:))


    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]

    0
  • #21 20 Cze 2008 21:21
    Balu
    Poziom 38  

    Jeśli coś Ci gdzieś skacze to ja bym jednak spróbował jeszcze raz odfiltrować, te 10mF masz zbocznikowane jakimiś nano/piko prawda?

    0
  • #22 21 Cze 2008 09:49
    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.

    0
  • #23 21 Cze 2008 09:56
    Balu
    Poziom 38  

    Myślę, że wszyscy mają dość zgadywania, pokaż PEŁNE schematy, PEŁNY kod źródłowy.

    0
  • #24 21 Cze 2008 10:01
    nouki
    Poziom 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

    0
  • #26 21 Cze 2008 10:37
    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 .....:)

    0
  • #29 21 Cze 2008 10:47
    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.

    0
  • #30 21 Cze 2008 10:50
    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.

    0