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.

Program do zapisu z obrotomierza

Sauron 18 05 Cze 2014 20:35 855 6
  • #1 05 Cze 2014 20:35
    Sauron 18
    Poziom 6  

    Witam, jestem jeszcze kompletnie zielonym człowiekiem jeśli chodzi o programowanie więc nie pytajcie się mnie o jakieś szczegóły bo i tak zapewne nie będę wiedział o czym mowa :). Mianowicie chcę stworzyć programik który będzie zapisywał mi na kartę SD dane o obrotach silnika. Aby łatwiej mi było potem to kontrolować (mniej danych) wynik zapisany ma być uśrednioną wartością z ostatnich 5 sekund.
    Zacząłem pisać jakieś zaczątki programu:

    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include <math.h>
    unsigned char t=0;
    int o=0;
    float w=0;

    int main(void)
    {
    // PC0 będzie wejściem z podciągnięciem do VCC */
    DDRC = 0x00;
    PORTC = 0x01;
    while(1)
    {
    while(t=5)
    {w=o/t;
    //zerowanie o i t jeszcze dodać
    //zapis wyniku na kartę sd
    }
    while(1) // liczenie czasu
    {
    _delay_ms(1000);
    t=t++;
    }
    if(!(PINC & 0x01)) // zliczanie impulsów
    {
    o=o++;
    }

    }
    }
    mam odnośnie tego co już mam kilka pytań:
    1. czy jeśli w pętli pierwszej wyzeruję czas (t) i obroty (o) to liczenie zacznie się od nowa?
    2. Czy jeden impuls może mi spowodować że "O" podskoczy mi o więcej niż jeden?

    Dodano po 6 [minuty]:

    Jeszcze mi się przypomniało. Przy kompilacji mam info że operacje na "o" i "t" mogą być niezdefiniowane... co mi to daje?

    0 6
  • #2 05 Cze 2014 21:20
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Sformatuj kod jako kod, a potem zrób przyzwoite wcięcia.

    2. Z pętli while(t=5) nigdy nie wyjdziesz, bo warunek jest zawsze spełniony - piątka nie jest zerem.

    3. Gdybyś wyszedł, to zawiśniesz w następnej pętli, tej z komentarzem"liczenie czasu".

    4. Bez sprzętowego timera i przerwań tego nie zrobisz. Najlepiej użyć dwóch - jednego do odmierzania odcinków czasu, drugiego do zliczania impulsów.

    0
  • Pomocny post
    #3 05 Cze 2014 21:21
    Marek_Skalski
    Moderator Projektowanie

    Sauron 18 napisał:
    nie pytajcie się mnie o jakieś szczegóły

    0. Załatwione :) Ja nie będę pytał.
    1. Nie liczenie wcale nie nastąpi.
    2. Nie, O będzie miało stale wartość 0.
    3. Daje to tyle, że wynik będzie z sufitu.
    A teraz kilka słów wyjaśnienia:
    Ad.1. W funkcji main, masz pętlę opartą o while(1). Ta pętla zostanie przerwana tylko brakiem zasilania. Program nigdy nie przejdzie do następnej pętli while(1). Tym bardziej, że będzie stale siedział w zagnieżdżonej pętli while(t=5), ponieważ zamiast użyć operatora porównania (==), to użyłeś przypisania (=). Ponieważ zmiennej t można przypisać wartość 5, więc warunek zostanie spełniony i program będzie wisiał w tym miejscu.
    Ad.2. O nie podskoczy nawet o 1, ponieważ ten fragment kodu nie zostanie nigdy wykonany. Do pomiaru lub odmierzania czasu lub ilości impulsów używa się liczników. Szczególnie gdy częstotliwość impulsów może być na poziomie 100Hz.
    Ad.3. Zadeklarowałeś w jako float, ale argumenty w operacji dzielenia są typu unsigned char oraz int. Czyli dzielisz liczbę ze znakiem 16-bitową (chyba) przez liczbę bez znaku 8-bit i przypisujesz to do float'a, ale bez rzutowania. To nie będzie działać.

    Przeszukaj Forum na okoliczność obrotomierzy, które występowały już wielokrotnie. Poczytaj i potrenuj w kwestii wykorzystania przerwań i liczników, a później zapoznaj się trochę ze sposobem komunikacji i zapisywania danych na karcie pamięci. I zapomnij o funkcjach delay_cos_tam...

    0
  • #4 05 Cze 2014 22:16
    el2010tmp
    Poziom 25  

    Sauron 18 napisał:
    unsigned char t=0;
    int o=0;
    float w=0;

    Pisząc program nie warto "oszczędzać" palców. Po pewnym czasie sam nie będziesz wiedział "co autor miał na myśli".
    To chyba nie jest zbyt duży wysiłek napisać np.:
    int obroty_silnika=0;

    0
  • #5 05 Cze 2014 22:28
    Sauron 18
    Poziom 6  

    z tym oszczędzaniem palców to i racja.
    A co do realizacji sprzętowej. Do tego samego projektu (turbina modelarska) kupiłem zestaw http://sklep.avt.pl/miernik-czestotliwosci-fmeter-zestaw-do-samodzielnego-montazu.html
    Niby nie do takiego zastosowania stworzone ale autor stwierdził że się nada i rzeczywiście jest ok (prędkość obrotowa do 70 tyś obr/min co daje 140 tyś impulsów/min : 2400Hz) Układ oparty na uC PIC16F628A. Myślałem więc że i ten projekcik można zrobić na uC

    0
  • #6 05 Cze 2014 23:01
    el2010tmp
    Poziom 25  

    Sauron 18 napisał:
    Myślałem więc że i ten projekcik można zrobić na uC

    Dobrze myślisz.
    Skorzystaj jednak ze sprzętowych timerów i przerwań. Każdy uC ma ich na pokładzie więcej niż potrzebujesz. Można więc dorzucić jeszcze sporo użytecznych funkcji np. wyświetlacz. Nie będziesz musiał posługiwać się wówczas takimi zestawami.

    0
  • #7 05 Cze 2014 23:07
    Sauron 18
    Poziom 6  

    to chyba jednak czeka mnie kilka miesięcy studiowania książek zanim to ogarnę...

    0