Forum: Mikrocontroller und Digitale Elektronik Probleme mit CAN-Bus und ESP32


von Evahase (Gast)


Angehängte Dateien:

Lesenswert?

Huhu,

erstmal der Code:
1
#include <CAN.h> //sandeepmistry/CAN@^0.3.1
2
3
#define can_rx 4
4
#define can_tx 5
5
6
#define modID 3046
7
8
void sendCan(uint64_t id, String action) {
9
  CAN.beginExtendedPacket(id);
10
    for(int i = 0; i < 8; i++) {
11
      if(action[i] != 0x00)
12
        CAN.write(action[i]);
13
    }
14
  CAN.endPacket();
15
}
16
17
void setup() {
18
  CAN.setPins(can_rx, can_tx);
19
  if (!CAN.begin(500E3)) {
20
    while (1);
21
  }
22
}
23
24
void loop() {
25
  delay(1000);
26
  sendCan(modID, "-9");
27
}

Also ich habe hier einen "Testaufbau" dieser soll aber mal in mein 
Heimnetz übernommen werden.

Momentan habe ich 6 Module welche im Sekundentackt ein "Lebenszeichen" 
schicken und eine Zentrale welche das Lebenszeichen empfängt. Ich habe 
alles auf einer Strecke aufgebaut und habe nicht länger als 1-2m die 
Module entfernt. Nur einmal sind es 5m.

Die Module senden alles schön Brav und der Empfänger empfängt auch alles 
schön Brav. Nun wenn ich jetzt aber den 7. anstecke (und eigentlich 
kommen da bestimmt noch 10 dazu) kommt anstelle von "-9" manchmal "-8" 
oder ",-" (Einen Codefehler welcher eine 8 oder, übertrag kann ich 
ausschließen, da der Code [siehe oben] das garnicht kennt - ob die 
library allerdings ideal ist weiß ich nicht - der Serial-Log vom Sender 
meint im übrigen "-9" während der Empfänger anderes behauptet <- und das 
auf kompletter strecke [also alle Module]).

Ich weiß, dass der 5m entfernte ggf. zu weit vom Bus entfernt ist und 
ich besser das als Strecke auslege (also hin und zurück fahre)... <- 
aber kann das der Fehler sein (ist schwer zu testen, weil ich leider nur 
ein 2 Poliges Kabel an der stelle zur Verfügung habe - aber ich werde 
mal "überirdisch" eines verlegen).

Wie kann ich sowas sauber debugen? Kann es sein, dass ich mit meine 3.3V 
was der SN65HVD230 macht, hier an die Grenzen komme?
Abschlusswiderstand und Busspannung und Co wird da ja nicht benötigt?

90% ist mit CAT7 verlegt, es gibt aber kurze Bereiche wo ein 
"Lautsprecherkabel" liegt.

danke für eure Tips

EVA

von rkes (Gast)


Lesenswert?

Evahase schrieb:
> Abschlusswiderstand und Busspannung und Co wird da ja nicht benötigt?

Du meinst du hast gar keinen Abschlusswiderstand am Bus? Dann ist das 
der Fehler und Busspannung ist mir unklar..

von Helmut -. (dc3yc)


Lesenswert?

Wichtig wäre auch noch die Busgeschwindigkeit. Und wie mein Vorredner 
schon sagte, ohne Abschlusswiderstände ist ein No-Go.

von Sebastian W. (wangnick)


Lesenswert?

Helmut -. schrieb:
> Wichtig wäre auch noch die Busgeschwindigkeit.

Busgeschwindigkeit scheint 500kHz zu sein. Versuchs mal mit 125kHz.

Und: Du läuft über das Stringende hinweg!

LG, Sebastian

von Evahase (Gast)


Lesenswert?

ha,.... 1000 Dank,

genau das war die Spannende Frage :)

Abschlusswiderstand
Wo genau mach ich den hin?
an meinem geraden Strang (einen vorne & einen hinten  nur hinten  nur 
vorne), oder an jedem Modul?
Oder an jeden längeren Zweig?

