CAN protokols - jā, mēs varam !: 24 soļi
CAN protokols - jā, mēs varam !: 24 soļi
Anonim
Image
Image
Izmantotie resursi
Izmantotie resursi

Vēl viena tēma, ko nesen ieteica mana YouTube kanāla sekotāji, bija CAN (Controller Area Network) protokols, uz kuru mēs šodien koncentrēsimies. Ir svarīgi paskaidrot, ka CAN ir vienlaicīgs sērijas sakaru protokols. Tas nozīmē, ka sinhronizācija starp tīklam pievienotajiem moduļiem tiek veikta attiecībā uz katra ziņojuma sākumu, kas nosūtīts uz kopni. Mēs sāksim, iepazīstinot ar CAN protokola pamatjēdzieniem un veiksim vienkāršu montāžu ar diviem ESP32.

Mūsu ķēdē ESP var darboties gan kā galvenais, gan kā palīgs. Vienlaicīgi var pārraidīt vairākus mikrokontrollerus, jo CAN automātiski tiek galā ar visu sadursmi. Šī projekta avota kods ir ļoti vienkāršs. Pārbaudiet to!

1. darbība. Izmantotie resursi

  • Divi moduļi ESP WROOM 32 NodeMcu
  • Divi CAN raiduztvērēji no WaveShare
  • Džemperi savienojumiem
  • Loģisks analizators uztveršanai
  • Trīs USB kabeļi ESP un analizatoram
  • 10 metru vītā pāra kalpošanai kā autobuss

2. darbība: CAN (kontroliera zonas tīkls)

CAN (kontroliera apgabala tīkls)
CAN (kontroliera apgabala tīkls)
  • To izstrādāja Robert Bosch GmbH astoņdesmitajos gados, lai kalpotu autobūves nozarei.
  • Tā ir kļuvusi plaši izplatīta gadu gaitā, pateicoties tās stingrībai un ieviešanas elastībai. To izmanto ar militāro aprīkojumu, lauksaimniecības tehniku, rūpniecības un ēku automatizāciju, robotiku un medicīnas aprīkojumu.

3. darbība: CAN - funkcijas

CAN - funkcijas
CAN - funkcijas
CAN - funkcijas
CAN - funkcijas
  • Divu vadu sērijas sakari
  • Maksimāli 8 baiti noderīgas informācijas katrā kadrā, iespējams sadrumstalotība
  • Adrese, kas vērsta uz ziņojumu, nevis uz mezglu
  • Prioritāšu piešķiršana ziņojumiem un aizturēto ziņojumu pārsūtīšana
  • Efektīva spēja atklāt un signalizēt par kļūdām
  • Multi-master iespējas (visi mezgli var pieprasīt piekļuvi kopnei)
  • Multicast iespēja (viens ziņojums vairākiem uztvērējiem vienlaikus)
  • Pārsūtīšanas ātrums līdz 1 Mbit / s 40 metru autobusā (ātruma samazināšana, palielinot kopņu garumu)
  • Konfigurācijas elastība un jaunu mezglu ieviešana (līdz 120 mezgliem autobusā)
  • Standarta aparatūra, zemas izmaksas un laba pieejamība
  • Regulētais protokols: ISO 11898

4. darbība. Izmantotā ķēde

Izmantota ķēde
Izmantota ķēde

Šeit man ir uztvērēji. Katrā pusē ir viens, un tie ir savienoti ar vadu pāri. Viens ir atbildīgs par datu nosūtīšanu, bet otrs - par datu saņemšanu.

5. solis: pārvades līnijas spriegumi (diferenciālā noteikšana)

Pārvades līnijas spriegumi (diferenciālā noteikšana)
Pārvades līnijas spriegumi (diferenciālā noteikšana)

CAN dominējošais bits ir nulle.

Līniju diferenciālā noteikšana samazina trokšņa jutību (EFI)

6. darbība: CAN standartu un rāmju formāts

CAN standartu un rāmju formāts
CAN standartu un rāmju formāts

Standarta formāts ar 11 bitu identifikatoru

7. solis: CAN standartu un rāmju formāts

CAN standartu un rāmju formāts
CAN standartu un rāmju formāts

Paplašināts formāts ar 29 bitu identifikatoru

8. solis: CAN standartu un rāmju formāts

Ir svarīgi atzīmēt, ka protokols jau aprēķina CRC un nosūta ACK un EOF signālus, kas ir lietas, ko jau veic CAN protokols. Tas garantē, ka nosūtītais ziņojums nenonāks nepareizā veidā. Tas ir tāpēc, ka, ja tas rada problēmu CRC (liekā cikliskā pārbaude vai dublēšanas pārbaude), kas ir tāds pats kā informācijas pārbaudes cipars, to identificēs CRC.

9. darbība: četri rāmju veidi (rāmji)

Četri rāmju veidi (rāmji)
Četri rāmju veidi (rāmji)

Ir svarīgi atzīmēt, ka protokols jau aprēķina CRC un nosūta ACK un EOF signālus, kas ir lietas, ko jau veic CAN protokols. Tas garantē, ka nosūtītais ziņojums nenonāks nepareizā veidā. Tas ir tāpēc, ka, ja tas rada problēmu CRC (liekā cikliskā pārbaude vai dublēšanas pārbaude), kas ir tāds pats kā informācijas pārbaudes cipars, to identificēs CRC.

Četri rāmju veidi (rāmji)

