PWM Signal zur Überwachung einer Flugsteuerung

Hi Leute,

ich bin noch ein kleiner Anfänger und komme bei folgendem Code zur Überwachung einer Flugsteuerung nicht weiter.

volatile int pwm_value0 = 0;
volatile int prev_time0 = 0;
volatile int pwm_value1 = 0;
volatile int prev_time1 = 0;
volatile int pwm_value2 = 0;
volatile int prev_time2 = 0;
volatile int pwm_value3 = 0;
volatile int prev_time3 = 0;
volatile int pwm_value4 = 0;
volatile int prev_time4 = 0;
volatile int pwm_value5 = 0;
volatile int prev_time5 = 0;

const int ledPin = 13;

int x = 1435;
int y = 800;

String wert2;
String wert3;
String wert4;
String wert5;
long start;
long ende;
long dauer;

 
void setup() {
 
  attachInterrupt(0, rising0, RISING);
  attachInterrupt(1, rising1, RISING);
  attachInterrupt(2, rising2, RISING);
  attachInterrupt(3, rising3, RISING);
  attachInterrupt(4, rising4, RISING);
  attachInterrupt(5, rising5, RISING);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}
 

  
 // Channel 0
void rising0() {
  attachInterrupt(0, falling0, HIGH);
  prev_time0 = micros();
}
 
void falling0() {
  attachInterrupt(0, rising0, LOW);
  pwm_value0 = micros()-prev_time0;
}
// Channel 1
void rising1() {
  attachInterrupt(1, falling1, HIGH);
  prev_time1 = micros();
}
 
void falling1() {
  attachInterrupt(1, rising1, LOW);
  pwm_value1 = micros()-prev_time1;
}
// Channel 2
void rising2() {
  attachInterrupt(2, falling2, HIGH);
  prev_time2 = micros();
}
 
void falling2() {
  attachInterrupt(2, rising2, LOW);
  pwm_value2 = micros()-prev_time2;
}
// Channel 3
void rising3() {
  attachInterrupt(3, falling3, HIGH);
  prev_time3 = micros();
}
 
void falling3() {
  attachInterrupt(3, rising3, LOW);
  pwm_value3 = micros()-prev_time3;
}
// Channel 4
void rising4() {
  attachInterrupt(4, falling4, HIGH);
  prev_time4 = micros();
}
 
void falling4() {
  attachInterrupt(4, rising4, LOW);
  pwm_value4 = micros()-prev_time4;
}
// Channel 5
void rising5() {
  attachInterrupt(5, falling5, HIGH);
  prev_time5 = micros();
}
 
void falling5() {
  attachInterrupt(5, rising5, LOW);
  pwm_value5 = micros()-prev_time5;
}


void loop() {
  if ((pwm_value2  < x)&&(pwm_value2 > y))
  {wert2 = "OKAY";
  }
  else {
    wert2 = "Not OKAY";
  }
  if ((pwm_value3  < x)&&(pwm_value3 > y))
  {wert3 = "OKAY";
  }
  else {
    wert3 = "Not OKAY";
  }
  if ((pwm_value4  < x)&&(pwm_value4 > y))
  {wert4 = "OKAY";
  }
  else {
    wert4 = "Not OKAY";
  }
  if ((pwm_value5  < x)&&(pwm_value5 > y))
  {wert5 = "OKAY";
  }
  else {
    wert5 = "Not OKAY";
  }

  if((wert2 == "Not OKAY")||(wert3 == "Not OKAY")||(wert4 == "Not OKAY")||(wert5 == "Not OKAY"))
  {digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW);
  }
  print();
  }

  
void print() {
  //Serial.print(pwm_value0);
  //Serial.print("-");
  //Serial.print(pwm_value1);
  //Serial.print("-");
  Serial.print(pwm_value2);
  Serial.print("-");
  Serial.print(wert2);
  Serial.print("-");
  Serial.print(pwm_value3);
  Serial.print("-");
  Serial.print(wert3);
  Serial.print("-");
  Serial.print(pwm_value4);
  Serial.print("-");
  Serial.print(wert4);
  Serial.print("-");
  Serial.print(pwm_value5);
  Serial.print("-");
  Serial.println(wert5);
  
  
  
}

Dieser liest die PWM Signale der Flugsteuerung durch einen Interrupt aus und vergleicht sie anschließend immer mit dem erlaubten Bereich.

Mein Problem ist jetzt, dass wenn ich durch ausschalten der Flugsteuerung einen Ausfall simulieren möchte natürlich ständig der letzte PWM Wert ausgegeben wird. Sprich der letzte Wert der einen Interrupt ausgelöst hat.

Ich möchte allerdings, dass wenn keine Signale mehr ankommen diese auch so wiedergeben werden, durch Nullen dargestellt werden und als nicht in Ordnung angezeigt werden. (In diesem Fall möchte ich dann mittels Multiplexer auf eine andere Flugsteuerung wechseln.)

Danke schon einmal für jegliche Art an Hilfe!

Gruß
Sebi :slight_smile:

Welchen Arduino hast Du?

Grüße Uwe

AH sorry, ich wusst ich hab ne wichtige Info vergessen. Ich arbeite mit dem Teensy 3.2, also keinem Arduino.

Gruß
Sebi

Hi

Du könntest die aktuellen Werte verwerfen (auf Null setzen), wenn 100ms nichts Neues empfangen wurde - so kommst Du in den verbotenen Bereich und Dein µC kann gezielt umschalten.

MfG

Hi,

mit welchem Befehl/Bedingung könnte ich abfragen ob 100ms nichts Neues empfangen wurde?

If (Bedingung)
{pwm_value0 = 0;

else …

und das ganze im Loop

Gruß

Hi

Bei jedem Empfang merkst Du Dir die aktuelle 'System-Zeit' - in diesem Fall wohl millis();
Wenn nun millis()-letzte_Empfangs_Zeit>=100 (-> 100ms oder länger) -> Werte alle in den ungültigen Bereich schieben.

...} else ...

Eine öffnende Klammer sollte schon wieder geschlossen werden :wink:
(wenn nur ein Befehl folgt keht's auch ohne Klammern - der Übersicht geschuldet sollte man Diese aber (nahezu) immer nutzen)

MfG