Busgeschwindigkeit steht im Code... aber es läuft mit 1000kHz genauso.

Gibt es für die 3.3V Version Empfehlungen. Reden wir hier von 120Ohm, 
mehr oder weniger???


@wangnick: wo laufe ich über das "Stringende" hinweg?
meinst du, weil ich, ich übertrage 2 Charaktäre und prüfe beim Versand 
ob der wert != 0x00 ist für die Maximal möglichen 8 Charaktäre!?!?
=> oder verhau ich da was?


EVA

von tinCAN (Gast)


Lesenswert?

Evahase schrieb:
> kommt anstelle von "-9" manchmal "-8"
> oder ",-"

Hmm, ein halb kapputtes CAN?

CAN verwendet doch Prüfsummen!

von Stefan F. (Gast)


Lesenswert?

Evahase schrieb:
> Abschlusswiderstand
> Wo genau mach ich den hin?

https://de.wikipedia.org/wiki/Controller_Area_Network#Topologie

Deine Stichleitungen sind ziemlich lang. Eigentlich sollte der Bus nur 
eine durchgehende Linie sein, im Idealfall ganz ohne Stichleitungen.

von Christopher J. (christopher_j23)


Lesenswert?

Evahase schrieb:
> Abschlusswiderstand
> Wo genau mach ich den hin?
> an meinem geraden Strang (einen vorne & einen hinten  nur hinten  nur
> vorne), oder an jedem Modul?
> Oder an jeden längeren Zweig?

Vorne ist immer da wo der Busfahrer sitzt. Der Abschlusswiderstand kommt 
also an beide Enden, nicht irgendwo mittendrin.

Stefan ⛄ F. schrieb:
> Deine Stichleitungen sind ziemlich lang. Eigentlich sollte der Bus nur
> eine durchgehende Linie sein, im Idealfall ganz ohne Stichleitungen.

Wenn die Terminierung nicht geholfen hat, würde ich mal mit der 
Datenrate runtergehen. Bei niedrigen Datenraten sind 5m Stichleitung 
absolut kein Problem.

von Evahase (Gast)


Lesenswert?

ja, ich will auch mit der Datenrate runter gehen, aber ich würde gerne 
mit einer "so hohen Datenrate" wie möglich den Testaufbau starten und 
nach dem Testbetrieb dann in den "Safemode" gehen :)

das mit den Prüfsummen verstehe ich nicht so ganz <- zugegeben, ich bin 
was das angeht "Amateurin". Hier muss ich nochmal Recherchieren.

Ich hab jetzt bei der 5m Stichleitung mal einen "Rückweg" eingebaut, mal 
sehen was der Test sagt.

vielen lieben dank für jede Hilfe

EVA

von Sebastian W. (wangnick)


Lesenswert?

Evahase schrieb:
> @wangnick: wo laufe ich über das "Stringende" hinweg?
> meinst du, weil ich, ich übertrage 2 Charaktäre und prüfe beim Versand
> ob der wert != 0x00 ist für die Maximal möglichen 8 Charaktäre!?!?
> => oder verhau ich da was?

Genau. In deiner Schleife läuft i von 0 bis 7, du prüfst also action[0], 
action[1], action[2], action[3], action[4], action[5], action[6] und 
action[7] auf != 0x00 und füllst entsprechend das CAN-Paket. Aber was 
genau steht denn in action[3] wenn du sendCan(modID,"-9") aufrufst?

LG, Sebastian

von Evahase (Gast)


Lesenswert?

@wangnick: yes... du hast so recht, hab mir irgendwie eingebildet, dass 
0x00 entsprechend dann nichts mehr übermittelt. habe es nun so gelöst:
1
uint8_t ln = action.length() > 8 ? 8 : action.length();
2
for(int i = 0; i < ln; i++) {
3
  if(action[i] != 0x00)
4
    CAN.write(action[i]);
5
}

Was sagst dazu? Ist das sauber? <- eigentlich kann ich die "if-abfrage 
für 0x00" rausschmeißen!?

