Go Down

Topic: Drehfrequenz auslesen (Read 491 times) previous topic - next topic

tsaG

Jul 25, 2011, 08:18 pm Last Edit: Jul 25, 2011, 09:12 pm by tsaG Reason: 1
Hi!

Ich möchte mit dem Arduino erst einmal die Drehzahl eines Verbrennungsmotors auslesen. Welche Schaltung benötige ich noch und wie berechne ich die Frequenz im Arduino?

Hier anbei die Spannungskurve(n), die Drehzahl geht von 0 bis ca 6000 UPM

Ist es möglich die Drehzahl-, und nachher noch andere Sensoren auszulesen? Ich weiss irgendwie nicht genau was ich dem kleine Arduino(Uno) alles zutrauen kann :P Insgesamt sollen später noch Spannungen ausgelesen werden (das sollte aber eigentlich kein Problem sein). Die gesammelten Daten werden dann, zur Weiterverarbeitung, über pin 0 und 1 vom Atmen per RS232 an ein Beagleboard gesandt

Grüße

Patrick

tsaG

#1
Jul 26, 2011, 02:20 pm Last Edit: Jul 26, 2011, 09:50 pm by tsaG Reason: 1
Also, ich habe hier erst einmal 2 Arduinos. Der eine sendet eine Frequenz von ca 6k Signalen pro Minute.

Hier mein Sketch für den Sender

Code: [Select]
unsigned int millisalt;
void setup() {                
 pinMode(8, OUTPUT);  
pinMode(9, OUTPUT);
Serial.begin(9600);
}

void loop() {
 int poti = analogRead(A1);
 
millisalt = millis();
 digitalWrite(8,HIGH);
 digitalWrite(9,HIGH);
delay(10);
 digitalWrite(8,LOW);
 digitalWrite(9,LOW);
delay (poti);
int zeit = 60000/((millis()-millisalt));
Serial.println(zeit);

}


Das erstmal nebenbei, dieser Sender gibt mir maximal eine Frequenz von 6k Impulsen (laut Serial Monitor). An Pin 9 ist eine LED zur Kontrolle angeschlossen, 8 ist mit dem Anschluss 2 des anderen Arduinos verbunden. Nun meinen Sketch um diese Signale auszuwerten.

Code: [Select]
volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;
void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, rpm_fun, RISING);
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
}
void loop()
{
  if (rpmcount >= 20) {
    rpm = 60000/(millis() - timeold)*rpmcount;
    timeold = millis();
    rpmcount = 0;
    Serial.println(rpm,DEC);
  }
}
void rpm_fun()
{
  rpmcount++;
}


Jedoch bekomme ich nun höchstens 5300 UPM angezeigt. Ist mein Lösungsansatz schon gut, oder geht es auch besser? Ich wollte das ganze mit einem Interrupt machen da ich später auch noch ein paar andere Sensoren am analogen Ausgang auslesen wollte.

Liegt es irgendwie am Code oder ist der Arduino Geschwindigkeitsmässig am ende?

EDIT: Es funktioniert nun, ich musste nur die Baudrate erhöhen und die max rpmcount auf 8 setzen (ausprobieren).

Go Up