CAN datu pārraide un saņemšana ir balstīta uz četru veidu kadriem. Kadru tipi tiks identificēti pēc vadības bitu izmaiņām vai pat ar izmaiņām kadru rakstīšanas noteikumos katram gadījumam.

  • Datu rāmis: satur uztvērēja (-u) raidītāja datus
  • Attālais kadrs: Šis ir datu pieprasījums no viena mezgla
  • Kļūdas rāmis: tas ir kadrs, ko nosūta kāds no mezgliem, identificējot kopnes kļūdu, un to var atklāt visi mezgli
  • Pārslodzes rāmis: kalpo, lai aizkavētu satiksmi autobusā datu pārslodzes vai kavēšanās dēļ vienā vai vairākos mezglos.

10. solis: ķēde - informācija par savienojumiem

Ķēde - informācija par savienojumiem
Ķēde - informācija par savienojumiem

11. darbība. Ķēde - datu uztveršana

Ķēde - datu uztveršana
Ķēde - datu uztveršana

Viļņu garumi, kas iegūti standarta CAN ar 11 bitu ID

12. darbība: ķēde - datu uztveršana

Ķēde - datu uztveršana
Ķēde - datu uztveršana

Viļņu garumi iegūti paplašinātam CAN ar 29 bitu ID

13. darbība. Ķēde - datu uztveršana

Ķēde - datu uztveršana
Ķēde - datu uztveršana

Loģikas analizatora iegūtie dati

14. darbība: Arduino bibliotēka - CAN

Arduino bibliotēka - CAN
Arduino bibliotēka - CAN

Šeit es parādīšu divas iespējas, kurās varat instalēt CAN draiveru bibliotēku

Arduino IDE bibliotēkas vadītājs

15. solis: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

16. darbība: raidītāja avota kods

Avota kods: Ietver un iestatīšana ()

Mēs iekļausim CAN bibliotēku, sāksim atkļūdošanas sēriju un sāksim CAN kopni ar ātrumu 500 kbps.

#include // Iekļaut biblioteka CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println ("Pārraide CAN"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

17. darbība. Avota kods: cilpa (), standarta CAN 2.0 paketes nosūtīšana

Izmantojot standarta CAN 2.0, mēs nosūtām paketi. 11 bitu ID identificē ziņojumu. Datu blokam ir jābūt līdz 8 baitiem. Pakete sākas ar ID 18 heksadecimālā formā. Tas iesaiņo 5 baitus un aizver funkciju.

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifica a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 baiti Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 em heksadecimāls CAN.write ('h'); // 1º baits CAN.write ('e'); // 2º baits CAN.write ('l'); // 3º baits CAN.write ('l'); // 4º baits CAN.write ('o'); // 5º baits CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); kavēšanās (1000);

18. darbība. Avota kods: cilpa (), paplašināta CAN 2.0 pakotnes sūtīšana

Šajā solī ID ir 29 biti. Tas sāk sūtīt 24 bitus ID un, atkal, iepako 5 baitus un aiziet.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e identifica a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 baiti Serial.println ("Enviando pacote estendido…"); CAN.beginExtendedPacket (0xabcdef); // id 11259375 decimāls (abcdef em hexa) = 24 biti preenchidos até aqui CAN.write ('w'); // 1º baits CAN.write ('o'); // 2º baits CAN.write ('r'); // 3º baits CAN.write ('l'); // 4º baits CAN.write ('d'); // 5º baits CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); kavēšanās (1000); }

19. darbība: uztvērēja avota kods

Avota kods: Ietver un iestatīšana ()

Atkal mēs iekļausim CAN bibliotēku, sāksim sērijas atkļūdošanu un sāksim CAN kopni ar ātrumu 500 kbps. Ja rodas kļūda, šī kļūda tiks izdrukāta.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println ("Receptor CAN"); // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

20. darbība: avota kods: cilpa (), iepakojuma iegūšana un formāta pārbaude

Mēs mēģinājām pārbaudīt saņemtās pakas izmēru. CAN.parsePacket () metode parāda man šīs paketes izmēru. Tātad, ja mums ir pakete, mēs pārbaudīsim, vai tā ir pagarināta vai nē.

void loop () {// Tenta verificar o tamanho do acote recebido int packetSize = CAN.parsePacket (); if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote."); if (CAN.packetExtended ()) {// verifica se o pacote é estendido Serial.println ("Estendido"); }

21. solis: Avots: cilpa (), pārbauda, vai tas ir attālais iepakojums

Šeit mēs pārbaudām, vai saņemtā pakete ir datu pieprasījums. Šajā gadījumā nav datu.

ja (CAN.packetRtr ()) {// Verifica se o pacote é um pacote remoto (Requisição de dados), neste caso não há dados Serial.print ("RTR"); }

22. darbība. Avota kods: cilpa (), pieprasīts vai saņemts datu garums

Ja saņemtā pakete ir pieprasījums, mēs norādām pieprasīto garumu. Pēc tam mēs iegūstam datu garuma kodu (DLC), kas norāda datu garumu. Visbeidzot, mēs norādām saņemto garumu.

Serial.print ("Pacote com id 0x"); Sērijas nospiedums (CAN.packetId (), HEX); ja (CAN.packetRtr ()) {// se o pacote recebido é de requisição, indicamos o comprimento solicitado Serial.print ("e requsitou o comprimento"); Serial.println (CAN.packetDlc ()); // obtem o DLC (Datu garuma kods, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento recebido Serial.println (packetSize);

23. darbība. Avota kods: cilpa (), ja tiek saņemti dati, tas tiek izdrukāts

Mēs drukājam (sērijas monitorā) datus, bet tikai tad, ja saņemtā pakete nav pieprasījums.

// Imprime os dados somente se o pacote recebido não foi de requisição while (CAN.available ()) {Serial.print ((char) CAN.read ()); } Sērijas.println (); } Sērijas.println (); }}

24. darbība: lejupielādējiet failus

PDF

ES NĒ

Ieteicams: