Sensor spinnt bei laufendem PKW Motor. Signal filtern?

Hallo,

ich habe ein Poti an einem Getriebe verbaut. Das Poti ist an einem Analogen Eingang angeschlossen.

Wenn das Auto aus ist, funktioniert alles bestens.
Sobald das Auto angemacht wird fängt alles an zu spinnen und ich kann an dem Poti eine schwankende Spannung messen, die bei ausgeschaltem Motor nicht da ist.

Wie kann ich das Signal filtern?

Danke!

petemanzel:
Wie kann ich das Signal filtern?

Deinem gesamten Versuchsaufbau (Schaltung, Leitungsführung) scheint die Elektromagnetische Verträglichkeit für den Automotive-Bereich zu fehlen.

Ursachen können sein:

  • Unfachmäßig ausgeführte und für automotive Anwendungen ungeeignete Stromversorgung
  • fehlende Abschirmungen bei Mikrocontroller-Schaltung und Signalleitungen
  • zu lange Signalleitungen bzw. falsch ausgelegte Signalpegel

Filtern kannst Du gestörte Signale natürlich immer, z.B. durch einen Tiefpassfilter, der das Signal zeitlich glättet, so dass anstelle stark schwankender Werte im Zeitverlauf ein mehr stabiler Messwert dabei herauskommt.

Ob der Messwert dann aber tatsächlich das ist, was Du eigentlich messen wolltest, oder ob es vielmehr ein Messwert basierend auf den unerwünschten EMV-Störungen ist, stünde dann noch auf einem anderen Blatt. Generell ist ein Auto ein total EMV-verseuchtes Gebiet. Das fängt mit mehreren tausend Zündfunken pro Minute an, bei denen in den Zündleitungen mehrere tausendmal pro Minute Spannungen von zigtausend Volt auf- und wieder abgebaut werden und hört bei der Drehstromlichtmaschine noch lange nicht auf, die bei der Stromerzeugung Stromimpulse von zig Ampere Stärke in Sekundenbruchteilen auf- und abbaut.

Hallo jurs,

vielen Dank für deine Antwort.

Du hast natürlich Recht. Ich habe noch nie etwas im Automotive-Bereich gebaut. Dies ist mein erstes Projekt.

  • Ich versorge den Arduino momentan über eine eigene 9V Batterie eben weil ich mir dachte das ich Probleme mit dem Bordnetz bekommen hätte.

  • Ich habe ein abgeschirmtes Kabel verwendet und GND an der Abschirmung des Kabels.

  • Die Leitung läuft vom Heckmotor durch das komplette Auto bis in die Mittelkonsole.

Was könnte ich deiner Meinung nach als erste Maßnahme versuchen?

petemanzel:
Was könnte ich deiner Meinung nach als erste Maßnahme versuchen?

Das hängt davon ab, was das eigentlich werden soll.

Wenn Du Vorschläge für irgendwas erwartest, solltest Du schon etwas mehr verraten als dass es mit einem Auto und einem Motor mit Getriebe zu tun hat und die Anzeige in der Mittelkonsole erfolgen soll.

Wie wäre es mit

  • Beschreibung?
  • Schaltung?
  • Code?

Sorry, natürlich kommen hier die Details:

Es handelt sich um ein sequentielles Getriebe an dem ich ein Poti verbaut habe um auszulesen, welcher Gang eingelegt ist.

Verschaltet ist alles sehr einfach. Der Arduino uno wird versorgt von einer 9V Blockbatterie.
Das Poti ist an den 5V und GND vom Arduino angeschlossen und der Schleifer geht an A2 vom Arduino.

Das ist der code, der das Signal auswertet und auf ein per SPI angeschlossenes Display ausgibt.

#include "U8glib.h"
U8GLIB_ST7920_128X64_4X u8g(10);

const int sensorGetriebe = A2;   // PIN vom Poti am Getriebe
int sensorWert = 0;          // Wert vom Poti

void problem(void) {
  u8g.setFont(u8g_font_unifontr);
  u8g.drawStr( 4, 90, "Kein");
  u8g.drawStr( 4, 110, "Sensor");
}

void drawr(void) {
  u8g.setFont(u8g_font_fub30r);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "R");
  u8g.undoScale();
}
void drawn(void) {
  u8g.setFont(u8g_font_fub30r);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "N");
  u8g.undoScale();
}

