31-08-2020, 20:35
BRY
Napisałem sobie prosty kod - pomiar częstotliwości PWM na wejściu cyfrowym
Mierzę czas stanu LOW, HIGH, dodaje i obliczam częstotliwość.
Działa, ale co jakiś czas otrzymuję wynik z d..y
Jako źródła zastosowałem sygnał 1kHz z oscyloskopu.
Wykres w kreślarce wygląda tak: https://photos.app.goo.gl/WgpsWkbwcpmHir3J9
Finalnie będę mierzył częstotliwości gdzieś do 100Hz max.
Możecie zerknąć na kod (brudnopis jakby co)? Mam gdzieś błąd?
Czy też to kwestia zbyt wysokiej już częstotliwości???
Z góry dzięki...
Napisałem sobie prosty kod - pomiar częstotliwości PWM na wejściu cyfrowym
Mierzę czas stanu LOW, HIGH, dodaje i obliczam częstotliwość.
Działa, ale co jakiś czas otrzymuję wynik z d..y
Jako źródła zastosowałem sygnał 1kHz z oscyloskopu.
Wykres w kreślarce wygląda tak: https://photos.app.goo.gl/WgpsWkbwcpmHir3J9
Finalnie będę mierzył częstotliwości gdzieś do 100Hz max.
Możecie zerknąć na kod (brudnopis jakby co)? Mam gdzieś błąd?
Czy też to kwestia zbyt wysokiej już częstotliwości???
Z góry dzięki...
Kod:
int RPM_pin = 44; boolean RPM_state=false; boolean RPM_state_=false; float RPM_low_time=0; float RPM_high_time=0;
float time=0; float RPM; float msLICZNIK; float licznik; float msBT; float FRQ;
void setup()
{
Serial.begin(115200);
Serial3.begin(38400);
pinMode(RPM_pin, INPUT);
}
void loop() {
RPM_state = digitalRead(RPM_pin);
if (RPM_state != RPM_state_) // jeśli zmienił się stan pinu RPM_pin
{
if (RPM_state) // jeśli RPM_pin HIGH
{
RPM_low_time=micros()-time; // jak długo [us] trwał stan LOW
}
else
{
RPM_high_time= micros()-time; // jak długo [us] trwał stan HIGH
}
time=micros(); // reset licznika czasu
RPM_state_=RPM_state; // zapis stanu pinu RPM
FRQ=1000000/(RPM_high_time+RPM_low_time);
}
if (millis() > msBT + 10)
{
// Serial.print(RPM_low_time); Serial.print(" "); Serial.println(RPM_high_time);
//Serial.println(1000000/(RPM_high_time+RPM_low_time));
Serial.println(FRQ);
msBT = millis();
}
//delay(10);
}