Extreme Verzögerung bei umsetzen von Signalen

Moin Moin

Ich habe ein kleines problem bei der umsetzung von PWM Signale eines RC-Empfängers.

2 Arduinos laufen super, der dritte zickt rum.

Hier ein Video von meinem aufbau.

Bei dem Dritten Arduino werden die Signale extrem verzögert umgesetzt.

Das PWM Signal vom Empfänger kommt aber sauber an den eingang vom Arduino an( mittels Oska gemssen und signale verfolgt)

Hier der Sketch

#define ch1 A0
#define ch2 A1
#define ch3 A2
#define ch4 A3
#define ch5 A4
#define ch6 A5
#define ch7 A6
#define ch8 A7
#define relais1 2
#define relais2 3
#define relais3 4
#define relais4 5
#define relais5 6
#define relais6 7
#define relais7 8
#define relais8 9

unsigned long ch1v;
unsigned long ch2v;
unsigned long ch3v;
unsigned long ch4v;
unsigned long ch5v;
unsigned long ch6v;
unsigned long ch7v;
unsigned long ch8v;

void setup()
{
pinMode(ch1, INPUT);
pinMode(ch2, INPUT);
pinMode(ch3, INPUT);
pinMode(ch4, INPUT);
pinMode(ch5, INPUT);
pinMode(ch6, INPUT);
pinMode(ch7, INPUT);
pinMode(ch8, INPUT);
pinMode(relais1, OUTPUT);
pinMode(relais2, OUTPUT);
pinMode(relais3, OUTPUT);
pinMode(relais4, OUTPUT);
pinMode(relais5, OUTPUT);
pinMode(relais6, OUTPUT);
pinMode(relais7, OUTPUT);
pinMode(relais8, OUTPUT);
}

void loop()
{
ch1v = pulseIn(ch1, HIGH);
ch2v = pulseIn(ch2, HIGH);
ch3v = pulseIn(ch3, HIGH);
ch4v = pulseIn(ch4, HIGH);
ch5v = pulseIn(ch5, HIGH);
ch6v = pulseIn(ch6, HIGH);
ch7v = pulseIn(ch7, HIGH);
ch8v = pulseIn(ch8, HIGH);

if ( ch1v > 1500)
{
  digitalWrite(relais1,1);
} else {
  digitalWrite(relais1,0);
}

if ( ch2v > 1500)
{
  digitalWrite(relais2,1);
} else {
  digitalWrite(relais2,0);
}

if ( ch3v > 1500)
{
  digitalWrite(relais3,1);
} else {
  digitalWrite(relais3,0);
}

if ( ch4v > 1500)
{
  digitalWrite(relais4,1);
} else {
  digitalWrite(relais4,0);
}

if ( ch5v > 1500)
{
  digitalWrite(relais5,1);
} else {
  digitalWrite(relais5,0);
}

if ( ch6v > 1500)
{
  digitalWrite(relais6,1);
} else {
  digitalWrite(relais6,0);
}

if ( ch7v > 1500)
{
  digitalWrite(relais7,1);
} else {
  digitalWrite(relais7,0);
}

if ( ch8v > 1500)
{
  digitalWrite(relais8,1);
} else {
  digitalWrite(relais8,0);
}

delay(5);
}

Ich habe auch schon verschiedene Arduinos probiert ( 1 Originaler und 4 Clone) bei allen das selbe Problem.

Mit dem "delay" habe ich auch schon gespielt, brachte aber keinen erfolg.

Danke schonmal im vorraus.

Ich habe auch schon verschiedene Arduinos probiert ( 1 Originaler und 4 Clone) bei allen das selbe Problem:

2 Arduinos laufen super, der dritte zickt rum.

Und die andern beiden?
Und was ist der Unterschied?
Wenn auf allen der gleiche Sketch läuft, kanns das ja wohl nicht sein.

Hi,

Auf den ersten beiden Arduinos laufen andere Sketche, ich hatte mich wohl falsch ausgedrückt.

Danke und gruss

Hallo,
Bei mehr als drei Kanälen wirds "holprig".
Jedes pulseIn erzeugt ca. 30 % CPU Last...

PS: Mit einem pulseIn ein Switch Case bedienen..funzt sicher.

mfg Martin

pulseIn() ist blockierend. Die werden mit einiger Verzögerung hintereinander ausgeführt.

Vom Code her ist das übrigens eine Anwendung für Arrays oder Arrays aus structs.

A6 und A7 sind beim Atmega328 keine digitalen Eingänge/Ausgänge sondern nur analoge Eingänge.

Grüße Uwe

  1. Verwende einen Timoutwert von 20000
  2. Benutze Arrays und For Schleifen; so mußt Du nicht alles 8x schreiben.

Grüße Uwe

Moin,

Die Signalleitung könnte ich noch auf d10 und d11 legen damit a6/7 freiwerden.

Habe das selbe nochmal mit 4 Eingängen und Ausgängen gebaut und da läuft es flüssig.

Uwefed,

Könntest du mir da Hilfestellung mit einem Sketch geben?

Dankeschön schonmal.

ich habe mal ein kleinen Sketch geschrieben, mit dem man ein PWM Signal nicht blockierend einlesen kann, vielleicht kannst du da was mit anfangen.

#define puls_in_Pin 3



void setup() {
 Serial.begin(115200);

}

void loop() {
  static bool puls_stat, puls_stat_alt;
  static uint32_t puls_off_time, puls_on_time, letztes_puls_ereignis;
  
 puls_stat=digitalRead(puls_in_Pin);
 if (puls_stat!=puls_stat_alt) 
{
  if (puls_stat)
  {puls_off_time=micros()-letztes_puls_ereignis;}
     else
        {puls_on_time=micros()-letztes_puls_ereignis;}
   puls_stat_alt = puls_stat;
   letztes_puls_ereignis = micros();
}
if (millis() % 500 ==0) Serial.println(puls_on_time);
}