• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Licznik obrotów czujnik halla
#11
Ja mam arduino uno i nie bardzo wiem czym jest uc to podam symbol jaki mam na mikrokontrolerze ATMEL MEGA328P  AU1519
 
Odpowiedź
#12
(14-06-2024, 10:38)poziomka97 napisał(a): Ja mam arduino uno i nie bardzo wiem czym jest uc to podam symbol jaki mam na mikrokontrolerze ATMEL MEGA328P  AU1519

Jak chcesz dokładny pomiar obrotów to to niestety musi trwać. Zasada jest prosta - im dłuższy pomiar częstotliwości tym dokładniejszy. Wspomniana płytka na szczęście posiada generator kwarcowy.
Ale musisz rozważyć jaka konkretnie dokładność (jaka najmniejsza widoczna zmiana) jest ci potrzebna i jaki jest zakres pomiarowy. Jak rozumiem sam czujnik obrotów jest już wbudowany i niewiele da się zmienić.

Ten procek ma tylko jedno przwdziwe wejście ICP. To nóżka PB0 - trzeba sprawdzić na schemacie jak jest oznaczony ten pin na płytce arduino. Ogólnie to system arduino raczej będzie przeszkadzał niż pomagał w takiej konfiguracji - jest jeden 16 bitowy timer (Timer1) i pewnie jest używany przez samo arduino. Co prawda do ICP można użyć nawet timera, który już jakoś pracuje, byle w miarę długim cyklu. Zadanie jest na tyle proste, że można to oprogramować bezpośrednio w C, z pominięciem arduino. Chyba że już w tych bibliotekach dodatkowych coś się znajdzie gotowego.
 
Odpowiedź
#13
Sprawdź przetestuj, jeżeli bedzie coś nie tak to poprawimy bo pisałem to z pamięci bez testowania na podstawie innych swoich projektów do czegoś innego. W zasadzie wyświetlana czestotliwość bedzie twoim RPM jak masz jeden inpuls na obrót. 

Sygnał z czujnika podłacz do pinu 8 
Kod:
#define pinICP 8                    //
#define ICP_Timers 40000            // Przepelnienie licznika Timer1 co 20ms     
#define LICZBAPROBEK_ICP_Okres 10

///////////// Timer 1 Input Capture sygnal  pin 8
volatile uint32_t ICP_Okres =0;               
volatile uint32_t Suma_ICP_Okres = 0;         
volatile uint8_t  ICP_Tik_Okres =0;           
volatile uint32_t Srednia_ICP_Okres =0;         
volatile uint16_t ICP_Tim_Okres =0;           
volatile uint8_t ICP_Timers_Okres =0;         
volatile uint16_t Ostatni_ICP_Tim_Okres =0;   

                             
volatile bool ICP_bool_Okres = false;         

ISR(TIMER1_COMPA_vect) {    //////////// przepelnienie licznika co 20ms

  ICP_Timers_Okres++;


  if(ICP_Timers_Okres >100){     // time out 2s
     Srednia_ICP_Okres =0;
     ICP_Okres=0;
     ICP_bool_Okres=true;
   }

}

ISR(TIMER1_CAPT_vect) {      // przerwanie input capture

  ICP_Tim_Okres = TCNT1;   // odczytaj aktualny stan licznika
     
  if(ICP_Timers_Okres >0){
    if(ICP_Timers_Okres >1){
      Ostatni_ICP_Tim_Okres = ICP_Timers - Ostatni_ICP_Tim_Okres;
      ICP_Okres = (((ICP_Timers_Okres-1)*ICP_Timers)+Ostatni_ICP_Tim_Okres+ICP_Tim_Okres)>>1;
    }else{
      Ostatni_ICP_Tim_Okres = ICP_Timers - Ostatni_ICP_Tim_Okres;
      ICP_Okres = (Ostatni_ICP_Tim_Okres+ICP_Tim_Okres)>>1;
    }
  }else{
    ICP_Okres=(ICP_Tim_Okres-Ostatni_ICP_Tim_Okres)>>1;
  }

  Ostatni_ICP_Tim_Okres=ICP_Tim_Okres;
  ICP_Timers_Okres=0;

  //////////////// wyliczanie sredniej Okres

  Suma_ICP_Okres=Suma_ICP_Okres+ICP_Okres;
  ICP_Tik_Okres++;

  if(ICP_Tik_Okres>=LICZBAPROBEK_ICP_Okres){
    Srednia_ICP_Okres=(Suma_ICP_Okres/ICP_Tik_Okres);
    ICP_Tik_Okres=0;
    Suma_ICP_Okres=0;
    ICP_bool_Okres=true;
  }

}

void setup() {


  Serial.begin(9600);
  pinMode(pinICP, INPUT);

  cli();
  TCCR1A = 0;
  TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<CS11) | (1<<WGM12) ;
  TCCR1C = 0;
  OCR1A = (ICP_Timers-1);
  TIFR1 = (1<<ICF1) | (1<<TOV1);   
  TIMSK1 = (1<<ICIE1)  | (1 << OCIE1A);
  { TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); }  /// L/H
  //{ TCCR1B &= ~(1<<ICES1); TIFR1 |= (1<<ICF1); }  //  H/L
  sei();
}

void loop() {
  if(ICP_bool_Okres){
   Serial.println( "OKRES");
   Serial.println( ICP_Okres);
   Serial.println( "SREDNIA OKRESU");
   Serial.println(Srednia_ICP_Okres);
   Serial.println( "CZESTOTLIWOSC");
   Serial.println( 1000/ICP_Okres);
   Serial.println( "SREDNIA CZESTOTLIWOSCI");
   Serial.println( 1000/Srednia_ICP_Okres);
   ICP_bool_Okres=false;
  }
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości