• 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
Pomiar częstotliwości wejściem DC
#11
Jak najbardziej ale to wymaga wiedzy timer2 w ICP....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#12
Nie wiem co to jest ta wiedza Wink

Dałem sobie radę o tyle, że algorytm mam, działa tyle że mam jeden problem obawiam się, że analogowy.
Objawy są takie, że taki prosty kod jak poniżej zlicza mi za dużo impulsów. Przypuszczam, że sygnał
na wejściu jest zaszumiony i przerwanie jest za dużo razy wywoływane.
Podłącze jutro oscyloskop, może mi się uda coś podejrzeć...


Kod:
setup()
  {
    attachInterrupt(0, cykl, RISING); //LOW, HIGH, CHANGE, FALLING, RISING
  }

//itd

void cykl()
  {
    impulsow++;
  }


Może chociaż podpowiedź jak toto odfiltrować? Smile

Jakub
 
Odpowiedź
#13
Posiądź wiedzę nad rejestrami timerów, nie jest trudne a bardzo "przyda się"..

Bo o ile teraz masz problem z pikami sygnału i powalczysz by odfiltrować, tak potem będziesz miał problem z wyliczeniem okresu...

Zwykły filtr LC powinien pomóc..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#14
A dwa słowa więcej można prosić? Czego mam szukać w tych rejestrach w kontekście tego co wyżej?
To dość obfity temat chyba Smile

J.
 
Odpowiedź
#15
Witam
Może coś podpowiem. Zrobiłem sterownik agregatu prądotwórczego z samostartem itd.
Też musiałem pomierzyć obroty, aby wiedzieć czy częstotliwość napięcia jest w normie i jeszcze do innych celów jak przy rozruchu, aby ssanie wyłączało się w odpowiedniej chwili. Czyli w zależności od obrotów przy starcie agregatu podejmowane są odpowiednie kroki programu, to na tyle wstępu.
Załączę schemat mojego interfejsu do arduino pomiaru obrotów  

.pdf   Schematy interfejsów sterownika.pdf (Rozmiar: 1.32 MB / Pobrań: 6)

Tam są inne jeszcze schematy.

   
To udało mi się zobaczyć oscyloskopem programowym, interfejs mikrofonu, dwa oporniki, aby zrobić dzielnik napięcia.
Czyli każda iskra to dwa piki jak się okazało w górę czyli na + i jeden na - . Tu jest odwrotnie. 
Interfejs tak dobrałem, aby arduino widziało tylko ten na minus. 
Pomiar oczywiście na przerwaniu.
Nie wiem czy coś Ci pomogłem ale niech tam.
Pozdrawiam

EDIT
Zacznij od opracowania odpowiedniego dla Ciebie interwejsu, który przetworzy sygnał obrotów na akceptowalny dla arduino. Tu bez oscyloskopu się nie obejdzie.
Musisz widzieć co mierzysz a dopiero potem trenować jak to pomierzyć.
 
Odpowiedź
#16
To nie jest działający program ale powinno ci coś nie coś oświecić jak się nauczysz  jak zmierzycz okres... bo wyrwałem ze swojego programu

Kod:
#define IC_Timers 16000           // przepelnienie licznika 16bit emilinacja sygnalow powyzej 8ms..
volatile uint16_t ICS_Tim =0;                  // odczytany licznik zegara timer1
volatile uint8_t ICS_timout =0;                // czas time out sygnału
volatile bool ICS_zbocze = false;              // wybor zbocza przerwania Inmput Capture

ISR(TIMER1_COMPA_vect) { // przepełnienie timera 8ms

  if(ICS_zbocze){
   { TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false ; }  /// ustaw ICP L/H
  }else{
    ICS_timout++;
    //////////////  wyzerowanie okresu po zaniku sygnalu
    if(ICS_timout >=62){ /// tim out oklo 500ms
      ICS_timout=0;
      ICS_Tim = 0;                 // wyzeruj okres
    }
  }

}

ISR(TIMER1_CAPT_vect) {      // przerwanie input capture
 


  if (ICS_zbocze) {
    TCCR1B |= (1<<ICES1);
    TIFR1 |= (1<<ICF1);
    ICS_zbocze = false;             // zmien wyzwolenie na zbocze L/H

    ICS_Tim = ICR1;                 // odczytaj aktualny stan licznika
    TCNT1 = 0x00;                   // wyzeruj licznik

   
     

  }else {
    TCCR1B &= ~(1<<ICES1);
    TIFR1 |= (1<<ICF1);
    ICS_zbocze = true;            //  zmien wyzwolenie na zbocze high-low
    ICS_timout=0;                 // wyzeruj przepelnienie licznika
  }
}

void setup() {

  pinMode(8, INPUT);
 
  // TIMER_1 ICP od 15 do 100
  //zbocze  low-high  (TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); zbocze = 0;);
  //zbocze  high-low  (TCCR1B &= ~(1<<ICES1); TIFR1 |= (1<<ICF1); zbocze = 1;);
  cli();
  TCCR1A = 0;
  TCCR1B = (0<<ICNC1) | (1<<CS11) | (1<<WGM12) ;
  TCCR1C = 0;
  OCR1A = (IC_Timers-1);
  TIFR1 =  (1<<TOV1);   
  TIMSK1 = (1<<ICIE1) | (1 << OCIE1A);
  { TCCR1B |= (1<<ICES1); TIFR1 |= (1<<ICF1); ICS_zbocze = false ; }  /// ustaw L/H
  sei();

}

void loop() {
  // ICS_Tim zwraca okres z dokładnością 1us...

 

}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#17
Dziękuję, wszystko się przyda Smile

Póki co rozwiązałem sprawę programowo - po prostu po wykryciu iskry przez 0.005s ignoruję kolejne
bo nie mają prawa się pojawić - silnik nie osiągnie 12.000rpm Wink Dopiero później znowu uwzględniam
kolejną iskrę. Działa w 100% stabilnie. Postaram się jeszcze podejrzeć przebieg iskry oscyloskopem
jak poprzednik, żeby widzieć co się dzieje...

Jakub
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości