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

AVR i pomiar predkości km/h / zliczanie impulsów

rafiks 13 Paź 2009 22:54 2185 5
REKLAMA
  • #1 7125712
    rafiks
    Poziom 18  
    Witam, mam pewien problem otóż wykorzystuje AVR 8515 do zbudowania tempomatu

    Licznik 16 bitowy wykorzystuje do obslugi serwomechanizmu (takiego z modeli RC) sterowanego PWM (okres 20ms musi byc).

    Teraz niemam pomysłu jak zrobić aby zliczać imulsy z zęwnątrz z prędkościomierza auta (częstotliwość przy ok 50 km/h wynosi 500 Hz czyli max by wystarczylo do 1,5 Khz)

    Czy na liczniku 8 bit da sie to jakoś zrobic?

    oczekiwania dokładności pomiaru: Jadąc np 50km/h chce otrzymać w rejestrze np liczbę 50 dec jadać 120km/h otrzymam 120 dec. Bład może wynośić ok 1km/h.

    Całość piszę w assemblerze AVR Studio 4
  • REKLAMA
  • #2 7126052
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7130215
    rafiks
    Poziom 18  
    Witam, Mam problem otóż nie mam napisałem program który mierzy długość impulsu ale to co pokazuje to jakieś magiczne liczby.

    	
    #include "avr.inc"
    #include <m8515def.inc>
    
    .cseg 
    .org 0x00 
    Rjmp Reset
    .org 0x01
    RJmp INTER
    .org 0x07
    Rjmp Licz 
    
    .cseg
    .org 0x11
    ; D E F I N I C J E     P O R T Ó W
    
    .def	Acc			=	R19
    .def	S			=	R20
    .def	M			=	R21
    
    
    LIcz:
    	Ldi Acc, 0x00
    	Out TCNT0,Acc
    	Inc M
    	Reti
    
    inter: 
    
    Ldi Acc, 0x00;
    Out TCCR0, Acc
    
    
    Sbrc S,0x01 ;Jezeli rejestr S = 0xFF to oznacza ze timer jest wlaczony
    Rjmp Koniec
    
    	
    ;Konfiguruj Timer0 na Czasomierz , Preskaler 1024
    Ldi Acc, 0x00
    Out TCNT0, Acc
    	
    Ldi Acc, 0x05;
    Out TCCR0, Acc
    
    Ldi Acc, 0x02
    Out TIMSK,Acc
    
    Ldi Acc,0x03 ;Przestawienie na zbocze narastające
    Out MCUCR, Acc
    	
    Ldi S,0xFF
    
    Reti
    
    
    Koniec:
    
    Ldi Acc, 0x00;
    Out TCCR0, Acc
    
    Ldi Acc,0x02 ;Przestawienie na zbocze narastające
    Out MCUCR, Acc
    		
    MOv Acc,G
    RCall LCD_Deci ; Wyswietla liczbe z G na LCD
    
    Ldi S,0x00
    Ldi M,0x00
    
    Reti
    
    
    
    Reset:
    ;Ustawia wskaźnik stosu
    Ldi    Acc,low(RAMEND)    
    Out    SPL,Acc          
    Ldi    Acc,high(RAMEND)    
    Out    SPH, Acc
    		
    ;Ustaw Porty 
    Ldi Acc,0x00   	;Port A jaka wejscie klawiszy
    Out DDRD, Acc
    Ldi Acc, 0xFF
    Out PORTD, Acc
    Out PIND, Acc
    
    
    Ldi S,0x00
    Ldi M,0x00
    
    
    Ldi Acc,0x02
    Out MCUCR, Acc
    Ldi Acc, 0x40
    Out Gicr, Acc
    
    				
    
    		
    Start:
     	
    Sei 
    
    end: Jmp end 



    Czy całość jest dobrze czy może mam jakiś błąd?

    Jak otrzymać w rejestrze M rzeczywista prędkość w km/h Przy INT0 = 500 hz jest 50km/h , 1000 Hz jest 100km/h

    Dodałem [code]
    [zumek]
  • REKLAMA
  • #4 7130944
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 7133975
    rafiks
    Poziom 18  
    Tak masz racje ale problem leżał w tym że procesor różnie odczytywał długość impulsu mimo tego ze sie nie zmieniał. Zakłócenia pewnie jakieś łapał.

    Ale mój problem już sie rozwiązał napisze pokrótce jak go rozwiązałem:


    - Timer 8 bitowy mierzy odcinki czasu 10ms
    - W procedurze przerwania Timera jest dodatkowy licznik który odmierza 100 uruchomień przerwania Timera i gdy to nastąpi wyświetla na LCD zmienną LICZNIK
    poczym kasuje zmienna LICZNIK na 0
    - procesor czeka na sygnał INT (czeka na nadejście impulsu)
    - Po wejściu w przerwanie INT czekamy tak długo aż impuls sie zakończy i zwiększamy o jeden zmienną LICZNIK


    W ten sposób otrzymujemy nic innego jak miernik częstotliwości z dokładnością 1 Hz i pomiar następuje co 1s. Zmienna Licznik trzeba rozbudować, bo 8 bitów to liczy do 255 Hz max w moim przypadku jest to 25,5 KM/h
  • #6 7134035
    Konto nie istnieje
    Poziom 1  
REKLAMA