INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
PWM - Schwankungen kompensieren
30.08.2019, 12:24
Beitrag #1
PWM - Schwankungen kompensieren
Hallo zusammen,

ich bin noch sehr neu in der Welt des Arduino und der Programmierung, man möge mir deshalb nachsehen, wenn ich noch viele Fehler mache :-)

Aktuell versuche ich die Programmierung im Kern zu verstehen um einen späteren Aufbau für die Nutzung im RC-Modellbau hin zu bekommen. Nun bin ich aber auf ein Problem gestoßen bei dem mir auch mein geschätzter "Arduino-Lehrer" ;-) nicht weiter helfen kann.

Ich habe eine Fernsteuerung von FrSky eine Horus X10 und einen passenden Empfänger X4R, diese geben ein PWM-Signal aus, dass ich am Arduino abgreife und für den Testaufbau zum Dimmen einer LED oder steuern eines Servos nutzen möchte.

Nun habe ich das Problem, dass das Signal, wenn ich es auf dem seriellen Monitor ausgeben lasse, ständig leicht schwankt. z.B.: zwischen 983 und 984. Das wäre soweit ja kein Problem.
Doch ab und an sind diese Schwankungen extrem, dann kommen Werte von 970 oder 990 und mehr an.

Das führt dann dazu, dass die LED immer leicht flackert und wenn sie fast gegen Null gedimmt ist sogar entsprechend unregelmäßig zu blinken beginnt. Der Servo ist ebenfalls ständig am Arbeiten und zucken.

Wie läßt sich so etwas kompensieren?

Danke schon mal für jedwede Hilfe

Gruß Anna
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.08.2019, 13:38
Beitrag #2
RE: PWM - Schwankungen kompensieren
Das kommt auf die Ursache der Störung an (das sehen wir aus der Ferne nicht) und darauf, wie zeitnah nachgelaufen werden muss und wie schnell reale Änderungen erfolgen sollen.
Neben der Beseitigung der Störeinflüsse (Priorität 1) käme evtl. ein Tiefpass über die letzten z.B. 10 Werte in Frage.

Ohne Schaltung und ohne Sketch kann man nur wenig dazu sagen.

Gruß Tommy.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.09.2019, 23:10
Beitrag #3
RE: PWM - Schwankungen kompensieren
Hallo,

Du schreibst" .. am Arduino abgreife...". Wie? Was ist die Taktfrequnz der PWM?

Gruß
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.09.2019, 22:17
Beitrag #4
RE: PWM - Schwankungen kompensieren
Hallo,

vorab schon mal Danke.

Puh, die Schaltung ? - Ich wüßte nicht wie ich das so gerade zeigen soll, ich denke auf einem Foto wird man nicht viel erkennen können?

Der bisher am besten laufende Sketch ist der folgende, aber auch hier habe ich bei den Werten für den Servo und die Led2 noch immer minimal schwankende Ausgabewerte im Bereich von +/- 2.

Code:
#include <SPI.h>
#include <Wire.h>
#include <Servo.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32

#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);

int Servo_1_pwm;
const int Led_1 = 4;
const int Led_2 = 5;
const int Led_3 = 6;
int Led_Auswahl;
int Led_2_dim;
int Led_2_pwm;
byte Horus_SA = 3;
byte Horus_lh = 9;
byte Horus_S1 = 10;
unsigned long previousMillis = 0;
int interval = 475;
int Impuls=LOW;
int dsp_v=7;
int dsp_h1=10;

Servo Servo_1;

/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -- SETUP -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
void setup() {
    Serial.begin(9600);
      if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
      Serial.println(F("SSD1306 allocation failed"));
      for(;;);
    }
  pinMode(Horus_SA,INPUT);
  pinMode(Horus_S1,INPUT);
  pinMode(Led_1,OUTPUT);
  pinMode(Led_2,OUTPUT);
  pinMode(Led_3,OUTPUT);

  Servo_1.attach(11);
  pinMode(Horus_lh,INPUT);

  digitalWrite(Led_1,LOW);
  analogWrite(Led_2,0);
  digitalWrite(Led_3,LOW);
}

