Geschwindigkeit Sensor Abtastfrequenz

OP #5871588
Lesenswert?

Hi,

ich steh gerade ein wenig auf dem Schlauch,
eventuell kann mir ja jemand einen Denkanstoß geben.

Ich messe mit einem Sensor Radumdrehungen und will die
Geschwindigkeit berechnen.
1
signale_pro_radumdrehung    = 8
2
abrollumfang_in_m           = 1.7
3
meter_pro_km                = 1000
4
mess_intervall_in_ms        = 250
5
gemessene_impulse           = 1
6

7
( ( ( abrollumfang_in_m * ( gemessene_impulse * ( meter_pro_km / mess_intervall_in_ms ) ) / signale_pro_radumdrehung ) * 60 ) * 60 ) / 1000

Ein INT zählt, über einen Timer errechne ich die Geschwindigkeit.

Wenn ich in den 250ms nur ein Signal bekomme, sind das 3.06km/h.

Wenn ich den Timer auf 100ms stelle, sind das schon 7.65km/h

Das heist für mich, dass ich den Timer nicht kürzer als
250ms stellen kann, außer ich ignoriere alles unter 10km/h oder so ...

Ist das richtig oder hab ich einen Denk- und/oder Rechen-Fehler ???
Gast #5871605
Lesenswert?

Ray M. schrieb:
> Das heist für mich, dass ich den Timer nicht kürzer als
> 250ms stellen kann, außer ich ignoriere alles unter 10km/h oder so ...

Falscher Ansatz. Miss die Zeit zwischen zwei Sensorsignalen und fange 
dann noch mal an zu rechnen.
(Wenn es damit bei hohen Geschwindigkeiten eng wird: reziproker 
Frequenzähler)
OP #5871609
Lesenswert?

Wolfgang schrieb:
> Ray M. schrieb:
>> Das heist für mich, dass ich den Timer nicht kürzer als
>> 250ms stellen kann, außer ich ignoriere alles unter 10km/h oder so ...
>
> Falscher Ansatz. Miss die Zeit zwischen zwei Sensorsignalen und fange
> dann noch mal an zu rechnen.
> (Wenn es damit bei hohen Geschwindigkeiten eng wird: reziproker
> Frequenzähler)

Danke für den Tip, schau ich mir mal an.
OP #5872348
Lesenswert?

Ich bin zu blöd, kann mit mal jemand auf die Sprünge helfen.

Ich versuche mit folgendem Code die Geschwindigkeit zu messen,
bei gegebenem Abrollumfang und 6 Signalen pro Radumdrehung.
1
float rad_abrollumfang          = 2.0;  // in meter
2
int   rad_signale_pro_umdrehung = 6;
3

4
volatile float rpm_time         = 0;
5
volatile float rpm_time_last    = 0;
6

7
void isrCount() {
8
  unsigned long m = micros();
9
  rpm_time        = (m - rpm_time_last);
10
  rpm_time_last   = m;
11
}
12

13
void setup() {
14
  attachInterrupt(4, isrCount, FALLING);
15
}
16

17
void loop() {
18
  // interrupts bei volatilen variable sperren !!!
19
  noInterrupts();
20
    int rpm = (int)((1000000/rpm_time)*60)/rad_signale_pro_umdrehung;
21
  interrupts();
22
  int kmh = (int)((rpm*60)*rad_abrollumfang)/1000;
23
  Serial.println(kmh);
24
}

Wenn ich das mal mit der Hand nachrechne kommt da irgendwie
ganz schön Unsinn raus ;(

Nehmen wir an wir haben rpm=10, das sind 60 Signale
Dann sind das also 10 U/min
Eine Stunde hat 60 Minuten, also 10*60=600U/h
Dann sind das 600*2=1200 Meter/h oder 1,2km/h

Das ist doch Schwachsinn ...

Ok, rpm ist nicht in min sondern in sec, dann feht einmal *60

Nehmen wir an wir haben rpm=10, das sind 60 Signale
Dann sind das also 10 U/sec = 60 U/min = 3600 U/h

3600 U/h * 2 Meter = 7200 meter/h = 7,2 kmh

Ich blick es gerade nicht ...
Gast #5872356
Lesenswert?

Schau dir doch einfach den Code von ergokey weiter oben an. Der macht 
das recht clever, in dem er die Anzahl der ms zwischen 2 Impulsen bei 
1kmh als REFERENZ angibt. 10 Kmh sind dann REFERENZ/10 usw.

Egberto

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren