dinsdag 7 januari 2020

CAN-bus - Deel 1

Een tijdje terug heb ik mezelf voorgenomen om de Burton te gaan voorzien van een CAN-bus. Niet omdat het moet, maar omdat het can dus... Zo, de eerste foute woordgrap is alweer gemaakt dit nieuwe jaar.

Nee, niet zo'n bus (bron: www.volkswagen.nl).

CAN staat voor Controller Area Network en is door Bosch ontwikkeld om elektronische systemen in een voertuig aan elkaar te koppelen en de hoeveelheid bedrading te verminderen. CAN maakt gebruik van een tweedraads bus-systeem en is als eerste door Mercedes gebruikt in een productie-auto. In de automobielindustrie is de CAN-bus niet meer weg te denken, maar inmiddels heeft de CAN-bus zich ook bewezen in de industriële automatisering, medische apparatuur, elektrische fietsen en volgens een enkele website ook in het elektronische schakelsysteem van Shimano.

Een CAN-bus is vooral nuttig als de complexiteit van de elektronische systemen toeneemt. Bij een Burton is dat toch niet echt (euh, echt niet) het geval hoor ik je denken... En dat is natuurlijk ook zo. Voor de eenvoudige systemen in een Burton is een CAN-bus behoorlijk overkill. Maar omdat de Burton voor mij het ultieme over-the-top hobbyproject is, kan de elektronica natuurlijk niet achter blijven. Dat moet iets speciaals worden. Bovendien: adel verplicht!

Een auto is voor elektronica zo'n beetje de meest vuile omgeving die je je kunt voorstellen. Dus het wordt een hele uitdaging om hier op een goede manier mee om te gaan. De betrouwbaarheid van het geheel moet natuurlijk hoog worden. Iets waar in het ontwerp vanaf het begin rekening gehouden moet worden. De CAN-bus heeft het in zich om zich in zo'n vuile omgeving goed staande te houden. Op verschillende manieren wordt de foutgevoeligheid van het systeem gereduceerd. Enkele elektrische eigenschappen waardoor storingen worden voorkomen:
  • De bus bestaat uit twee draden - CAN-H en CAN-L. De digitale nullen en enen van het protocol worden vertaald naar een spanningsverschil tussen de twee draden. Een storingspuls die opgepikt wordt door de ene draad, wordt naar alle waarschijnlijkheid óók opgepikt door de tweede draad. Het spanningsverschil tussen de draden blijft nu gelijk hetgeen een storing op de bus voorkomt.
  • De twee draden worden getwist (twisted-pair) waardoor magnetische invloeden (en de resulterende stroompjes) zichzelf uitdoven.
  • De bus wordt aan twee zijden afgesloten met een weerstand (afsluitweerstand) van 120 ohm, passend bij de impedantie van de (juist gekozen!) kabel. De kabel wordt nu schijnbaar oneindig lang wat reflecties van signalen aan het eind van de kabel voorkomt.

Schematische voorstelling CAN-bus.


Niet alleen elektrisch worden storingen voorkomen, ook het protocol zelf heeft enkele mooie foutcontroles en foutreducerende eigenschappen aan boord. Het CAN-busprotocol is trouwens anders dan heel veel andere communicatieprotocollen niet gebaseerd op berichtverkeer tussen een specifieke zender en een geadresseerde ontvanger. Nee, op de CAN-bus heeft een node géén adres. Elke node kan in principe berichten op de bus plaatsen. Alle node's luisteren naar de berichten die langs komen en doen hier iets mee als zij ze interessant vinden. Maar wat nu als twee nodes tegelijkertijd een bericht gaan plaatsen? Dan gebeurt er iets wat in mijn ogen het meest geniale is van het hele protocol. Er wordt een prioriteitsgevecht gehouden. De node die dit gevecht wint, mag zijn bericht afmaken; de node die het gevecht verliest moet even zijn mond houden.

Om te begrijpen hoe dit gevecht in zijn werk gaat moet je weten dat elk bericht een identificatiecode heeft. Een getal van 11 bits *) waarmee het bericht geïdentificeerd wordt. De node die het bericht met getalsmatig de laagste identificatiecode op de bus probeert te zetten wint het gevecht van een node die een bericht met een hogere identificatiecode probeert te versturen. Maar dan zonder dat ze beide de identificatiecode eerst in zijn geheel kenbaar maken. Hoe dat kan heeft te maken met de manier waarop bits (nullen en enen) op de bus geplaatst worden:
  • Als een node een 1 (één) wil plaatsen laat hij de CAN-H en CAN-L als het waren vrij zweven. De spanning op de twee draden zal dan ergens in het midden tussen de 0 volt en 5 volt gaan hangen. Op zowel de CAN-H- als de CAN-L-draad staat dan een ongeveer gelijke spanning. De spanning tussen CAN-H en CAN-L is dan nagenoeg 0 volt.
  • Als een node een 0 (nul) wil plaatsen zal hij de CAN-H (via een weerstand) aan de 5 volt, en de CAN-L (via een weerstand) aan de 0 volt hangen. Er ontstaat een spanning tussen de CAN-L- en CAN-H-draad van ongeveer 2 volt.