/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -- LOOP -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
void loop() {

/*---------------------------- SERVO_1 ----------------------------*/
    Servo_1_pwm = map(pulseInLong(Horus_lh,HIGH),984,2007,0,180);
    constrain(Servo_1_pwm,0,180);
    Servo_1.write(Servo_1_pwm);
/*---------------------------- SERVO_1 ENDE ----------------------------*/
  
  unsigned long currentMillis = millis();

/*---------------------------- LED_AUSWAHL-WERT ----------------------------*/
  Led_Auswahl = (pulseIn(Horus_SA,HIGH)/10);
/*---------------------------- LED_AUSWAHL-WERT ENDE----------------------------*/


/*---------------------------- LED_1 ----------------------------*/
  if(Led_Auswahl<=110){
    if (currentMillis - previousMillis >= interval){  
    previousMillis = currentMillis;
      if(Impuls == LOW){
        Impuls = HIGH;
      } else{
        Impuls = LOW;
      }
      }
    digitalWrite(Led_1,Impuls);
  } else {
    digitalWrite(Led_1,LOW);
  }
/*---------------------------- LED_1 ENDE ----------------------------*/

/*---------------------------- LED_2 ----------------------------*/
    Led_2_pwm = map(pulseInLong(Horus_S1,HIGH),984,2007,0,255);
    constrain(Led_2_pwm,0,255);

  if(Led_Auswahl>=120 && Led_Auswahl<=170){
    if(Led_2_pwm>=254){
      Led_2_pwm=255;
    }
    if(Led_2_pwm<=1){
      Led_2_pwm = 0;
    }
    analogWrite(Led_2,Led_2_pwm);
  } else {
    analogWrite(Led_2,0);
  }    
/*---------------------------- LED_2 ENDE ----------------------------*/  

/*---------------------------- LED_3 ----------------------------*/
  if(Led_Auswahl>=180){
    digitalWrite(Led_3,HIGH);
    //Servo_1.write(Analogwert);
  } else {
    digitalWrite(Led_3,LOW);
  }
/*---------------------------- LED_3 ENDE----------------------------*/

/*---------------------------- AUSGABE DISPLAY ----------------------------*/
    //display.invertDisplay(true);
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(dsp_h1,dsp_v);
  display.print(Led_2_pwm);
  display.print("\t");
  display.println( Servo_1_pwm);
  display.display();
/*---------------------------- AUSGABE DISPLAY ENDE----------------------------*/
}

Zur Schaltung kann ich nur sagen, dass ich mit dem Steuerungssignal vom Empfänger an einen passenden PWM-Eingang des Arduino Nano gehe und von dort aus einmal über einen passenden Widerstand auf eine Led und zurück zum GND und einmal an den Steuerungseingang vom Servo, der +5V und GND direkt über das Breadboard bezieht.

Zudem habe ich die Eingänge mit einem Widerstand an GND angeschlossen.

Wenn es hilft [/code]kann ich gerne noch ein Foto von der Schaltung machen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.09.2019, 22:22 (Dieser Beitrag wurde zuletzt bearbeitet: 03.09.2019 22:25 von Tommy56.)
Beitrag #5
RE: PWM - Schwankungen kompensieren
Da waren noch ein paar Fragen, die auf Antwort warten.

Gruß Tommy

Edit: Es gibt keine PWM-Eingänge.
Deine Schaltungsbeschreibung hört sich abenteuerlich an. Male mal einen Schaltplan.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.09.2019, 23:04
Beitrag #6
RE: PWM - Schwankungen kompensieren
UPS .. das habe ich übersehen. Ich gehe davon aus, dass Du Dich auf die Taktfrequenz beziehst?

Ich weiß jetzt nicht ob Du das meinst, aber der Empfänger gibt nach meinem Wissen ein pwm Signal mit 20ms aus.

Ich versuche mal mit Fritzing einen Schaltplan zu erstellen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2019, 09:45
Beitrag #7
RE: PWM - Schwankungen kompensieren
Ich meinte wie schnell sich das Signal ändert und wie zeitnah auf die Änderung reagiert werden muss.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2019, 18:43
Beitrag #8
RE: PWM - Schwankungen kompensieren
Achso :-)

In dem Fall dieses Projektes ist das relativ, da nur selten Änderungen vom Signal her kommen.

Aber wenn ich später andere Projekte damit bedienen will , speziell bei der Flugsteuerung, dann ist eine schnelle Reaktion natürlich schon wichtig.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste