Skocz do zawartości

Obrotomierz błędne pomiary


KrzysiekS

Pomocna odpowiedź

Witam

Potrzebuję wykonać obrotomierz do pewnego urządzenia ,ale coś nie działa

Maszyna ma na wale silnika tarczę enkodera z 60 zębami, zakres obrotów od 0 do 3000 rpm.

Tarcza współpracuje z transoptorem szczelinowym, skąd sygnał  ( 0/5V) jest podawany na wejście

analogowe ARDUINO Mega 2560. Wynik pomiaru jest podawany poprzez rejestr przesuwny i dekoder

do poczwórnego wyświetlacza 7 segmentowego.

Ale, układ pracuje poprawnie tylko do ok. 600rpm.

Dla lepszego przedstawienia problemu przedstawiam uproszczony szkic, w którym korzystam z monitora portu szeregowego.  To samo zjawisko występuje z wyświetlaczem, tylko że umieszczenie procedury obsługi wyświetlacza musi być w pętli głównej.

Jeżeli funkcja serialn.print….  jest w pętli ( if (deltaT ….) wyniki pomiarów są OK, natomiast jeżeli serial.print…. jest w pętli głównej pomiar jest prawidłowy do 0 do ok.600 rpm.

No i pytanie co powoduje te błędy ?

Jako ciekawostkę podam, że użycie tarczy z 12 zębami przesunęło granicę błędu do 3000 rpm., ale pomiary są z dokładnością  5 rpm.

Jeżeli Ktoś mi pomoże,  to dziękuję .

 





//******************** OBROTOMIERZ ********************************************


int licznik = 0;
int wynik = 0;
int blokEn = 0;
int blokT = 0;
int imp = 0;
unsigned long deltaT = 0;
unsigned long czasB = 0;
unsigned long zegar = 0;



void setup() {
  Serial.begin(9600);
  
}

void loop() {
  if ( blokT ==0){
  zegar = millis(); // start pomiaru
  blokT = 1;         // blokada czasu poczatku pomiaru
  
  }
  imp = analogRead(0);  
  if (( imp > 500) && (blokEn == 0 )) {
    licznik ++;
    blokEn = 1;   
  }
  if ( imp < 500){
    blokEn = 0;
  }
  czasB = millis();   // czas biezacy
  deltaT = czasB - zegar;  // czas trawania pomiaru
  if (deltaT > 1000UL ){  // koniec pomiaru po 1 sek
    wynik = licznik;
    licznik = 0;    //zerowanie licznika
    blokT = 0;      // odblokowanie czasu start
    deltaT = 0;
  //Serial.println(wynik);  // OK
  }
 
 Serial.println(wynik); //nie dziala
  

}

 

 

Link do komentarza
Share on other sites

Policzmy sobie...

3000 rpm, 60 zębów, to daje 3000 impulsów na sekundę. Ponieważ musisz wykryć zbocze impulsu, potrzebujesz dwóch pomiarów, co daje ok. 160 µsec. Czas wykonania analogRead() to ok. 100 µsec, czyli jeśli nawet nic nie zakłóci pomiaru, i tak jesteś praktycznie poza granicą dokładności próbkowania i wyniki mogą być zaniżone.

A teraz dodatkowo dodajesz jakieś opóźnienia (bo czas wykonania Serial.println() nie jest zerowy, czas obsługi wyświetlacza też) co bardzo skutecznie uniemożliwia prawidłowe zliczanie impulsów. No bo jeśli czas wykonania pętli wynosi nawet milisekundę (zmierz go sobie z ciekawości) - w jaki sposób chcesz mierzyć sygnał o częstotliwości 3 kHz?

Czyli już wiesz co powoduje te błędy - Twój sposób nadaje się świetnie do liczenia obrotów korby w katarynce, ale nie nadaje się do prędkości które chcesz mierzyć.

Link do komentarza
Share on other sites

Do 3 tysięcy powinno Ci się udać zliczyć przerwaniami np. INT0, co i jak jest w opisie arduino https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ , ustawiasz sobie wyzwalanie np. na rising i zwiększasz zmienną w przerwaniu, co określony czas sobie ją odczytujesz i zerujesz rozpoczynając cykl od nowa. Atmegi mają też tryb sprzętowego zliczania impulsów, można albo sobie zaadaptować proste przykłady z internetu, albo wpisać w managerze bibliotek hasło "puls" i jakąś wybrać. Jest np. freqCount z opisem tu:  https://www.pjrc.com/teensy/td_libs_FreqCount.html , sygnał podłącza się pod pin D5 i odpadają niektóre PWM. Dobrze by było mieć możliwość przełączania sobie zakresów, np. dla niskich prędkości zwiększać interwał czasu, dla większych go zmniejszać. W tej bibliotece akurat tego chyba nie ma.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Och nie, ciekawe to jest badanie ADC sygnału 5V lub 0V, czyli cyfrowego 0/1. Przecież on tym ADC sprawdza czy jest powyżej 2.5V (ADC>500, no tak doczep się, że nie 2.5 tylko 2.441). Nie,nie, ja proponuję podłączyć to do pinu cyfrowego 2/3, wykryć zbocze narastające i  zliczyć w przerwaniu INT0 czy tam INT1. Inna opcja to biblioteka, linki podałem, a sprzętowe zliczanie impulsów AVR jest opisane np. tu: http://mikrokontrolery.blogspot.com/2011/04/obrotomierz-diy.html . Ale faktycznie jest piąąąąąąąąateczek i zajrzę tu jutro sprawdzić co powypisywałem. Albo nie sprawdzę. Pa.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.