Servo stufenlos steuern mit Drehzahl signal

Hi,

vorab, ich bin ziehmlich neu auf diesem Gebiet und bräuchte daher Unterstützung :slight_smile:

Ich habe eine Ansaugbrücke welche in der Länge der Ansaugwege Variabel ist.
Jetzt hatte ich mir gedacht, man könnte doch die Ansaugwege mit der Drehzahl Frequenz des Motors über ein Servo ansteuern. Hab mir dann dazu den Sketch für ne Drehzahl messung geholt und die steuerung für den Servo mit reingeschrieben. Mein Problem ist leider dass diese Messung mit einer Verzögerung reagiert (ca. 1Sekunde)

liegt es daran, dass die Berechnung so lange dauert oder das system damit so stark ausgelastet ist?

Grüße Leon

#include <Servo.h>
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
Servo motor1;

byte DZM_InputPin = 2;
volatile unsigned long RPM_T2, RPM_Count;
unsigned long RPM , RPM_T1;
int val;


void setup() {
  
  pinMode(DZM_InputPin, INPUT_PULLUP);
  RPM_T1 = 0;
  RPM_T2 = 0;
  RPM_Count = 0;
  motor1.attach(9); 
 
  attachInterrupt(0, RPM_Meter, FALLING);    // Interrupt0 wird bei fallender Flanke auf Pin2

}

void loop() {
  char RPMStr[1];
  if (RPM_T2 > RPM_T1) {
    RPM = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 - RPM_T1));
    RPM_T1 = RPM_T2;
    RPM_Count = 0;
  }
  else {
    RPM = 0;
  }
  sprintf(RPMStr, "%4u", RPM);

  u8g2.drawStr(0, 20, RPMStr); 
  u8g2.sendBuffer();
 
  val = (RPM);
  val = map(val, 2500, 4000, 100, 80);
  Serial.println(val);
  motor1.write(val);
  delay(0);
 
 }

void RPM_Meter () {

  RPM_Count++;
  RPM_T2 = millis();

}

(deleted)

Hallo,

Sorry weder aus deinem Text noch aus Dem Sketch kann ich erkennen was das werden soll. Allerdings sind mir drei Dinge aufgefallen.

  1. char RPMStr[1]; ist eine char Zeichenkette mit der länge eines einzelnen Zeichen´s , später im Sketch willst Du mit sprintf(RPMStr, “%4u”, RPM); da den Messwert für dür die Drehzahl reichschreiben. Dabei wird die Länge mehr als ein Zeichen sein.

2 Du machst eine Frequenzmessung mit einem Intrupt und benutzt millis() dazu, kann man machen , allerdings wid die Auflösung nicht besonders sein. ich würde da micros() verwenden. Zudem ist mir die Verwendung von RPM_count nicht ganz klar.

  1. Du scheibst mit jeder Runde im Loop auf das Display , das reicht auch alle 200 ms

Heinz