Dominante en recessieve bits op de CAN-bus.


Stel dat twee CAN-nodes (node A en node B) gelijktijdig beginnen met het plaatsen van een eigen bericht op de bus. Dan zijn er in principe bij elke achtereenvolgend bit vier mogelijkheden:
  • Als node A een 0 plaatst en node B een 0, dan zal er een resulterende 0 op de bus verschijnen. 
  • Als node A een 1 plaatst en node B een 1, dan zal dit resulteren in een 1 op de bus. Tot dusver niets vreemds.
  • Als node A een 1 plaatst en node B een 0, dan gebeurt er iets anders. Node A zal met de 1 de bus vrij laten zweven, maar node B trekt met de 0 de twee buslijnen uit elkaar. Resulterend in een 0 op de bus. De 0 overheerst over de 1. In mooie woorden: de 0 van node B is dominant, de 1 van node A is recessief
  • Als node A een 0 plaatst en node B een 1, gebeurt precies het omgekeerde.
Als beide nodes dus gelijktijdig een eigen bericht met nullen en enen op de bus proberen te plaatsen, zal er een moment aanbreken waarbij het bericht van één van beide nodes niet meer gelijk zal zijn aan wat er daadwerkelijk op de bus verschijnt. Nu is het zo dat een node elk bit dat er op de bus verschijnt ook gelijktijdig terugleest. En nu komt het geniale: op het moment dat een node ziet dat het bit op de bus anders is dan hij zelf wilde plaatsen, dan stopt die node met 'praten' en heeft als het ware het gevecht verloren. De winnende node gaat gewoon verder met het plaatsen van de rest van zijn bericht op de bus. En het mooie is, er wordt geen moment tijd verloren.

Samenvattend:
  • Er zal altijd maar één node op een bepaald moment een volledig bericht op de bus plaatsen.
  • Berichten met een lage identificatiecode hebben voorrang op berichten met een hogere identificatiecode (een 0 is namelijk dominant t.o.v. een 1).
Omdat er geen geldende afspraken zijn vastgelegd over de identificatiecodes (elk automerk heeft zo zijn eigen indeling), kun je zelf een indeling maken. Hierover in een volgend blogbericht meer. Een CAN-bericht bestaat trouwens uit méér dan alleen een identificatiecode. Zo bevat het bericht ook een CRC (Cyclic Redundancy Checksum) van 15 bits (plus één afsluitend bit) die door de zender berekend wordt op basis van alle voorgaande bits in het bericht. De ontvangende node doet hetzelfde en vergelijkt zijn resultaat met de CRC die berekend is door de zender. Zijn ze gelijk, dan wordt het bericht geaccepteerd. Is er ergens een bit veranderd tijdens het versturen, dan zullen de CRC's van zender en ontvanger niet gelijk zijn en wordt het bericht niet geaccepteerd door de ontvanger.

Aansluitend aan de CRC zet de zender een 1 op de bus. Het acknowledge-bit. Als er een ontvangende node aanwezig is die het bericht tot en met de CRC correct heeft ontvangen, zal deze het recessieve bit naar 0 veranderen. Zo vertelt hij de zendende node dat het bericht (in ieder geval bij één node) succesvol is gearriveerd. Blijft het acknowledge-bit 1, dan weet de zendende node dat het bericht herhaald moet worden. Samen met nog wat methodes voor het afhandelen van error's maakt dit van CAN-bus een van de meest betrouwbare en meest elegante bussystemen op de markt.

Een volledig CAN-bericht bevat nog wat overige bits en bytes. In een volgend blogbericht ga ik in op het gebruik van de CAN-berichten voor de Burton. Dan komen de control bits en de data bytes aan bod.

Een volledig standaard CAN-bericht.



*) De specificatie CAN 2.0 Part A maakt gebruik van het standaard frame met een 11-bits identificatiecode. Part B van de specificatie maakt gebruik van het extended frame met een 29-bits identificatiecode.

2 opmerkingen:

  1. Hallo RD leuk en interessant te lezen dat je ook met CAN-Bus in de Burton bezig bent. Ik heb samen met een Burton collega vorig jaar besloten dit te gaan inbouwen. We gaan in dit geval voor een bestaand systeem dat ik eerst heb getest omdat het ook in ontwikkelingsfase zat. Inmiddels heb ik het elektrisch plan gereed en zijn we een bestaande Burton aan het ombouwen. Eerlijkheid gebied te zeggen dat het hier om een elektronische draadboom gaat. Deze set is voor geprogrammeerd. Mooi om te lezen hoe je je er in aan het verdiepen bent.

    BeantwoordenVerwijderen
  2. Ik had al gelezen dat je hier mee bezig was. Onze aanpak is idd verschillend. Ben wel nieuwsgierig naar jullie vorderingen. Succes met de inbouw en het testen. Ik ga het natuurlijk wel lezen op het forum (www.2cvkitcarforum.com). Groet, F.

    BeantwoordenVerwijderen