Forum: Mikrocontroller und Digitale Elektronik SPI oder CAN?


von Paul W. (solarturtle)


Lesenswert?

Hallo zusammen,

ich habe eine Frage, welchen Bus ich nehmen sollte.

Folgendes Problem:
- Zwei Controller für Motorsteuerungen (Also 1 Controller = 1 Motor)
- Ein Master Controller (empfängt Daten von Motorcontroller wie Strom, 
IST-Speed etc. / Sendet an die Controller SOLL-Speed und evtl. weitere 
Werte)
- Motorcontroller sollen die SOLL-Speed Nachricht zeitgleich erhalten 
(10ms Raster)

Nun bin ich am Überlegen wie ich die Kommunikation am besten aufbaue.
Entweder CAN oder SPI. UART fällt wohl raus, weil zu langsam.

Kann ich bei SPI beide Slaves aktivieren, wenn ich die SOLL-Speed 
Nachricht sende, sodass beide Slaves die Nachricht zeitgleich erhalten?

Was würdest Ihr aufgrund eurer Erfahrung für einen Bus wählen, was ist 
schlauer? Beim CAN habe ich halt etwas höhere Kosten weil ich einerseits 
einen Motorcontroller mit CAN nehmen muss, wie auch für die zusätzlichen 
CAN Transceiver ICs.

Danke,
Paul :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul W. schrieb:
> Entweder CAN oder SPI.
Das eine ist ein Feldbus für größere Distanz, das andere ein 
"Platinenbus".

> UART fällt wohl raus, weil zu langsam.
Warum zu langsam? So schnell wie CAN kann der allemal...

> sodass beide Slaves die Nachricht zeitgleich erhalten?
Schicke die Daten im Voraus und dazu einen Zeitstempel, wann die 
ausgeführt werden sollen...

: Bearbeitet durch Moderator
von H.Joachim S. (crazyhorse)


Lesenswert?

Ist in erster Linie ne Frage der Entfernung und der Störumgebung.
CAN heisst im Normalfall: fire and forget. Würde ich empfehlen.
UART ist nicht von sich aus zu langsam, ist ne Frage der zu 
übertragenden Datenmenge/Baudrate und verwendetem Protokoll. Kann man 
durchaus drüber nachdenken. SPI würde ich nur bei kleinen Entfernungen 
nehmen (oder du brauchst auch da wieder Treiberschaltungen).

von Frank K. (fchk)


Lesenswert?

Paul W. schrieb:

> Kann ich bei SPI beide Slaves aktivieren, wenn ich die SOLL-Speed
> Nachricht sende, sodass beide Slaves die Nachricht zeitgleich erhalten?

Prinzipiell ja, ABER: !CS aktiviert ja bei einem SPI-Device MISO (Master 
In-Slave Out). Im nicht selektierten Zustand ist dieses Signal 
hochohmig. Wenn Du jetzt zwei Devices gleichzeitig aktivierst, wird MISO 
von zwei Chips getrieben, und das gibt Bruch. Du könntest die MISOs von 
den Slaves per AND (74AHC1G08) verknüpfen. Dann würde zwar nichts 
elektrisch mehr kaputt gehen, aber ob Du dann sinnvolle Daten bekommst?

Im Klartext: Nein, bei einen normalen SPI ist es nicht vorgesehen, dass 
zwei Slaves gleichzeitig betrieben werden.

Microcontroller mit mehreren SPI-Devices sind aber nichts 
ungewöhnliches. Darfst halt nur nicht ausschließlich bei AVR suchen.

fchk

von Paul W. (solarturtle)


Lesenswert?

Lothar M. schrieb:
> Das eine ist ein Feldbus für größere Distanz, das andere ein
> "Platinenbus".

H.Joachim S. schrieb:
> SPI würde ich nur bei kleinen Entfernungen
> nehmen (oder du brauchst auch da wieder Treiberschaltungen).

Hmmm, nunja. Alle Controller werden sich auf einer gemeinsamen Platine 
befinden. Daher wäre die Entfernung auch klein.

Frank K. schrieb:
> Im Klartext: Nein, bei einen normalen SPI ist es nicht vorgesehen, dass
> zwei Slaves gleichzeitig betrieben werden.

Und wenn ich das SPI als Daisychain aufbaue? Dann müsste ich zwar die 
Speed Nachricht doppelt nacheinander senden, aber dafür übernehmen die 
Controller die Nachricht erst bei der SS Flanke, also zeitgleich.

Lothar M. schrieb:
> Schicke die Daten im Voraus und dazu einen Zeitstempel, wann die
> ausgeführt werden sollen...

