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.

atmega32 - przepływomierz bascom czy poprawny kod

michal19835524 25 Wrz 2014 17:35 1605 14
  • #1 25 Wrz 2014 17:35
    michal19835524
    Poziom 11  

    Witam . Chciałem zrobic tester pomp opryskiwaczy . Chodzi o mierzenie wydajności pompy w litrach na minute a moje pytanie czy nie bedzie gubił impulsów podczas wykonywania przerwania . Pomiar co 1 sekundę a wydajność pomp od 40l do 260l / min

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 14
  • #2 25 Wrz 2014 18:38
    yokoon
    Poziom 28  

    Witam.
    Napisałeś, iż pomiar odbywa się co sekundę.
    Z programu wynika, że co dwie skundy.
    Load Timer0 = 250 zły zapis
    Load Timer0,125 125 * 8 = 1000ms

    0
  • #3 25 Wrz 2014 19:45
    michal19835524
    Poziom 11  

    masz raację
    obliczyłem to tak :
    16000000/256/250 = 250 ilosc przepełnień to 2000 ms

    Dodano po 49 [minuty]:

    A jak według was wygląda poprawność przerwania czy nie będzie gubił impulsów zwłaszcza ze jest ich 686 na 1 litr . Standardowo będzie sprawdzany przepływ od 40l do 160 i sporadycznie do 260l. a tak z ciekawostek to ciśnienie około 20bar

    0
  • #4 25 Wrz 2014 21:34
    yokoon
    Poziom 28  

    16000000/256/250 = 250 to jest 4ms

    Nie wiem skąd u Ciebie się wzięło 8ms.
    Przy takim zapisie jw. to Load Timer0,250 jest prawidłowe.

    0
  • #5 26 Wrz 2014 03:57
    emarcus
    Poziom 35  

    michal19835524 napisał:
    Witam . Chciałem zrobic tester pomp opryskiwaczy . Chodzi o mierzenie wydajności pompy w litrach na minute a moje pytanie czy nie bedzie gubił impulsów podczas wykonywania przerwania . Pomiar co 1 sekundę a wydajność pomp od 40l do 260l / min



    Nie musisz obawiac się o gubienie impulsów z powodu wykonywania przerwań.
    Impulsy są zliczane przez Counter1, który pracuje niezależnie od zajętości propcessora.
    Niemniej jednak w tym programie masz kilka zasadniczych błędów, wpływających na poprawnośc wyników, lub funkcjonalności programu w ogóle.

    Konfigurację i 'preload' Timera0 wyjaśnił kol. YOKOON...
    Z tego wyjaśnienia potrzebujesz zapamiętac: jeżeli chcesz aby dowolny timer (8- lub 16- bit) odliczył pewną liczbę impulsów np 250 stosujesz wygodniejszą procedurę 'LOAD Timer0 , 250' co jest oczywiście równoznaczne z alternatywnym bezpośrednim wpisem do rejestru Timera0 wartości 6
    Timer0 = 6 ; (256-250=6), Ten ostatni rachunek Bascom wykonyje za ciebie. Dla timera1, Bascom 'obrachuje' inaczej, gdy tymczasem twój wpis zachowa tą samą formę.

    Ponieważ pomiar wydajności jest procesem ciągłym, więc nie powinieneś stosowac instrukcji 'STOP Timer' a raczej zerowac jego zawartośc w odpowiednich momentach.
    Również odczyt i rachunek całkowitej ilości impulsów/sec nie jest poprawny.
    Rozważ taką poparwkę do programu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    e marcus

    0
  • #6 26 Wrz 2014 21:13
    michal19835524
    Poziom 11  

    Wiedze na temat przerwań czerpałem z poradnika :


    http://std2.phys.uni.lodz.pl/mikroprocesory/wyklad/3Systemy_wbudowane_Timer.pdf


    kolega raz pisze ze load timer0 250 jest nie poprawny a potem pisze że poprawny wiec od czego jest zależne jaki czas jest po jednym przepełnieniu czy to ma 8ms lub 4ms
    jaki jest poprawny wzór na obliczenie jle ma być przepełnień
    z tego co zrozumiałem to
    16MHz = 62,5ns * 256*250 = 4ms * 250 = 1000ms
    8 MHz = 125ns * 256*250 = 8ms * 125 = 1000ms
    fakt zapomniałem o wpisaniu wartości początkowej do Timer0
    zastanawiałem sie czy trzeba zatrzymywać licznik a tu wystarczy zerować timer
    Co do ciągłego pomiaru to odeszłem pompa wytwarza pulsacje ciśnienia więć mogą być ciągłe zmiany na wyswietlaczu a chce nieć czysty wynik więc tak to rozpisałem i tak może zakłamywać chyba że dopisze jakieś wyswietlanie śred. z 60 pomiarów

    0
  • #7 27 Wrz 2014 00:18
    emarcus
    Poziom 35  

    michal19835524 napisał:
    Wiedze na temat przerwań czerpałem z poradnika :

    http://std2.phys.uni.lodz.pl/mikroprocesory/wyklad/3Systemy_wbudowane_Timer.pdf



    Jest to dośc autorytatywne źródło, więc skąd masz te wątpliwości???
    Cytat:

    kolega raz pisze ze load timer0 250 jest nie poprawny a potem pisze że poprawny wiec od czego jest zależne jaki czas jest po jednym przepełnieniu czy to ma 8ms lub 4ms

    Nie wiem do czyjej wypowiedzi referujesz swoje pytanie, ale spróbuję na nie odpowiedziec.
    Po pierwsze, nie powinieneś dokładnie kopiowac fragmentów programu z przytoczonego na wstępie źródłowego wykładu, bo możesz pracowac z innym rezonatorem.
    Czas odmierzony przez Timer0 (przy tej samej ilości impulsów, powiedzmy te 250) będzie inny przy taktowaniu 8 MHz (8 msec) a także inny przy taktowaniu 16 MHz ( 4 msec) do osiągnięcia przepełnienia i wygenerowania interruptu. Takich przepełnień (interruptów) potrzebujesz wygenerowac ilośc zależną od osiągnięcia wyznaczonego czasu.
    Rachunek tu jest prosty!!!!

    Dla ułatwienia zadania i równego rachunku nalezy dobrac parametry tak aby były podzielne 'bez reszty'. Zatem na 1 sec. potrzebujesz 250 przepełnień wykonywanych co 4 msec, (albo 125 przepełnień co 8 msec) itd.
    Kiedy i przy jakich parametrach możesz osiągnąc te kombinacje?

    Taktujesz swój układ kwarcem 16 MHz; prescaler = 256
    Z prescalera masz sygnał (click/tyknięcie) co 16 microsec;
    Aby odliczy 4 msec potrzebujesz 'posłac' 250 tyknięc do timera0, zatem poprawny wpis będzie:
    Load Timer0, 250
    Ponieważ Timer0 w trybie 'Normal' liczy te 'tyknięcia' tylko w górę aż do jego przepełnienia czyli do 256 więc trzeba mu zadac aby liczył nie od 0 ale od 6 , a więc równie poprawny wpis byłby:
    Timer0 = 6 zauważ różnicę w syntaxie tych wyrażeń.
    Inny przykład:
    Kwarc też 16 MHz, prescaler 1024
    125 tyknięc =8 msec * 125 przepełnień = 1 sec.
    i.t.d.
    Cytat:

    Co do ciągłego pomiaru to odeszłem pompa wytwarza pulsacje ciśnienia więć mogą być ciągłe zmiany na wyswietlaczu a chce nieć czysty wynik więc tak to rozpisałem i tak może zakłamywać chyba że dopisze jakieś wyswietlanie śred. z 60 pomiarów.


    Skoro masz wahania w wydajności pompy to wydłużenie czasu pomiaru do 60 sec. zamiast powiedzmy uśrednianie 60 1-sekundowych, będzie dostatecznym uśrednieniem pomiaru wydajności.
    To zależy jeszcze z jaką dokładnością i do jakich celów chcesz ten pomiar wykorzystac.

    e marcus

    0
  • #8 27 Wrz 2014 07:30
    yokoon
    Poziom 28  

    michal19835524 napisał:
    Wiedze na temat przerwań czerpałem z poradnika :


    http://std2.phys.uni.lodz.pl/mikroprocesory/wyklad/3Systemy_wbudowane_Timer.pdf


    kolega raz pisze ze load timer0 250 jest nie poprawny a potem pisze że poprawny wiec od czego jest zależne jaki czas jest po jednym przepełnieniu czy to ma 8ms lub 4ms
    jaki jest poprawny wzór na obliczenie jle ma być przepełnień
    z tego co zrozumiałem to
    16MHz = 62,5ns * 256*250 = 4ms * 250 = 1000ms
    8 MHz = 125ns * 256*250 = 8ms * 125 = 1000ms
    fakt zapomniałem o wpisaniu wartości początkowej do Timer0
    zastanawiałem sie czy trzeba zatrzymywać licznik a tu wystarczy zerować timer
    Co do ciągłego pomiaru to odeszłem pompa wytwarza pulsacje ciśnienia więć mogą być ciągłe zmiany na wyswietlaczu a chce nieć czysty wynik więc tak to rozpisałem i tak może zakłamywać chyba że dopisze jakieś wyswietlanie śred. z 60 pomiarów


    Witam.
    Kolego, post nr1 - podałeś przerwanie co 8ms więc zliczenie 250 tych odcinków to nie jest 1sek tylko dwie.
    Po przeliczeniu wyszło że : 16 000 000 / 256 /250 = 250Hz a to = 4ms

    Stąd moje wypowiedzi.

    0
  • #9 27 Wrz 2014 16:37
    michal19835524
    Poziom 11  

    Pewnie całe zamieszanie wyszło z złego okreslenia zmiennej jako Licz_8ms . Nie chce nikogo tu obrazić tylko staram sie zrozumieć jak to wszystko działa . Jestem początkujący jak widać więc zadaje wiele pytań . Bardzo sobie cenie opinie i uwagi do moich kodów . Staram sie unikać metody kopiuj - wklej staram sie od postaw to napisać tak aby to zrozumieć i nie uczyć sie jakiś dziwnych nawyków tak jak tu sie pojawił z okresleniem nazwy zmiennej

    0
  • #10 04 Paź 2014 22:01
    michal19835524
    Poziom 11  

    yokoon napisał:
    michal19835524 napisał:
    Wiedze na temat przerwań czerpałem z poradnika :


    http://std2.phys.uni.lodz.pl/mikroprocesory/wyklad/3Systemy_wbudowane_Timer.pdf


    kolega raz pisze ze load timer0 250 jest nie poprawny a potem pisze że poprawny wiec od czego jest zależne jaki czas jest po jednym przepełnieniu czy to ma 8ms lub 4ms
    jaki jest poprawny wzór na obliczenie jle ma być przepełnień
    z tego co zrozumiałem to
    16MHz = 62,5ns * 256*250 = 4ms * 250 = 1000ms
    8 MHz = 125ns * 256*250 = 8ms * 125 = 1000ms
    fakt zapomniałem o wpisaniu wartości początkowej do Timer0
    zastanawiałem sie czy trzeba zatrzymywać licznik a tu wystarczy zerować timer
    Co do ciągłego pomiaru to odeszłem pompa wytwarza pulsacje ciśnienia więć mogą być ciągłe zmiany na wyswietlaczu a chce nieć czysty wynik więc tak to rozpisałem i tak może zakłamywać chyba że dopisze jakieś wyswietlanie śred. z 60 pomiarów


    Witam.
    Kolego, post nr1 - podałeś przerwanie co 8ms więc zliczenie 250 tych odcinków to nie jest 1sek tylko dwie.
    Po przeliczeniu wyszło że : 16 000 000 / 256 /250 = 250Hz a to = 4ms

    Stąd moje wypowiedzi.

    DZIĘKUJE ZA WYJAŚNIENIE

    0
  • #11 15 Paź 2014 20:08
    michal19835524
    Poziom 11  

    Czy to poprawny zapis do uśredienia wyniku z 60 pomiarów


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    temat dotyczy kodu co wyżej podawałem pytam z czystej ciekawości czy to poprawna forma

    0
  • Pomocny post
    #12 16 Paź 2014 16:55
    emarcus
    Poziom 35  

    michal19835524 napisał:
    Czy to poprawny zapis do uśredienia wyniku z 60 pomiarów


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    temat dotyczy kodu co wyżej podawałem (*) pytam z czystej ciekawości czy to poprawna forma

    To nie jest 'uśrednienie',- to jest zbyteczne rozszerzenie rachunku wydajności, które jest równoznaczne z pomiarem impulsów w czasie 60 sec.
    Inaczej, zamiast odczytywać zawartość Countera1 po zliczeniu 250 4-milisekundowych interwałów mierzonych Timerem0; wartość ta przyjęłaby 15000 (250*60).
    Ta metoda zmusi cię do dokonania 60 rachunków wydajności co 1 sekundę. Dlaczego więc nie zrobisz tego co 1 minutę. Wyjdzie ci dokładnie to samo.(!)

    Poza tym kode, do którego robisz odwołanie (*), jest błędny...
    Przep reprezentuje u ciebie ilość impulsów zliczona przez Timer/Counter1, co jest poprawne, ale w przypadku przepełnienia Timera1, incrementujesz tą zmienną tak jakby ona reprezentowała także ilość przepełnień (patrz subrytyna 'Zlicz:').
    Idąc dalej, w rachunku sumowania impulsów w rozpatrywanej jednostce czasu, dodajesz bezpośrednio tą ilość do odczytu aktualnego stanu Timera1 co nie jest poprawne.
    Dopóki nie nastąpi przepełnienie timera1, wartość tej zmiennej jest zerowa i ta niepoprawność nie wpłnie na wynik, co nie znaczy że tak należy pozostawić.

    e marcus

    0
  • #13 17 Paź 2014 21:34
    michal19835524
    Poziom 11  

    Ok rozumiem . Cały temat staram sie zrozumiec poprawnie i zmierza do zbudowania komputera do opryskiwacza na podbudowie "BRAWO180 lub 300S" wiec zależało mi na poprawnym zliczaniu przepływomierza i pozostało mi obliczyć prędkość . Muszę obiczyć predkość z dokladnościa do 0,1 km/h do maksymalnej predkości około 35km ,niewiem czy liczyć impulsy czy mierzyć czas pomiedzy impulsami jaki sposób bedzie bardziej dokladny . Zwór na obliczenie dawki na 1hektar to


    ilośc zamierzana 250l/h * predkość np 5.1km/h * rozstaw miedzy dyszami 50cm całość dzielimy na współczynnik stały 60 000 i mamy wynik wydadku dyszy na 1 min czyli 1,06 litra /min

    dlatego szukałem przeliczenia przepływu w krótkim czasie i uśrednienia tego wyniku np po 1 min
    cały wydatek na hektar w tak krótkim czasie będzie prognozowany bo bedzie się zmieniac pedkość ale przebne jest do ustawienia automatycznie cisnienia w ukladzie aby ustawic wydatek dysz czyli ilość wody przez przepł.

    0
  • #14 21 Paź 2014 07:28
    emarcus
    Poziom 35  

    michal19835524 napisał:
    Ok rozumiem . Cały temat staram sie zrozumiec poprawnie i zmierza do zbudowania komputera do opryskiwacza na podbudowie "BRAWO180 lub 300S" wiec zależało mi na poprawnym zliczaniu przepływomierza i pozostało mi obliczyć prędkość . Muszę obiczyć predkość z dokladnościa do 0,1 km/h do maksymalnej predkości około 35km ,niewiem czy liczyć impulsy czy mierzyć czas pomiedzy impulsami jaki sposób bedzie bardziej dokladny . Zwór na obliczenie dawki na 1hektar to


    ilośc zamierzana 250l/h * predkość np 5.1km/h * rozstaw miedzy dyszami 50cm całość dzielimy na współczynnik stały 60 000 i mamy wynik wydadku dyszy na 1 min czyli 1,06 litra /min

    dlatego szukałem przeliczenia przepływu w krótkim czasie i uśrednienia tego wyniku np po 1 min
    cały wydatek na hektar w tak krótkim czasie będzie prognozowany bo bedzie się zmieniac pedkość ale przebne jest do ustawienia automatycznie cisnienia w ukladzie aby ustawic wydatek dysz czyli ilość wody przez przepł.


    Tak też myślałem....
    Wydatek dysz jest zależny od ciśnienia cieczy w układzie, które będziesz regulował w zależności od prędkości pojazdu. Zależnośc tą: ciśnienie w funkcji prędkości wyznaczysz dla istniejącego systemu i ta funkcja pozostanie stała. W czasie normalnej pracy przepływomierz nie jest już konieczny, ale może byc jednak wykorzystany jak 'auditor' w celu sprawdzenia poprawności funkcjonowania systemu i wprowadzeniu doraźnej korekty albo wykorzystanie wyniku do innych funkcji.
    Dla oszacowania prędkości pojazdu, dokładniejsza i szybsza metoda to pomiar czasu pomiędzy impulsami

    e marcus

    0
  • #15 23 Paź 2014 20:10
    michal19835524
    Poziom 11  

    Akurat przepływomierz jest konieczny i ważny ponieważ dysze się zużywają i wydatek przy tym samym ciśnieniu jest inny po długim użytkowaniu . Wszelkie wydatki poszczególnych dysz reguluje norma ISO ale to są wartości początkowe

    0