Forum: Mikrocontroller und Digitale Elektronik CAN - Buslast?


von Tim (Gast)


Lesenswert?

Hallo Kollegen

ich bin dabei, ein paar Sensor-Nodes zu bauen, welche ich gerne über CAN 
miteinander verbinden möchte. Die Sensoren haben ADCs drauf und sollen 
an verschiedenen Punkten ein paar Werte messen und diese dann über den 
Bus an den zentralen Node senden, der die Daten speichern soll. Soweit 
alles klar.

Nur habe ich jetzt in meiner Berechnung herausgefunden, dass ich eine 
Samplingrate von ca. 1 kHz brauche. D.h. ich muss im Takt von 1 ms die 
Messwerte (4 Bytes) übertragen. Mir erscheint das sehr sportlich, da CAN 
maximal 1 MBit/s hat. Was meint ihr?

Ich habe maximal drei Nodes, also gäbe es 3 x 4 Bytes / ms zu 
übertragen. Rein theoretisch sollte es reichen, und mein CAN-Kabel ist 
geschirmt und alles, sodass eigentlich keine Übertragungsfehlet 
auftreten sollten.

Was sagt ihr dazu, ist das realistisch? Ich kommt auf ca. 60% Buslast. 
Erscheint mir hoch. Andererseits sieht man in der Industriellen 
Automation auch immer öfter, dass ganze Regelkreise über CAN geschlossen 
werden, d.h. so langsam ist der Bus auch wieder nicht. Im moment kann 
ich es ganz schlecht einschätzen und wäre mal auf ein paar 
Erfahrungswerte von euch gespannt.

Wie wäre es, wenn man CAN mit 2 MBit/s betreibt? mein STM32F407 erlaubt 
das rein Hardwaremässig jedenfalls, denn wenn ich die Register 
entsprechend setze dann läuft das.

(Einen Test mit maximaler Buslast kann ich allerdings im Moment noch 
nicht machen, weil ich nur einen Node habe.)

Gruss

von Disco (Gast)


Lesenswert?

1MBit sollte reichen. ich denke das die Buslast nich höher als 50 
Prozent werden sollte.

von Disco (Gast)


Lesenswert?

Wenn nur Änderungen übertragen werden, könnte die Buslast noch 
wesentlich geringer ausfallen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Passt doch locker.
bei 4 Datenbytes hast du 78Bits/frame (ohne stuffbits), also 78µs bei 
1MBit. Also keine 25% bei regulärem Betrieb.
In deinem Fall denk ich trotzdem ausnahmsweise, das RS485 die bessere 
Wahl wäre. Die Funktionalität von CAN brauchst du bei deinem System 
eigentlich nicht, die Botschaften selbst sind nur halb so lang. Wenn 
noch mehr dazukommt, kannst du bis 12MBit hochgehen

von Harald (Gast)


Lesenswert?

Interessant wäre noch die Länge des Bus, ob 1MBit überhaupt realistisch 
bzw. praktikabel ist.

von Tim (Gast)


Lesenswert?

Moin moin

die Länge des Bus ist definitiv kleiner als 1m. So einige 10 cm. Sagen 
wir mal, 40cm. Nach meinen Berechnungen sollte dann 1Mbit locker drin 
liegen.

CAN habe ich deshalb gewählt, weil CRC usw. schon in der Hardware 
erledigt wird. Von RS485 bin ich eigentlich nicht so ein Fan, obwohl, 
ich könnte ja an eine Variantenbestückung meiner LP denken (ich werde 
davon ein paar Leiterplatten anfertigen lassen) um beides testen zu 
können.

von Frank K. (fchk)


Lesenswert?

Bei dieser Buslänge brauchst Du kein CRC. Nimm UARTs, hänge daran 
CAN-Transceiver (ja, das geht problemlos), und höre beim Senden mit. 
Solange Du jedes Byte, das Du sendest, auch wieder empfängst, ist alles 
in Ordnung. Der Einsatz von CAN-Transceivern anstelle von 
RS485-Transceivern erspart Dir das Ansteuern des DE-Einganges (Driver 
Enable) vom Transceiver.

fchk

von Christian B. (casandro)


Lesenswert?

Du kannst da sogar ein triviales Protokoll sprechen. Alle Sensoren 
zählen die empfangenen Bytes mit, und wissen somit, wann sie senden 
dürfen. Der "Master" schickt ein Zeichen zum Start (z.Bsp. Break)