void draw1(void) {
  u8g.setFont(u8g_font_fub42n);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "1");
  u8g.undoScale();
}

void draw2(void) {
  u8g.setFont(u8g_font_fub42n);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "2");
  u8g.undoScale();
}

void draw3(void) {
  u8g.setFont(u8g_font_fub42n);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "3");
  u8g.undoScale();
}

void draw4(void) {
  u8g.setFont(u8g_font_fub42n);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "4");
  u8g.undoScale();
}

void draw5(void) {
  u8g.setFont(u8g_font_fub42n);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "5");
  u8g.undoScale();
}

void draw6(void) {
  u8g.setFont(u8g_font_fub42n);
  u8g.setScale2x2();
  u8g.drawStr(-1, 49, "6");
  u8g.undoScale();
}

void setup(void) {
  u8g.setRot270();              // Anzeige drehen
  u8g.setColorIndex(1);         // pixel on
  
 }

void loop() {
  // rileva il sensore del cambio:
  sensorWert = analogRead(sensorGetriebe);
  
if ( sensorWert  <= 700) { // Kein Sensor

  u8g.firstPage();  
  do {
    problem();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 756 && sensorWert <= 766) { //Rückwertsgang

  u8g.firstPage();  
  do {
    drawr();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 767 && sensorWert <= 777) { //Neutral 

  u8g.firstPage();  
  do {
    drawn();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 778 && sensorWert <= 788) { //1. Gang

    u8g.firstPage();  
  do {
    draw1();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 789 && sensorWert <= 799) { //2. Gang

    u8g.firstPage();  
  do {
    draw2();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 800 && sensorWert <= 810) { //3. Gang

    u8g.firstPage();  
  do {
    draw3();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 811 && sensorWert <= 821) { //4. Gang

    u8g.firstPage();  
  do {
    draw4();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 822 && sensorWert <= 832) { //5. Gang

    u8g.firstPage();  
  do {
    draw5();
    } while( u8g.nextPage() );
}

if ( sensorWert >= 833 && sensorWert <= 843) { //6. Gang

    u8g.firstPage();  
  do {
    draw6();
    } while( u8g.nextPage() );
}

  delay(20);
}

petemanzel:
Das Poti ist an den 5V und GND vom Arduino angeschlossen und der Schleifer geht an A2 vom Arduino.

Du musst das Signal des Potis filtern um Störer vom Arduino fernzuhalten und das Signal zu glätten.

a) da wo das Kabel auf die Elektronik stößt, einen Keramischen Kondensator 22nF zwischen Signal und GND. Das blockt hochfrequente Störer ab.

b) einen Längswiderstand R1 in die Signalleitung und danach einen Elko C1 vom Signal nach Masse. Das glättet das Signal. Mit R1 = 10kOhm und C1 = 22µF solltest du nach Gangwechsel innerhalb von 500ms ein stabiles Signal haben.

c) parallel zu C1 einen Kerko C2 = 100nF um die Eigeninduktivität des Elkos auszugleichen.

So solltest du ein halbwegs sauberes Signal haben.

Wenns immer noch zappelt, dann kann man auch anfangen über Softwarelösungen nach zudenken.
Zum Beispiel:

  • Das Signal über einen SW-Tiefpass filtern.
  • Gültigkeitsfenster: Es müssen erst 5(?) Messungen hintereinander in einem bestimmten Bereich liegen, damit das als gültig erkannt wird.
  • Peakunterdrückung: Wenn ein Signal mehr als x% vom Durchschnitt der letzten Werte abweicht, dann wird es ignoriert.

petemanzel:
Das ist der code, der das Signal auswertet und auf ein per SPI angeschlossenes Display ausgibt.

OK, also generell sieht Dein Code so aus, dass Du eine einzige Messung machst, den Wert verarbeitest und anzeigst und dann eine delay von 20 Millisekunden einfügst. Ungefähr so:

void loop() {
  int sensorWert = analogRead(sensorGetriebe);
  // tu was
  delay(20);
}

Erste Idee wäre: Statt der einen Messung am Anfang machst Du mehrere Messungen und berechnest daraus den Mittelwert. Dann machst Du eine Verarbeitung und Anzeige für den so ermittelten Mittelwert und läßt das delay dafür am Ende weg. Ungefähr so:

void loop() {
  long sensorSumme=0;
  #define SAMPLES 200
  for (int i=0; i<SAMPLES; i++) // Signal mehrmals messen, ca. 20 Millisekunden lang
  {
    sensorSumme+=analogRead(sensorGetriebe);
  }
  int sensorWert = sensorSumme/SAMPLES; // Mittelwert bilden
  // tu was
  // ohne delay
}

Da ein "analogRead" ca. 100 Mikrosekunden lang dauert, kannst Du in 20 Millisekunden ca. 200 Messwerte bekommen. Ungefähr.

Stabilisiert sich der Anzeigewert dabei?

Wenn nicht, kannst Du softwaretechnisch nicht mehr viel machen und brauchst einen anderen Hardwareaufbau für Deine Schaltung.

BTW: Weiter oben hast Du geschrieben "Ich habe ein abgeschirmtes Kabel verwendet und GND an der Abschirmung des Kabels". Die Abschirmung des Datenkabels müßte zuallererst an der Fahrzeugmasse GND des Fahrzeugs angeschlossen sein. Und zwar an beiden Enden der Kabelabschirmung, wenn es ein längeres Kabel ist. Und dann kann sie zusätzlich auch an GND vom Arduino angeschlossen sein.

Die von guntherb vorgeschlagenen Schaltungsänderungen zur Filterung von hochfrequenten Störungen solltest Du auch dringend in Betracht ziehen.

Danke Euch beiden. Werde beides Ausprobieren und berichten!

Hab den Filter von guntherb verbaut und jetzt bekomme ich ein brauchbares Signal mit minimalen Schwankungen. Danke dafür.

Jetzt habe ich aber das Problem, das in meinem Display gelegentlich Hieroglyphen auftauchen und seltsame Linien durch das Bild laufen und das ganze System nur mit Aussetzern funktioniert.

Muss ich da noch etwas entstören/filtern?

Wieviel Ohm hat eigentlich das Poti? Je Hochohmiger, desdo störanfälliger wird der Aufbau! 1 Megaohm ist zu hochohmig! Mehr als 10 Kiloohm würde ich nicht verbauen.
Die Störungen auf dem Display haben aber eher ihre Ursache in der Stromversorgung. Verwendest du einen Arduino, oder einen Aufbau mit einem "nackten" ATMEGA auf Lochraster, oder einer selbstentworfenen Leiterplatte? Der ATmega328 benötigt so dicht wie möglich am IC einen 100nF Keramikkondensator und einen 47µF Elko. Direkt an den Stromversorgungspins des Displays ist die selbe Kombination nicht von Schaden.
Wie gewinnst du aus den 9V die 5V? Mit einem 7805? Vor- und nach den 7805 gehört ebenfalls jeweils ein 100nF KerKo und jeweils ein Elko. Am Eingang würde ich 220µ-1000µ wählen und am Ausgang 100-470µ. Das hängt immer mit von der sonstigen Last ab. Nur wenn der Spannungsstabi wenige cm neben dem Controller sitzt, langt der Ausgangselko von 7805 mit für den µC

petemanzel:
Jetzt habe ich aber das Problem, das in meinem Display gelegentlich Hieroglyphen auftauchen und seltsame Linien durch das Bild laufen und das ganze System nur mit Aussetzern funktioniert.

Muss ich da noch etwas entstören/filtern?

Wie lang sind denn jetzt die Signalleitungen zwischen Arduino-Board und LCD-Display?
Wie sind diese ausgeführt? Abgeschirmt? Und ggf. wo die Schirmung angeschlossen?

Hallo, es ist ein "Bare minimum" - Arduino a auf einer Lochrasterplatine mit einem LM7805, 10µF im Eingang und 100µF im Ausgang.

Alles Bauteile sind eng beieinander.
Auf der selben Platine ist jetzt auch der guntherb vorgeschlagen Filter.
Die Leitung zum Display ist 50cm lang und habe ich aus einem cat5 Kabel gefertigt.
Die Abschirmung des Kabels ist nicht angeschlossen.

petemanzel:
LM7805, 10µF im Eingang und 100µF im Ausgang.

Das ist die ganze AVR-Schaltung?
Keine 100 nF Kerkos in der Schaltung am AVR?
Minimum wären ja wohl mindestens 2 Stk. 100 nF Kerkos am AVR, davon einer zwischen VCC und GND und einer zwischen AVCC und GND, beide jeweils möglichst dicht am Controller untergebracht. Sogenannte Abblockkondensatoren.

petemanzel:
Alles Bauteile sind eng beieinander.
...
Die Leitung zum Display ist 50cm lang

"Eng beieinander" und "50 cm" klingt nach einem Widerspruch in sich. Für die schnellen Signale auf den Steuerleitungen zum Displays ist 50cm keinesfalls "eng beieinander".

petemanzel:
Der Schirm ist nicht angeschlossen.

Versuche mal ob es sich verbessert, wenn Du die Kabelabschirmung an Fahrzeugmasse anschließt.

Hallo jurs,
danke für Deine kostbaren Tips!

Ich meinte mit eng beieinander die Bauteile auf der Lochrasterplatine. Das Display habe ich über dieses 50cm Kabel abgesetzt um besser an den AVR zu kommen, da ich gerne mit der Zeit weitere Sensoren verbauen möchte.

Ich habe mich dieses Wochenende mal nach Lösungen umgesehen um eine vernünftige Spannungsversorgung für den Atmega zu erstellen.

Diese beiden Vorschläge habe ich mir dabei rausgesucht. Welcher ist deiner Meinung nach der bessere Weg?
Kosten beiden ungefähr das selbe!

oder

http://www.blafusel.de/misc/spannung.html
(Step-Down Schaltnetzteil für kleine Lasten (mit Störsignalunterdrückung im Fahrzeug))

100nF Kerkos kommen dann natürlich auch mit an den AVR.

Danke!

petemanzel:
Diese beiden Vorschläge habe ich mir dabei rausgesucht. Welcher ist deiner Meinung nach der bessere Weg?
Kosten beiden ungefähr das selbe!

Keine Ahnung, für Spezialfragen zu Schaltungen im Automotive-Bereich bin ich der falsche Ansprechpartner.
Dazu könnte guntherb hier wohl noch am meisten beitragen.

Ich habe nur mal gegoogelt und folgende Schaltung gefunden, die im Automotive-Bereich geeignet sein soll, mit den Funktionen Sicherung, Verpolungsschutz, Überspannungsschutz und Transientenschutz:

                                   SB130
BAT+  --Sicherung--+----+--47uH--+--|>|--+--- 7805 etc.
                   |    |        |       |
           +--|>|--+  S14K14  P6KE22A  10uF
           |            |        |       |
BAT-  -----+------------+--------+-------+---

Die Schaltung benötigt neben der Überstromsicherung noch eine Universaldiode, einen Varistor, eine Induktivität, zwei Spezialdioden, einen Kondensator, und danach kannst Du dann den 7805 Spannungsregler reinhängen, der Dir dann mit der üblichen Ausgangsbeschaltung eine 5V Spannung im Kfz liefert.

jurs:
Dazu könnte guntherb hier wohl noch am meisten beitragen.

Ich wurde gerufen?
8)

Die Dimensionierung hängt vor allem am Strom, der benötigt wird. Wieviel Strom brauchst du denn?
Letzlich ist jeder Spannungsregler geeignet. Die als "automotive" gekennzeichneten durchlaufen eine schärferes Qualifikationsprogramm, das dürfte für den privaten Anwender eher unwichtig sein - solange du nicht vorhast ein paar Hundertausend Elektroniken aufzubauen. :wink:

Was aber alle Spannungsregler auszeichnet ist eine maximale Eingangsspannung. Meist 30V-60V je nach Typ (steht im Datenblatt unter Maximum Ratings).

Im KFZ-Bordnetz sind aber Spannungspulse bis über 100V unterwegs - auch negative! Vor diesen Pulsen musst du den Spannungsregler schützen, die verträgt er nicht.

Du brauchst also:
- einen Verpolschutz
im einfachsten Falle einfach eine Längsdiode. Bei Strömen bis 1A kein Problem. Sollte aber eine schnelle Diode sein, also keine 1N400x, sondern eine fast recovery Diode (EGP20, STTH1R04, etc), oder eine Schottky Diode mit genügend hoher Sperrspannung (> 400V)

- einen Überspannungsschutz
zum Beispiel eine Suppressordiode (auch TVS-Diode genannt), z.B die 1.5KE18

- einen Spannungsregler
deiner Wahl, linear oder DC/DC, je nach Strombedarf. Wichtig: der Überspannungsschutz muss so dimensioniert sein, dass die maximale Eingangsspannung des Reglers nicht überschritten wird.
Die Beschaltung des Spannungsreglers (Kondensatoren an Ein- und Ausgang) müssen jeweils dem Datenblatt entnommen werden.

Empfehlenswert:

  • Sicherung am Eingang zum Schutz vor Kabelbrand
  • EMV-Kondensatoren: direkt an der Eingangsklemme einen Kerko ca. 10nF-22nF/500V, nach dem Verpolschutz ggf noch einen 100nF / 200V

Letztlich ist das Ganze eine Frage der Statistik.
Du kannst einen schnöden 7805-regler direkt ans Bordnetz anschliessen, und es wird funktionieren.
Aber irgendwann kommt ein Überspannungspuls und dann ist er kaputt. Wenn du Glück hast, nur der Regler, wenn du Pech hast, auch alles was hinten dran hängt.
Das Auftreten von Überspannungsimpulsen hängt oft von Zufällen und Alterung ab. Je mehr Aufwand du in die Schutzschaltung steckst, um so höher wird die Wahrscheinlichkeit, dass deine Elektronik lange lebt.

Mit dem oben skizzierten sollte das ausreichend sein.

letztlich ist es eine Abwandlung von Jurs Schaltung. Nur brauchts die Drossel und den Varistor meines Erachtens nicht für private Anwendungen.

Guten Morgen!

Neues:
Ich habe nun eure Vorschläge für die Spannungsversorgung umbesetzt und die ist jetzt wirklich superstabil. Danke! Danke! Danke!

Ich habe keine Störungen im Display bis ich das Kabel vom Sensor aufstecke, dann laufen wieder komische Streifen durchs Display und alles fängt an zu spinnen.

Ich habe die Abschirmung des Kabels an GND des AVRs und an der Karosserie angeschlossen und wie hier bereits vorgeschlagen mit dem 10k Wiederstand dem ELKO und den zwei KERKOS beschaltet.

Was kann ich da noch Ändern?

Danke!

petemanzel:
Ich habe die Abschirmung des Kabels an GND des AVRs und an der Karosserie angeschlossen...

Ist der GND des AVRs mit der Fahrzeugmasse verbunden?
Dann hast du dir mit der 2-Seitig angeschlagenen Schirmung eine prima Masseschleife gebaut.
lege die Schirmung lieber nur beim AVR auf GND und lass' das andere Ende offen. Alternativ kannst du das andere Ende mit einem Widerstand (ca 200-500 Ohm) auf Fahrzeugmasse legen.

petemanzel:
... und wie hier bereits vorgeschlagen mit dem 10k Widerstand dem ELKO und den zwei KERKOS beschaltet.

Hast du den ersten Kerko wirklich direkt am Eingang des Kabels, mit möglichst kurzen Leitungen?
Es geht darum, dass über das Kabel eingefangene HF-Störungen sofort kurzgeschlossen werden, ehe sie sich über der Platine verbreiten können.

Hallo Gunther!

Das verwendete Kabel ist ein zweiadriges Kabel plus Abschirmung aus Kupfergeflecht. Die Abschirmung habe ich auf GND am AVR und dann auf der AVR Seite mittels einer Kabelbrücke auf die Karosserie aufgelegt.

Ich habe den Kerko auf der Unterseite der Platine direkt an die Pins des Steckers gelötet (Signal-GND) wo das Signal-Kabel ankommt.

petemanzel:
Ich habe den Kerko auf der Unterseite der Platine direkt an die Pins des Steckers gelötet (Signal-GND) wo das Signal-Kabel ankommt.

Das klingt gut!

petemanzel:
Die Abschirmung habe ich auf GND am AVR und dann auf der AVR Seite mittels einer Kabelbrücke auf die Karosserie aufgelegt.

Dann hast du also eine Verbindung von Schirm auf GND, und auf der Poti-Seite ist der Schirm offen? Gut.

Und der AVR GND hat eine Verbindung auf die Karosserie.
Hast du über die Spannungsversorgung auch eine Verbindung von GND auf Batterie-Minus? dann hättest du den GND auf zweit verschiedene Massepunkte des Fahrzeugs verbunden: Karossierie und elektrische Fahrzeugmasse. Das tut nicht gut. Mach' doch mal lieber die Brücke zur Karosserie wieder weg.

Das Problem: EMV ist keine exakte Wissenschaft. Das hat viel mit Magie zu tun. Also immer wieder probieren.
Z.B. die Schirmung nicht hart auf GND legen, sondern über einen Kerko, nur als HF-Schirm. Obs hilft kann dir keiner sagen.

Mach' doch mal ein paar Fotos.