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

[atmega128][bascom]Obrotom. z czujnikiem Halla w przerwaniu

rogeros 17 Cze 2010 20:23 2214 9
REKLAMA
  • #1 8201013
    rogeros
    Poziom 13  
    Witajcie.
    Otóż przeszukiwałem forum i jedynie znalazłem informacje jak zrobić obrotomierz zliczając impulsy poprzez wejście T0 w określonych odcinkach czasu.

    Mi zależy natomiast aby zmierzyć czas pojedynczego obrotu poprzez czujnik Halla podłączony do przerwania zewnętrznego.

    Napisałem taką aplikację ale niestety wynik skacze jak chce, nie dając mi choćby zbliżonego wyniku.

    Dodam tylko, że korzystam z atmega128 i korzystam z czujnika Halla TLE490G który daje wynik prostokątny i jest podłączony do portu PE7 (int7)

    Oto mój błędny program.
    $regfile = "m128def.dat"
    $crystal = 16000000
    Config Timer3 = Timer , Prescale = 1
    Config Lcdpin = Pin , Db4 = Portf.5 , Db5 = Portf.4 , Db6 = Portf.3 , Db7 = Portf.2 , E = Portf.6 , Rs = Portf.7
    Config Lcd = 16 * 2
    
    On Int7 Czujnik_magnetyczny
    Enable Timer3
    Enable Int7
    
    Enable Interrupts
    Start Timer3
    
    Cls
    Cursor Off
    Lcd "Startujemy..."
    
    Timer3 = 0
    
    Do
    
    Locate 2 , 1
    Lcd Timer3
    
    Waitms 1000
    Loop
    
    
    Czujnik_magnetyczny:
    Stop Timer3
    Timer3 = 0
    Start Timer3
    Return


    Z góry dziękuję za pomoc lub naprowadzenie jak mój problem rozwiązać?
  • REKLAMA
  • #2 8201059
    Logan
    Poziom 30  
    A gdzie masz Config INTx ? Jakiego rzędu czasu się spodziewasz ? Po co Ci Start Timer3 skoro Prescale = 1 automatycznie uruchamia zliczanie ?
  • #3 8201112
    rogeros
    Poziom 13  
    obroty silnika to 2000-5000 rpm.
    Jest to silniczek od dysku twardego zasilany mniejszym napięciem.
  • REKLAMA
  • Pomocny post
    #4 8201220
    landy13
    Poziom 31  
    Zakres liczenia 16-bitowego timera przy zegarze 16MHz i prescalerze=1 to nieco ponad 4ms. Jak chcesz tym zmierzyć czas, który przy 5000obr/min wynosi ok. 12ms.?
  • REKLAMA
  • Pomocny post
    #5 8201373
    Logan
    Poziom 30  
    Prescaler musi być co najmniej 8.
  • #6 8201445
    sulfur
    Poziom 24  
    Sterujesz obrotami przez PWM, czy prawdziwe "średnie napięcie" ? Rozumiem, że ten czujnik halla jest zewnętrzny. Pokaż jak możesz kawałek schematu.
  • #7 8201468
    landy13
    Poziom 31  
    Logan napisał:
    Prescaler musi być co najmniej 8.
    Dla 2000obr/min to tak na styk. Aby mierzyć wolniejsze obroty np. przy rozruchu lub hamowaniu proponowałbym 64 albo nawet 256.

    sulfur napisał:
    Sterujesz obrotami przez PWM, czy prawdziwe "średnie napięcie" ?
    A co to ma do rzeczy?
  • #8 8201698
    Logan
    Poziom 30  
    Nie prościej impulsy zliczać za pomocą INTx, w czasie 1s odmierzanej Timerem ?

    Pomerdało mi się, że Autor chce mierzyć RPM.
  • REKLAMA
  • #9 8201718
    sulfur
    Poziom 24  
    Jak rozumiem, zadanie jest według Autora tematu odmierzenie czasu jednego obrotu. Jeśli zatem Autor nie wykazuje błędów w logicznym myśleniu, to Twoja propozycja rozwiązania problemu jest błędna.
  • #10 8201767
    rogeros
    Poziom 13  
    Koledzy dziękuję wam bardzo za rozwiązanie problemu.

    a więc przestawienie prescalera na 8 odniosło pożądany skutek.
    Miałem jeszcze jeden błąd w programie.
    otóż w przerwaniu oczywiście zerowałem timer3=0
    ale już w głównej pętli wyświetlałem lcd timer3
    przez co wyniki skakały.

    w przerwaniu dałem aby timer3 zapisywał do zmiennej
    a w głównej pętli tą zmienną wyświetlał i zaczęło pokazywać poprawne wyniki.

    dziękuję bardzo wszystkim za pomoc.
REKLAMA