Skocz do zawartości

Jak dobrze zliczyć ilość stanów niskich?


Pomocna odpowiedź

Ale zmiena warunki niczego nie da, bo na delayu też przecież powinno działać. Poza tym te typy zmiennych też nie pasują, bo wtedy nie działa program w ogóle.

1 minutę temu, Dzonzi napisał:

teraz jeszcze gorzej. Nawet jak zmieniłem te dwa typy zmiennych to pokazywało ciągle 0.

może przez kontrolę typów, daj wszystko na int.

@atMegaTona aż takie oblatany nie jestem, volatile można dać dla tablicy?

7 minut temu, atMegaTona napisał:

zastosowanie przy tym średniej z kilku wyników np. 10 dałoby

Rozumiem że robimy tablicę-bufor gdzie kolejkujemy kilka ostatnich pomiarów. Czy dostawienie volatile załatwi sprawę?

Jaki w ogóle jest koszt volatile w C/C++, kiedyś zgłębiałem temat w Javie ale to inna sprawa.

1 minutę temu, Gieneq napisał:

@atMegaTona aż takie oblatany nie jestem, volatile można dać dla tablicy?

można dać volatile gdzie się chce ale będzie ciężka. Koszt jest chyba maksymalny bo jej nie optymalizuje wcale więc lepiej przepisywać do zmiennych lokalnych i dopiero zmienne lokalne tablicować jeśli potrzeba. Dla średniej nie jest potrzebna tablica, wystarczy jedna zmienna dodatkowa nadpisywana co pomiar - taka średnia krocząca do np.10 kroków a później od nowa (dsp low pass filter 😉 )  - oszczędność pamięci. 

Optymalizacja nie jest problemem. Mam wystarczająco dużo pamięci i mocy obliczeniowej. Problem jest to, że program podaje złe wyniki pomiaru - są o wiele za duże i nie wiem czym to może być spowodowane

A jak te rpm liczysz? *60 czy po swojemu? 50Hz to 3000rpm  więc jeśli masz 50 przerwań na sekundę to rpm wynosi 3000 bo 50*60=3000. rpm to rotations per minut, mierzysz co 1000ms czyli co sekundę więc aby obliczyć rpm musisz pomnożyć przez 60 bo w minucie jest 60 sekund. Jako, że w każdej sekundzie może być 1 mniej lub 1 więcej (zależy jak złapie i jak szybko się kręci) , dobrze jest tu wyliczyć średnią dodatkowo. Na prawdę nie wiem w czym problem.

Źle, źle, źle jak mawiają arduinowcy. Czytasz zmienną co 1s więc *60. Proponował bym nawet czytać tą zmienną co 100ms i co 1s drugować uśredniony wynik.

No to teraz mi pokazuje 12 rpm, co jest oczywiście niemożliwe, bo na oko widać, że kręci się dużo szybciej. 

Może problem jest po stronie sprzętu a nie oprogramowania? Pokaż schemat.

Dobra. Teraz mi pokazuje 1176 lub 1200 RPM podczas gdy prędkość tego wentylatora odczytana przez program SpeedFan jest 1185, 1191, 1166... tak się zmieniają te wartości. 

czyli dobrze, lepiej przy takim podejściu nie będzie. To normalne, że się zmieniają. Jak chcesz na sztywno to trzeba doprecyzować sterowanie silnikiem i odfiltrować odczyt. Czym ten silnik sterujesz?

No właśnie nie mam żadnego regulatora ;/ Podłączyłem na sztywno do płyty głównej. Będę musiał iść i wypróbować na wale jakiegoś silnika elektrycznego. Tylko mam jeszcze taki problem, że wał silnika jest przecież z metalu, a metal odbija IR ;/

Podłącz sobie go przez tranzystor do pwm w arduino a z drugiej strony ten czujnik i będziesz miał wszystko w 1.

13 minut temu, Dzonzi napisał:

że wał silnika jest przecież z metalu, a metal odbija IR ;/

Do wału przymocuj jakiś talerzyk, niewiem... nakrętkę od butelki i naklej kawałek białego/czarnego czegoś. Tak by na jednej stronie czujnik wystawiał 0 a na drugiej 1. Strony nie muszą być równe, byle było wyraźne przejście z jednego na drugi.

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...