Leider habe ich weiterhin Busprobleme.
Ich habe jetzt "temporär" die lange Stichleitung entfernt. Ebenso habe 
ich die rate auf 100kHz runtergesetzt. Sowie 120Ohm an den Anfang und 
ans Ende meines Buses.

7 Module arbeiten sauber. Aber ab 8 oder gar 9 bekomme ich wieder 
Probleme.
Kann es sein dass die CAN-Library "schlecht" ist <- wobei diese auf die 
Renommierte MCP2515 basiert.

Ich suche immer noch nach Debugging-Möglichkeiten. Bzw. Ideen was ich 
falsch gemacht haben könnte.

Morgen versuche ich einen Versuchsaufbau auf einer 5m Strecke mit 10 
oder besser 15 Modulen (diese müssen allerdings erst noch Produziert 
werden).

EVA

von Sebastian (Gast)


Lesenswert?

Evahase schrieb:
> Ich suche immer noch nach Debugging-Möglichkeiten.

Was sagt das Oszilloskop an dem Empfängerende? Deine Module werden 
eigene Stromversorgungen haben, und die Transceiver sind nicht 
galvanisch vom Bus getrennt. Aber eigentlich kommt ein CAN-Paket heile 
an oder gar nicht ...

LG, Sebastian

von Evahase (Gast)


Angehängte Dateien:

Lesenswert?

Oszilloskop hänge ich auch morgen mal ran. Wobei auch hier ich eher 
Amateur bin und nicht weiß was ich da sehen soll!?

Die Stromversorgung ist Zentral 9V, jeder ESP32 hat Glättkondensatoren 
und einen Pegelwandler auf 3,3V.

Die Transceiver sind genau die: https://www.amazon.de/dp/B07RDKRRN9
Diese habe ich direkt verbunden und direkt ans ESP.

Ich sende ja von jedem Module alle 1000ms "-9". Sobald ich eines zu viel 
anstecke (gerade bin ich bei NR.7) senden einige immer noch brav die 
"-9" eines Sendet garnicht mehr und 2 schicken -8 oder teilweise sogar 
Hieroglyphen... <- richtige Werte kommen dann nicht mehr.
> Es sind nicht immer die selben Module und es ist (für mich) von der "Anordnung" 
auch nicht logisch. Also weder das nächste noch das am "ungelegensten Ort".


EVA

von Thomas F. (igel)


Lesenswert?

Evahase schrieb:
> Die Transceiver sind genau die: https://www.amazon.de/dp/B07RDKRRN9

Autsch. Sie Dinger haben nicht mal einen Abblockkondensator.

Laut Bild ist da auf jeder Platine ein Abschlusswiderstand mit drauf. 
Das ist natürlich auch verkehrt. Abschlusswiderstände nur an den beiden 
Enden des Busses.
Wenn zu viele Widerstände verbaut sind kann der Transceiver den Bus 
nicht mehr treiben und es kommt zu Übertragungsfehlern. Bau doch erst 
mal die Hardware richtig auf.

: Bearbeitet durch User
von H. (Gast)


Lesenswert?

Ein paar kurze Anmerkungen zu dem Thema:

- maximal tolerierbar Stichlängen bei Datenrate x kann man im Internet 
nachschlagen. Stiche sind aber grundsätzlich nicht toll, lieber mehr 
Leitungslänge hin- und zurück akzeptieren.

- Abschlusswiderstand: die Abschlusswiderstände sind nicht nur Kosmetik. 
Mindestens einen Abschlusswiderstand braucht man, damit überhaupt ein 
Strom fließen kann und sich die Pegel sauber abbilden können 
(vereinfacht gesagt).

- Kein Abblockkondensator am CAN Transceiver: wenn überhaupt nichts da 
ist, ist das schon blöd. CAN zieht ganz schön Strom, mindestens mal ein 
keramischer Kondensator (und wenn es nur ein 100nF ist) wäre gut.

