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

Obrotomierz Atmega8, Bascom, zerowanie wyniku

FastProject 25 Sty 2010 10:34 1470 0
REKLAMA
  • #1 7587961
    FastProject
    Poziom 28  
    Witam,
    robię obrotomierz do silnika o obrotach do 6000obr/min. Pomiar wykonuje następująco:
    - po 1 przerwaniu startuje timer1
    - w obsłudze przerwania timera1 (co 100us) zwiększam zmienna X
    - po 20 takich pomiarach usrednam wyniki i poddaje kalkulacji: [obr/min]=[1/(średnia*0.0001)]*60

    Impuls:
          Disable Int1
    
          If Measure = 0 Then
             X = 0
             J = 1
             Timer1 = 65136
             Enable Timer1
             Measure = 1
          Else
             Disable Timer1
             If X > 0 Then
             Period(j) = X
    
             Average = 0
             If J = 20 Then
    
                For J = 1 To 20
                   Average = Average + Period(j)     'mierze i uśredniam 20 pomiarów czasu
                Next J
    
                Average = Average / 20
    
                Result = Average * 0.0001      '  0.0001 to wartość czasu o jaką zwiększam X (przerwanie od timer1)
                Result = 1 / Result          'obliczenie okresu
                Rpm = Result * 60          'konwersja obrotów/minute
    
    ' demonstracja na wyświetlaczu LED 4 cyfry
                Temp1 = Rpm / 1000                              'tysiące    
                W1 = Temp1
                Temp2 = Rpm Mod 1000                            'reszta z dzielenia przez 1000 czyli:
                Temp3 = Temp2 / 100                             'setki
                W2 = Temp3
                Temp3 = Temp2 Mod 100                           'reszta z dzielenia przez 100 czyli:
                Temp2 = Temp3 / 10                              'dziesiątki
                W3 = Temp2                                      '
                W4 = Temp3 Mod 10                               'reszta z dzielenia przez 10 czyli:
    
                Rpm = 0
                Measure = 0
             End If
    
             Incr J
             Else
                W1 = 0
                W2 = 0
                W3 = 0
                W4 = 0
             End If
          End If
    
          Enable Int1
    Return
    
    Count:
       Timer1 = 65136
       Incr X
    Return


    Proszę o sprawdzenie obliczeń bo na 100% pewny nie jestem.

    I teraz pytanie jak najlepiej wykonać zerowanie gdy silnik nie kręci się? Używam czujnika Halla TLE4935 i jeden magnes na silniku.

    Po kilku nieudanych próbach okazał się to dosyć proste:
    - w pętli głównej dodałem:
       Incr Timeout
       If Timeout > 200 Then
          W1 = 0
          W2 = 0
          W3 = 0
          W4 = 0
       End If
    


    - a w przerwaniu Impuls :
       Timeout=0
    


    To prosiłbym tylko o potwierdzenie poprawności moich obliczeń. Pzdr.
  • REKLAMA
REKLAMA