Also würde quasi per Triggerpin auch gehen:
- Chip 1 Speed senden
- Chip 2 Speed senden
- 10ms Interrupt auf Master -> Gemeinsamen Interrupt-Pin auf den 
Controllern triggern, dann wird der Wert aus dem SPI Buffer übernommen.

Wäre das sauber?

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Paul W. schrieb:
> Frank K. schrieb:
>> Im Klartext: Nein, bei einen normalen SPI ist es nicht vorgesehen, dass
>> zwei Slaves gleichzeitig betrieben werden.
>
> Und wenn ich das SPI als Daisychain aufbaue? Dann müsste ich zwar die
> Speed Nachricht doppelt nacheinander senden, aber dafür übernehmen die
> Controller die Nachricht erst bei der SS Flanke, also zeitgleich.

Sofern die Slaves das können, wäre das eine Möglichkeit. Ich würde da 
aber eher einen Master mit zwei Hardware SPI Master nehmen. Gibt ja 
genug davon.

fchk

von Paul W. (solarturtle)


Lesenswert?

Frank K. schrieb:
> Sofern die Slaves das können, wäre das eine Möglichkeit. Ich würde da
> aber eher einen Master mit zwei Hardware SPI Master nehmen. Gibt ja
> genug davon.

Okay. Ich sehe gerade das der Motorcontroller den SPI schon braucht um 
den DRV Chip zu bedienen. :(

So könnte ich es aber auch per UART aufbauen, oder?
Also zwei UART zu den Slaves und vielleicht ein Triggerpin, auf dem die 
Slaves die Werte aktivieren?

von Frank K. (fchk)


Lesenswert?

Wie wäre es denn zur Abwechslung mit einem der Aufgabe angemessenen 
Controller? Dem da z.B.:

https://www.reichelt.de/dsPIC-33-Controller/33EP64GP504-IPT/3/index.html?ACTION=3&GROUPID=4087&ARTICLE=121689&SEARCH=dsPIC33EP32GP&START=0&OFFSET=16&;

fchk

von Paul W. (solarturtle)


Lesenswert?

Frank K. schrieb:
> Wie wäre es denn zur Abwechslung mit einem der Aufgabe angemessenen
> Controller?

Der Master Controller soll auch was ordentliches werden, also PIC32 oder 
STM32. Da mangelt es nicht an Schnittstellen. Der fragt dann auch die 
ganze sonstige Sensorik ab und alles drumrum.

Nur bei den Motorcontrollern, welche sich nur um ihren Motor kümmern 
sollen, bin ich etwas eingeschränkt, weil ich mich da mit der TI 
Instaspin-FOC Geschichte schon eingearbeitet habe und einen 
FOC-Controller nicht unbedingt auf einem Fremdcontroller implementieren 
mag (zuviel Arbeit und zuviele Fehlerquellen).
Und bei dem kleinen TI Controller gibt es nur 1 UART, 1 SPI. Wenn ich 
größere nehme, kostet das mehr und ich habe viel mehr Pins, welche ich 
alle nicht brauche.

Daher wäre denke ich die UART Alternative im Hinblick auf Fehlerquellen 
und Kosten die beste Lösung :-)

von Dieter M. (Gast)


Lesenswert?

Vom Datenvolumen her ist das vermutlich relativ sehr klein.
z.B. ein Datenpaket enthält evtl. 20 Bytes alle 10ms = 2kByte/s, bei 
zwei Controllern entsprechend 4kByte/s. Wenn beide Motorcontroller 
antworten, sind das in diesem Beispiel 8kByte/s.

Das schafft UART ganz locker. (hab UART schon mit 3MBit/s am Atmel mit 
USB-FTDI betrieben)

Das erste Byte könnte der Addressierung des Slaves dienen.

Die Synchronisierung könnte mit einem 10ms-Triggersignal vom Master 
erfolgen.

Zur Sicherheit kannst Du natürlich noch eine einfache Checksumme an die 
Nachrichten anhängen. (z.B. alle Bytes einfach aufsummieren)

Achtung Stolperfalle!
Bei einem busartigen Aufbau müssen die Sender der Slaves abgeschaltet 
werden, wenn die gerade nichts senden. Und die TX-Leitung der Slaves 
sollte noch einen 10k Pull-up bekommen.

von Peter D. (peda)


Lesenswert?

Frank K. schrieb:
> Microcontroller mit mehreren SPI-Devices sind aber nichts
> ungewöhnliches. Darfst halt nur nicht ausschließlich bei AVR suchen.

Warum nicht?
Z.B. ATmega2560 kann bis zu 5 SPI-Master.

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.