- Du sagst, Du müsstest mal mit oberirdischen Leitungen testen. Wozu? 
Die Leitungsqualität des CANs kannst Du jeweils am Transceiver sehen, 
sofern Du ein Scope hast. Sind die Flanken relativ schön ausgeformt ist 
alles I.O. Sind da eher starke Überschwinger oder viele „analoge 
Beimengen“ zu beobachten ist nicht nicht in Ordnung.

von Evahase (Gast)


Lesenswert?

@igel

wir kommen der Sache näher :)
> Das heißt, wenn ich "jedes mal" einen Endwiderstand habe, zerstör ich mir den 
Bus... das klingt Logisch

wie gesagt, tut mir leid, ich bin da echt nicht Profi, das ist nur ein 
Hobby.

d.h. ich mache einfach alle Widerstände runter und habe nur am Anfang 
und Ende einen.

Zum Thema Abblockkondensator. Von wo nach wo mach ich denn was. <- 
sollte ja kein Thema sein den nachzurüsten!?

lg
EVA

von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

Evahase schrieb:
> d.h. ich mache einfach alle Widerstände runter und habe nur am Anfang
> und Ende einen.

Ja, der ohmsche Widerstand zwischen CANL und CANH sollte ~60Ω sein, 
nachmessen.

Anbei mal Bilder von meinem 125kHz Hobby-CAN-Bus, ein Übersichtsbild von 
17 Sekunden und dann ein empfangenes und ein gesendetes Paket, wie am 
Transceiver abgegriffen (TJA1050 in meinem Fall).

Evahase schrieb:
> Zum Thema Abblockkondensator. Von wo nach wo mach ich denn was. <-
> sollte ja kein Thema sein den nachzurüsten!?

100nF zwischen 3V3 und GND auf dem Transceiver-Modul. Am besten zwischen 
die Beinchen des Transceivers selbst, ansonsten z.B. zwischen die 
Lötkontakte.

LG, Sebastian

: Bearbeitet durch User
von Evahase (Gast)


Lesenswert?

jo mei...

@wangnick & alle anderen
1000 Dank euch, es geht.

Ich habe die Widerstände runter. Jetzt hab ich pro Modul ~76kOhm 
Widerstand. Auf dem ganzen Bus ~61,5 Ohm.

Aktuell 10 Module auf 500kHz im Betrieb und ich habe keine Fehler. Ich 
habe mir noch n paar 100nF bestellt und mach die noch drauf sobald diese 
da sind.

Heute Nachmittag mach ich nochmal mind. 5 Module fertig und schau ob es 
weiterhin stabil läuft.

es rockt

EVA

von Sebastian W. (wangnick)


Lesenswert?

Evahase schrieb:
> und 2 schicken -8 oder teilweise sogar
> Hieroglyphen...

Der CAN-Empfänger sollte fehlerhafte Empfangspakete verwerfen. Bei 
massiven Busproblemen wie bei dir vorher steigt natürlich die Chance, 
dass die Bitfehler irgendwann einmal zufällig zur Paketprüfsumme passen 
und dennoch noch "legal" sind (Framing, Adresse, Bitstuffing), sie ist 
aber immer noch recht klein. Ich würde sagen allerallerhöchstens kann 
eins von 100000 Rauschpaketen durchkommen.

Wie häufig hast du die Fehler gehabt? Was die Sende-ID dabei noch in 
Ordnung? Kann es sein das dein Empfänger fehlerhafte Pakete akzeptiert 
und stattdessen als fehlerhaft markiert?

LG, Sebastian

von H. (Gast)


Lesenswert?

Evahase schrieb:
> Aktuell 10 Module auf 500kHz im Betrieb und ich habe keine Fehler

Du meinst 500kbit? Ist eine Hausinstallation, oder? Da mögen 500kbit 
"irgendwie" funktionieren, sind aber nicht sonderlich empfehlenswert. 
500kbit kann man so gefühlt im Rahmen von 10m bei guter Busstruktur 
machen, 50..80m bei 250kbit. Weitere Baudraten vs. Längen siehe 
Internet.

von Evahase (Gast)


Angehängte Dateien:

Lesenswert?

die 500kbit sind auch mehr eine "Stabilitätsprüfung"... wenn Fertig 
plane ich so 125kbit.

Aber wenn alles sauber und Stabil mit 500kbit läuft, erwarte ich mit 
125kbit keine Probleme mehr.

Ich habe jetzt alle Leitungen sauber durchgeschleift, das hat meinen Bus 
zwar verlängert, aber dafür habe ich keine Stichleitungen mehr (max 
10cm).

@wangnick: das war dann das "kuriose"... manche Meldungen kamen nicht an 
und manche kamen falsch an, aber die Falschen kamen IMMER mit dem selben 
falschen wert oder eben garnicht. Richtig kam von dem Modul nichts mehr.
=> aber klar, wenn ich an jedem ende 120 Ohm habe ... das *10 ... dann 
habe ich einen Buswiderstand von 12 Ohm <- was dann nicht mehr gehen 
kann.

...

ich bin jetzt so erstmal zufrieden. Jetzt muss ich erstmal Löten und 
noch n paar Module bauen. Ebenso würde ich gerne die 
Abblockkondensatoren verbauen (auch wenn es momentan ohne auch gut 
funktioniert) <- Sicher ist sicher... das soll immerhin über Jahre gut 
laufen.

fühlt euch gedrückt

EVA

von Sebastian W. (wangnick)


Lesenswert?

Evahase schrieb:
> @wangnick: das war dann das "kuriose"... manche Meldungen kamen nicht an
> und manche kamen falsch an, aber die Falschen kamen IMMER mit dem selben
> falschen wert oder eben garnicht. Richtig kam von dem Modul nichts mehr.
> => aber klar, wenn ich an jedem ende 120 Ohm habe ... das *10 ... dann
> habe ich einen Buswiderstand von 12 Ohm <- was dann nicht mehr gehen
> kann.

Ich versuche das Kuriose zu verstehen, die Gründe könnten ja interessant 
sein. Wenn aus "-9" ein "-8" wird, dann ist ein Bit von 1 auf 0 
umgekippt (0x39/0b00111001 wird zu 0x38/0b00111000). Eine binäre 1 wird 
auf dem CAN-Bus als Ruhepegel übertragen, eine binäre 0 als 
Spannungsdifferenz zwischen CANH und CANL. Aber wieso wird bei zu 
geringem Buswiderstand ein Ruhepegel als Spannungsdifferenz erkannt? Und 
wieso wird das durch die Prüfsumme nicht aufgefangen?

Ein Gedanke den ich hatte ist der recht hohe Bus-Kurzschlussstrom des 
SN65HVD230 von 250mA. Kann deine Stromversorgung das leisten?

LG, Sebastian

: Bearbeitet durch User
von Evahase (Gast)


Lesenswert?

Puh,

kann es denn sein, dass meine Library keine Fehlerkorrektur bzw. 
Prüfsumme unterstützt? <- was ja echt schade wäre. <- wie kann ich das 
Prüfen (außer mit Oszi - wobei ich das so oder so mal ranhängen will)

Ja, die Spannungsversorgung ist Overpowered. Ich habe 9V 5A (Gesamt) und 
an jedem ESP einen Pegelwandler auf 3.3V (hier will ich am Schluss etwas 
eindämpfen, aber erstmal schauen was ich brauche - habe auch ein paar 
SSR & Co im Betrieb).

lg

EVA

von Sebastian W. (wangnick)


Lesenswert?

Evahase schrieb:
> kann es denn sein, dass meine Library keine Fehlerkorrektur bzw.
> Prüfsumme unterstützt?

Fehlerüberprüfung passiert in Hardware, die Empfänger senden ihr ACK am 
Ende jedes empfangenen Pakets nur wenn kein Fehler erkannt wurde. 
Deshalb ist dein Fall ja so kurios ...

Evahase schrieb:
> an jedem ESP einen Pegelwandler auf 3.3V

Ok, gut wenn der in der Lage ist 5.7V*Strom an Abwärme abzuführen ...

LG, Sebastian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.