Dadurch vereinfacht sich das zu einer ISR die folgendes macht.
USART meldet Break -> x=0
USART empfängt Byte ->
   x=Startwert zum Senden?
     ja=>1. Datenbyte senden
     nein=> Byte verwerfen
   x:=x+1
USART hat Byte verschickt
   noch ein Datenbyte zum schicken da?
     ja=>Datenbyte schicken

Somit schickt der Master ein Break und bekommt dann, fast mit maximaler 
Geschwindigkeit, nacheinander alle Datenbytes von allen Sensoren.

Ach ja, und mit einem Dioden-Und (oder einem Dioden-Oder) kannst Du das 
sogar quasi als "Open-Collector" betreiben. Für Deine Kabellängen sollte 
das reichen, da ginge sogar CAN. :)

von Tim (Gast)


Lesenswert?

Hmm aber was spricht denn gegen CAN?

Jedenfalls ist die Idee, einen CAN-Transceiver an einem UART zu 
betreiben, ganz interessant. Das geht wirklich?

von (prx) A. K. (prx)


Lesenswert?

Tim schrieb:
> Jedenfalls ist die Idee, einen CAN-Transceiver an einem UART zu
> betreiben, ganz interessant. Das geht wirklich?

Klar geht das.

von Test (Gast)


Lesenswert?

Nimm CAN und gut. Die Buslast wurde dir hier ja schon ausgerechnet. 
Alles unter 70...80% macht keinerlei probleme.

von Christian B. (casandro)


Lesenswert?

Tim schrieb:
> Hmm aber was spricht denn gegen CAN?

Naja, für Deine Anwendung ginge auch CAN, ja sogar I2C.

Aber schau Dir mal CAN, besonders die elektrischen Spezifikationen an, 
und probiere vielleicht auch mal real existierende Komponenten aus.

von Klaus (Gast)


Lesenswert?

Tim schrieb:
> So einige 10 cm. Sagen wir mal, 40cm. Nach meinen Berechnungen sollte
> dann 1Mbit locker drin liegen.

So lang etwa, wie ein PATA HD Kabel. Und wurden da nicht 16MHz mit 
einfachen Bustreibern gemacht?

MfG Klaus

von X2 (Gast)


Lesenswert?

Christian Berger schrieb:
> Du kannst da sogar ein triviales Protokoll sprechen. Alle Sensoren
> zählen die empfangenen Bytes mit, und wissen somit, wann sie senden
> dürfen. Der "Master" schickt ein Zeichen zum Start (z.Bsp. Break)
>
> Dadurch vereinfacht sich das zu einer ISR die folgendes macht.
> USART meldet Break -> x=0
> USART empfängt Byte ->
>    x=Startwert zum Senden?
>      ja=>1. Datenbyte senden
>      nein=> Byte verwerfen
>    x:=x+1
> USART hat Byte verschickt
>    noch ein Datenbyte zum schicken da?
>      ja=>Datenbyte schicken

Hört sich bisschen wie LIN an ;-)

von asterix (Gast)


Lesenswert?

X2 schrieb:
> Christian Berger schrieb:
>> Du kannst da sogar ein triviales Protokoll sprechen. Alle Sensoren
>> zählen die empfangenen Bytes mit, und wissen somit, wann sie senden
>> dürfen. Der "Master" schickt ein Zeichen zum Start (z.Bsp. Break)
>>
>> Dadurch vereinfacht sich das zu einer ISR die folgendes macht.
>> USART meldet Break -> x=0
>> USART empfängt Byte ->
>>    x=Startwert zum Senden?
>>      ja=>1. Datenbyte senden
>>      nein=> Byte verwerfen
>>    x:=x+1
>> USART hat Byte verschickt
>>    noch ein Datenbyte zum schicken da?
>>      ja=>Datenbyte schicken
>
> Hört sich bisschen wie LIN an ;-)

..hatte ich am Anfang auch gedacht. Ein paar Sensorwerte einsammeln ist 
doch Ideal für einen LIN Bus.
Wozu einen teuren CAN-Bus verwenden der gar nicht benötigt wird? Bei der 
Leitungslänge kannst du auch einfach eine stinknormale UART nehmen und 
zur Not hängst du ein CRC Byte mit rein ;-)

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.