Ich habe ein kleines Problem und benötige eure Hilfe.
Ich nutze den uC STM32L431CBT6 und damit steuere ich einen Motor mit einer PWM freq=4kHz. Warum es 4kHz sind, ist erstmal egal. Das Problem tritt auch mit 20kHz auf.
Nun den Motor steuere ich also mit der TIM1 PWM CH1 am Pin PA8.
Mit dem Timer15 CH2 möchte ich die Geschwindigkeit messen, indem ich die Zeit zwischen 2 Pulsen messe und daraus die Geschwindigkeit errechne. Dazu habe ich den Timer15 CH2 am Pin PB15 als Input Capture Mode definiert und den Input Capture mit dem TI2 (fallende Flanke) verbunden. Das funktioniert soweit, wenn ich den Pin mit einem externen Signal 5V (PB15 ist FT 5V tolerant) beaufschlage, löst dieses Signal auch einen Interrupt aus - ich lasse dazu im Interrupt probeweise einfach eine LED toggeln - und schreibt den aktuellen Counterwert in das Datenregister 2. Das funktioniert soweit und ist alles ok.
Mein Problem ist jetzt aber, dass auch die LED dann toggelt, wenn ich die PWM, sprich den Tastgrad, des TIM1 CH1 verändere bzw. wenn die PWM läuft.. Der PIN der zufälligerweise daneben liegt, bekommt so ein Fehlsignal und löst den Interrupt aus..
Leider kann ich hardwaretechnisch nichts mehr ändern und einen anderen Pin wählen. So ein Problem auf einem uC hatte ich noch nie. Kann es wirklich sein, dass das PWM Signal den Input Capture von TIm15 so stört oder ist da hardwaremässig, layoutmässig etwas faul?
Ich bin um jeden Ratschlag sehr dankbar.
Liebe Grüsse
Die heute üblichen harten Schaltflanken eines portpins können über weninge pF koppelkapazität kurze Nadelimpulse einkoppeln auf offene benachbarte Leitungen, durchaus auch mit logischen pegeln.
Die heute üblichen harten Schaltflanken eines portpins können über
weninge pF koppelkapazität kurze Nadelimpulse einkoppeln auf offene
benachbarte Leitungen, durchaus auch mit logischen pegeln.
Ja schon, aber wenn das überall so leicht geht, dürfte ja kein PWM Sinal neben einem anderen Pin liegen, was ja bei einem uC unmöglich ist.
Die heute üblichen harten Schaltflanken eines portpins können über
weninge pF koppelkapazität kurze Nadelimpulse einkoppeln auf offene
benachbarte Leitungen, durchaus auch mit logischen pegeln.
Ja schon, aber wenn das überall so leicht geht, dürfte ja kein PWM Sinal
neben einem anderen Pin liegen, was ja bei einem uC unmöglich ist.
Was kann ich gegen dieses Phänomen machen?
So ein GPIO-Pin ist sehr hochohmig, d.h. es fließt nur wenig Strom. Hänge mal einen 1k Widerstand gegen GND an den Pin. Dann muss die Störung gegen den erhöhten Strom anarbeiten, und das sollte ihr dann nicht mehr so einfach gelingen.
der Pin ist mit dem Signal von einem Hallsensor verbunden
Mit welchem Hallsensor ist der Pin verbunden? Wenn du eine Schaltung diskutieren willst, dann musst du uns ihren Plan zeigen. Über phantastische Luftschlösser zu diskutieren bringt nichts.
Versuche erst einmal die GPIO Speed des PWM Ausganges zu verringern. Das verlangsamt die Schaltflanke und verringert das Uebersprechen. Der Eingang braucht auch eine Pull(Up|Down)
Hallo zusammen
Vielen Dank für die vielen Ratschläge.
Ich habe heute bereits einige Dinge probiert. Ich gehe kurz auf jeden Beitrag von euch ein. Wobei ich sagen muss, dass ich die erste Platine versehentlich zerstört bzw. den uC verschossen habe... Dann habe ich einfach ein neues uC Board genommen und habe den Eindruck, dass ich jetzt irgendwie andere Probleme habe wie vorher... Nämlich mit dem 1:1 Code reagiert der Input Capture jetzt seeehr seeeehr langsam. Das kann ich überhaupt nicht brauchen bei den 15 Pulsen pro Undrehung.. Wenn ich 3 mal schnell hintereinander mit einem externen Trigger auf den Pin gehe, reagiert der nur einmal...
Mein Problem ist jetzt aber, dass auch die LED dann toggelt, wenn ich
die PWM, sprich den Tastgrad, des TIM1 CH1 verändere bzw. wenn die PWM
läuft
Diese Formulierung deutet darauf hin, dass "etwas komisches passiert".
Kannst Du sagen, wie groß die PWM ist und wie groß das eingekoppelte
Blinken?
Also die PWM Frequenz ist 4.096kHz, die habe ich einfachheitshalber auf den 12-bit ADC Wert angepasst, damit ich die erstmal direkt übergeben kann. Es ist eine 12V PWM.
Kannst Du Versuchesweise nur den Ausgang abschalten, ob es dann immer
noch auftritt?
Den PWM Ausgang habe ich abgeschaltet, dann habe ich das Problem nicht mehr und nur eine fallende Flanke löst den input capture aus, was auch so passt, auch wenn der Input Capture wie oben bereits gesagt, vieeel zu langsam reagiert für 15 Pulse pro Umdrehung...
Wenn die PWM läuft funktioniert der Input Capture auf einmal nicht mehr...
Ich habe auch versucht die PWM nicht auszuschalten und den Input Capture von TIM15 CH2 auf CH1 zu legen, sprich von PB15 auf PB14 zu legen. Dann hätte ich dann gemäss Bild ganz oben in meinem ersten Beitrag einen unbenutzten Pin zwischen TIM1 CH1 und TIM15 CH1.
Der Input Capture auf dem CH1 funktioniert so leider gar nicht, aber ich bin mir hier noch nicht sicher, ob ich im Code irgendwo etwas vergessen oder übersehen habe. Das prüfe ich noch..
Ist es Regelmäßig oder schwankt es mit der Zeit ohne dass sich sonstwas
ändert?
Also die LED toggelte beim jetzt kaputten Board nicht wirklich, sondern blinkte sehr schnell, indem sie ein wenig dunkler flackerte. Also der Interrupt wurde sehr schnell aufgerufen.
Ansonsten hört es sich eher nach Inter-Interrupt-Problemen an.
Ja eigentlich dürfte es nicht sein, denn der Timer 1 wurde mit keinem Interrupt initialisiert. Es ist mir klar, dass die Timer 1 und 15 einen gemeinsamen Interrupt haben. Aber auch wenn der Timer 1 aus irgend einem Grund in den Interrupt springt, sei es so, dass dieser so konfiguriert wurde, dann darf er doch, wenn er in den Interrupt springt, nicht einfach meinen Counterwert im Datenregister 2 von TIM15 aktualisieren (TIM15 Input Capture).. Da bringt es mir auch nichts, wenn ich erkennen würde, welcher Timer gerade den Interrupt aufgerufen hat..
Die heute üblichen harten Schaltflanken eines portpins können über
weninge pF koppelkapazität kurze Nadelimpulse einkoppeln auf offene
benachbarte Leitungen, durchaus auch mit logischen pegeln.
Ja schon, aber wenn das überall so leicht geht, dürfte ja kein PWM Sinal
neben einem anderen Pin liegen, was ja bei einem uC unmöglich ist.
Was kann ich gegen dieses Phänomen machen?
So ein GPIO-Pin ist sehr hochohmig, d.h. es fließt nur wenig Strom.
Hänge mal einen 1k Widerstand gegen GND an den Pin. Dann muss die
Störung gegen den erhöhten Strom anarbeiten, und das sollte ihr dann
nicht mehr so einfach gelingen.
fchk
Ich bin mir nicht mehr sicher, ob das noch notwendig ist, da ich jetzt ein neues Board verwende und die Probleme nicht mehr 100%ig die gleichen sind... warum auch immer.
Wie meinst du das mit offenem Eingang, der Pin ist mit dem Signal von
einem Hallsensor verbunden, daher ist er ja nicht offen.
Hallsensor ist Open Collector und du hast den Pullup aktiv?
Dann weißt du wo das Problem ist...
Du hast Recht, aber ich habe mich da etwas falsch ausgedrückt, also später sollte der Hallsensor mit Pullup an den Pin kommen und den externen Trigger a,,darstellen. Noch habe ich es mit 5V manuell immer ausgelöst für Testzwecke.
der Pin ist mit dem Signal von einem Hallsensor verbunden
Mit welchem Hallsensor ist der Pin verbunden? Wenn du eine Schaltung
diskutieren willst, dann musst du uns ihren Plan zeigen. Über
phantastische Luftschlösser zu diskutieren bringt nichts.
Ich habe ihn oben mal angehängt. Also eigentlich ist da nichts dran, als nur 0 Ohm Widerstände an jedem Pin und die Signale sind alle auf einen Stecker geführt.
Jeder GPIO hat ein SPEED Register. Für die meisten Anwendungen
reicht
die langsamste Einstellung (= nicht so steile Flanken) leicht.
Manche Timer haben ein digitales Filter zwischen Pin und Input Capture.
Alle Pins sind auf Low Frequenz eingestellt.
Was genau bringt ein digitales Filter, wenn der Input Capture auf eine Flanke schaut? Aktuell habe ich den Filter auf 0x00, also kein Filter.
Versuche erst einmal die GPIO Speed des PWM Ausganges zu
verringern. Das
verlangsamt die Schaltflanke und verringert das Uebersprechen. Der
Eingang braucht auch eine Pull(Up|Down)
Ich muss das nochmals testen, ob die PWM beim neuen Board auch stört und einen Interrupt auslöst. Die PWM hat immer gestört, wenn der Tastgrad geändert wurde, heute hatte ich ihn bloss konstant eingestellt und kam nicht mehr dazu ihn zu verändern.
Nun im Moment scheint es so als hätte ich jetzt ein Haufen Probleme, nicht nur einen. Ich habe heute sogar alle Peripherien rundherum abgeschaltet und nur die PWM und den Input Capture laufen lassen.
Es ist auch dann alles so wie ich es oben beschrieben habe..
Ich meine Schaltungstechnisch und layouttechnisch kann man ja beim uC Board wirklich nicht viel falsch machen, was die beiden Pins angeht oder???
Also eigentlich ist da nichts dran, als nur 0 Ohm Widerstände
an jedem Pin und die Signale sind alle auf einen Stecker geführt.
Das ist der Fehler. Du musst alle Leitungen entsprechend ihrer Anwendung vor allem Schützen, was zu erwarten ist. Mindestens gegen den Einfluss von elektromagnetischen Feldern (Radiowellen) die jede Leitung sowohl abstrahlt als auch empfängt.
Im KFZ Umfeld sind solche Schaltungen besonders aufwändig, damit es zuverlässig funktioniert. Dazu gibt es eigene Fachartikel/Bücher, auf die hier in einigen Diskussionen verwiesen wurde. Ich denke, das findest du am besten mit Google.
Nämlich mit dem 1:1 Code reagiert der Input Capture jetzt seeehr
seeeehr langsam. [...] Wenn ich 3 mal schnell hintereinander mit
einem externen Trigger auf den Pin gehe, reagiert der nur einmal...
später sollte der Hallsensor mit Pullup an den Pin kommen und den
externen Trigger a,,darstellen. Noch habe ich es mit 5V manuell
immer ausgelöst für Testzwecke.
Wie erzeugst du den Trigger? 5V aus einem Funktionsgenerator oder berührst du mit einem Kabel den Steckerpin? Gibt es da einen Pull-Down? Wenigstens den internen?
Wie meinst du das mit offenem Eingang, der Pin ist mit dem Signal von
einem Hallsensor verbunden, daher ist er ja nicht offen.
Dann ist wohl der unbekannte Hallsensor zu hochohmig.
Setze einen Treiber dazwischen, z.B. 74LV1T34.
Ich setze mal voraus, PWM und Sensor gehen über einzeln geschirmte Kabel und nicht über benachbarte Adern in einem Flachbandkabel.
Also eigentlich ist da nichts dran, als nur 0 Ohm Widerstände
an jedem Pin und die Signale sind alle auf einen Stecker geführt.
Das ist der Fehler. Du musst alle Leitungen entsprechend ihrer Anwendung
vor allem Schützen, was zu erwarten ist. Mindestens gegen den Einfluss
von elektromagnetischen Feldern (Radiowellen) die jede Leitung sowohl
abstrahlt als auch empfängt.
ok verstehe, aber der uC hat doch intern eine Diodenbeschaltung nach GND und VCC. Man könnte jetzt 33 Ohm Widerstände in Serie platzieren, aber ichbfrage mich ob das wirklich notwendig ist, denn das Nucleo Board von ST hat auch alle Pins nackt auf den Stecker geführt. Die haben auch keine aufwändige Beschaltung.
Ich sehe keine Beschaltung. Das sind alles offene Pins.
Jetzt wäre ein vollständiges Schaltbild vielleicht doch hilfreich...
ich poste nachher noch die gesamte Schaltung.
Wenn die Pins die meiste Zeit offen sind, hast du einen
Zufallsgenerator.
Markus K. schrieb:
Nämlich mit dem 1:1 Code reagiert der Input Capture jetzt seeehr
seeeehr langsam. [...] Wenn ich 3 mal schnell hintereinander mit
einem externen Trigger auf den Pin gehe, reagiert der nur einmal...
später sollte der Hallsensor mit Pullup an den Pin kommen und den
externen Trigger a,,darstellen. Noch habe ich es mit 5V manuell
immer ausgelöst für Testzwecke.
Wie erzeugst du den Trigger? 5V aus einem Funktionsgenerator oder
berührst du mit einem Kabel den Steckerpin? Gibt es da einen Pull-Down?
Wenigstens den internen?
Der Hallsensor TLE 4905L ist ein open collector. Da habe ich einen 1k pullup nach 5V drin. Aber zum Testen habe ich ein Kabel genommen und mit dem den Pin berührt. Es sind 5V vom Labornetzteil.
Wenn ich den Sensor nämlich mit dem Pin verbinde ist das Signal ständig low und der Sensor funktioniert nicht. Deshalb erstmal manuell getestet. Ich wollte erstmal dass der Input Capture funktioniert.
Wie meinst du das mit offenem Eingang, der Pin ist mit dem Signal von
einem Hallsensor verbunden, daher ist er ja nicht offen.
Dann ist wohl der unbekannte Hallsensor zu hochohmig.
Setze einen Treiber dazwischen, z.B. 74LV1T34.
Ich setze mal voraus, PWM und Sensor gehen über einzeln geschirmte Kabel
und nicht über benachbarte Adern in einem Flachbandkabel.
Der uC hat Stecker. Diesen stecke ich auf einen anderen Print drauf. Aber zum Testen und programiieren liegt er nur da auf dem Tisch so wie halt ein Nucleo Board.
Ich programmiere mal das Nucleo Board und schaue mal ob dieser auch solche Probleme hat.
zum Testen habe ich ein Kabel genommen und mit
dem den Pin berührt. Es sind 5V vom Labornetzteil.
Ohne Pull-Down wird der Pin nur durch Leckströme wieder Low, das würde "viel zu langsam" erklären. Aber auch mit Pull-Down erzeugst du undefiniert viele Flanken, selten auch mal genau eine. Du bist ja kein Quecksilberschalter, mit deinem Kabel.
Man könnte jetzt 33 Ohm Widerstände in Serie platzieren, aber
ich frage mich ob das wirklich notwendig ist, denn das Nucleo Board
von ST hat auch alle Pins nackt auf den Stecker geführt.
Das Nucleo muss vor allem billig sein, das ist kein Maßstab. Du hast ja schon die 0R Widerstände. Wenn du da (bei Eingangspins; ganz ungefähr) 10k einbaust, hast du schon die halbe "aufwendige Beschaltung". Aber erstmal geht es drum, den Eingang überhaupt korrekt anzusteuern.
zum Testen habe ich ein Kabel genommen und mit
dem den Pin berührt. Es sind 5V vom Labornetzteil.
Ohne Pull-Down wird der Pin nur durch Leckströme wieder Low, das würde
"viel zu langsam" erklären. Aber auch mit Pull-Down erzeugst du
undefiniert viele Flanken, selten auch mal genau eine. Du bist ja kein
Quecksilberschalter, mit deinem Kabel.
Also das musst du mir bitte nochmals erklären. Meine Zeit als Elektroniker ist über 16 Jahre her und ich habe mich seit langem wieder einmal an ein Hobbyprojekt gewidmet.
Wie meinst du das mit dem Pull-Down? Braucht es den zusätzlich zum Pull-up einen PullDown am Kabel gegen GND? Und wo fliessen Leckströme dann genau?
Also der uC Input Capture hat keinen Pull-Down, was ich so gesehen habe. Wenn ich den Pin mit Pull-Down konfiguriere, bräuchte ich dann keinen Pull-Down mehr am Kabel, richtig?
Aber wo fliessen jetzt ohne Pulldown Leckströme? Siehe Pull-Down bild
Als Daumenregel: In einer reinen Digitalschaltung sollte jeder Pin in jedem Zustand irgendwie niederohmig auf Low oder High sein.
Bei Ausgängen sorgt der Controller nach der Initalisierung selbst dafür.
Bei Eingängen muss die Gegenseite dafür sorgen. Wenn die Gegenseite allerdings absteckbar ist, muss meine Schaltung selbst für diesen Zustand einen "irgendwie niederohmingen" Ersatz bieten.
Wie hoch die "irgendwie niederohmige" maximale Impedanz sein darf, ist situationsabhänging. In vielen Fällen ist ≤22kOhm eine gute Wahl, aber der optimale Wert ist viel Erfahrungssache.
Wenn ich den Pin mit Pull-Down konfiguriere, bräuchte ich dann keinen
Pull-Down mehr am Kabel, richtig?
Jain. Es ist besser als nichts, aber meist sind die internen Pullup/down etwas zu hoch (50kOhm o.ä.).
Wenn ein Pullup angeschlossen ist, brauchst Du auch keinen Pulldown. Wenn aber der Sensor einen Pullup enthält, aber nicht nageschlossen ist, hast Du eben einen offenen Eingang. Da die Eingänge sehr hochohmig sind, erzeugt jedes über die Luft ankommene Elektrönchen irgendwelche undefinierten Pegel.
Deshalb macht man den Pullup fest in die Schaltung rein und läßt den am (absteckbaren) Sensor weg.
Wenn ich den Pin mit Pull-Down konfiguriere, bräuchte ich dann keinen
Pull-Down mehr am Kabel, richtig?
Jain. Es ist besser als nichts, aber meist sind die internen Pullup/down
etwas zu hoch (50kOhm o.ä.).
Wenn ein Pullup angeschlossen ist, brauchst Du auch keinen Pulldown.
Wenn aber der Sensor einen Pullup enthält, aber nicht nageschlossen ist,
hast Du eben einen offenen Eingang. Da die Eingänge sehr hochohmig sind,
erzeugt jedes über die Luft ankommene Elektrönchen irgendwelche
undefinierten Pegel.
Deshalb macht man den Pullup fest in die Schaltung rein .
Ok der Pullup müsste dann alsonauf dem UC Board sein und nicht auf dem anderen Print wo das uC Board aufgesteckt ist. Verstanden.
Aber dann frage ich mich warum der Sensor mit dem 1k Pullup das Signal auf Low zieht und nicht mehr funktioniert.
Aber gut, ich habe jetzt mal ein Haufen Dinge zu testen erstmal.. Ich melde mich dann wieder.
Sofern wir hier ein Problem mit kapazitiver Überkopplung haben, gilt
-es werden Nadelimpulse übertragen
-deren Amplitude ist in erster Linie eine Frage der Eingangskapazität des Porteinganges, denn wir haben einen kapazitiven SpannungsTeiler zu betrachten.
-jegliche Art von pull-up oder -down Widerständen verkürzt zwar die Dauer dieser Nadelimpulse, nicht aber deren Amplitude.
Um die Amplitude der Nadelimpulse zu verkleinern, reicht demnach ein kleiner Kondensator (100p~1n) direkt vom gestörten Eingang nach GND.
Davon mal abgesehen halte ich ein Software-Problem durchaus für möglich - mit Interrupts kann man nun mal auch eine ganze Menge falsch machen.
-jegliche Art von pull-up oder -down Widerständen verkürzt zwar die
Dauer dieser Nadelimpulse, nicht aber deren Amplitude.
Das deckt sich leider gar nicht mit meinem Verständnis, wie Spannungsteiler funktionieren.
Wenn das du/dt meines Störsignals fix ist, würde eine Verkleinerung eines Pull-Up/Downs selbstverständlich auch die Amplitude des Störsignals reduzieren.
das Nucleo Board von
ST hat auch alle Pins nackt auf den Stecker geführt. Die haben auch
keine aufwändige Beschaltung.
Das ist ja auch ein Bastelbrett, bei dem niemand weiß was da später angeschlossen wird.
Der Pullup für eine Taste kann den ADC unnütz machen, also lassen die die Pins nackend, damit der Testbastler beides ausprobieren kann.
Du brauchst recht nah am Chip einen Pull (je nach Funktion up oder down), mit durchaus nur wenigen Kiloohm.
Ich würde einen kleinen Kondensator nach GND ansetzen, der fängt schon viel Einstrahlung und Funk ab. So 1n, je nach Frequenz auch ein bissel weniger.
Und es schadet meist auch nicht, einen Serienwiderstand einzubauen, der z.B. bei unterschiedlichen Versorgungsspannungen oder evtl. berührbaren Steckern verhindert, das die internen Dioden abbrennen.
Noch habe ich es mit 5V manuell immer
ausgelöst für Testzwecke.
Nicht entkoppelt, und nicht niederohmig in den Chip geführt.
Das sind alles Antennen, auch und gerade mit dem internen Pull.
Markus K. schrieb:
Ich meine Schaltungstechnisch und layouttechnisch kann man ja beim uC
Board wirklich nicht viel falsch machen, was die beiden Pins angeht
oder???
Offensichtlich schon... ;)
Markus K. schrieb:
das Nucleo Board von
ST hat auch alle Pins nackt auf den Stecker geführt. Die haben auch
keine aufwändige Beschaltung.
Das ist ja auch ein Bastelbrett, bei dem niemand weiß was da später
angeschlossen wird.
Der Pullup für eine Taste kann den ADC unnütz machen, also lassen die
die Pins nackend, damit der Testbastler beides ausprobieren kann.
Du brauchst recht nah am Chip einen Pull (je nach Funktion up oder
down), mit durchaus nur wenigen Kiloohm.
Ich würde einen kleinen Kondensator nach GND ansetzen, der fängt schon
viel Einstrahlung und Funk ab. So 1n, je nach Frequenz auch ein bissel
weniger.
Und es schadet meist auch nicht, einen Serienwiderstand einzubauen, der
z.B. bei unterschiedlichen Versorgungsspannungen oder evtl. berührbaren
Steckern verhindert, das die internen Dioden abbrennen.
Ja ich werde deinen Tipp und die der anderen anwenden. Es sind jetzt so viele Ratschläge gekommen. das muss ich erst mal verarbeiten. 🤣👌
Den Ausgang und damit das Uebersprechen ueber die GPIO Settings zu
bremsen hast Du noch nicht probiert?
Hallo Uwe, ja der Pin von Tim1 PWM war bereits auf der langsamsten Stufe eingestellt. Da habe ich nichts machen müssen. Falls du es mitbekommen hast, habe ich mit dem neuen Board gefühlt andere Probleme.
Hey Leute
Vielen Dank euch allen für eure Tipps. Ich habe nun sichergestellt den PWM Pin mit Low Speed zu betreiben.
Hallsensor mit 1k Pullup.
Seriell habe ich beim Hallsensor 1k reingemacht. Damit sinds mit 5V 5mA max.
C gegen GND 1n
Pulldown habe ich beim PB15 also intern im uC gewählt und extern 2.2k aber nicht bestückt, damit ich über diesen ca. 3V3 als Sensorsignal erreiche. Mit dem internen sind es 5V. Dieser ist offenbar tatsächlich viel hochohmiger.
Die Pullups und downs kommen aber nicht auf das uC Board, weil es da mit den alternativen Pinfunktionen ja tatsächlich keinen Sinn macht. Das kommt auf das Hauptboard.