Innholdsfortegnelse:

CAN -protokoll - Ja, vi kan !: 24 trinn
CAN -protokoll - Ja, vi kan !: 24 trinn

Video: CAN -protokoll - Ja, vi kan !: 24 trinn

Video: CAN -protokoll - Ja, vi kan !: 24 trinn
Video: Какого числа от 1 до 31, родился человек, такая у него и вся жизнь 2024, Juli
Anonim
Image
Image
Ressurser brukt
Ressurser brukt

Et annet emne som nylig ble foreslått av tilhengerne av YouTube -kanalen min, var CAN (Controller Area Network) -protokoll, som vi skal fokusere på i dag. Det er viktig å forklare at CAN er en samtidig seriell kommunikasjonsprotokoll. Dette betyr at synkronismen mellom modulene som er koblet til nettverket, utføres i forhold til begynnelsen av hver melding som sendes til bussen. Vi starter med å introdusere de grunnleggende konseptene i CAN -protokollen og utføre en enkel montering med to ESP32 -er.

I vår krets kan ESP -er fungere som både Master og Slave. Du kan ha flere mikrokontrollere som sender samtidig, fordi CAN håndterer kollisjon av alt automatisk. Kildekoden til dette prosjektet er superenkel. Sjekk det ut!

Trinn 1: Ressurser brukt

  • To moduler med ESP WROOM 32 NodeMcu
  • To CAN -mottakere fra WaveShare
  • Gensere for tilkoblinger
  • Logisk analysator for fangst
  • Tre USB -kabler for ESP og analysator
  • 10 meter vridd par for å tjene som buss

Trinn 2: CAN (Controller Area Network)

CAN (Controller Area Network)
CAN (Controller Area Network)
  • Det ble utviklet av Robert Bosch GmbH på 1980 -tallet for å betjene bilindustrien.
  • Det har blitt utbredt gjennom årene på grunn av sin robusthet og fleksibilitet i implementeringen. Det brukes med militært utstyr, landbruksmaskiner, industri- og bygningsautomasjon, robotikk og medisinsk utstyr.

Trinn 3: CAN - Funksjoner

CAN - Funksjoner
CAN - Funksjoner
CAN - Funksjoner
CAN - Funksjoner
  • To-leders seriell kommunikasjon
  • Maksimalt 8 byte nyttig informasjon per ramme, med fragmentering mulig
  • Adresse rettet til meldingen og ikke til noden
  • Tilordne meldinger prioritet og videresending av "på vent" -meldinger
  • Effektiv evne til å oppdage og signalisere feil
  • Mulighet for flere master (alle noder kan be om busstilgang)
  • Multicast -funksjon (én melding for flere mottakere samtidig)
  • Overføringshastigheter på opptil 1 Mbit / s på en 40 meter lang buss (reduksjon av hastigheten med økning av samlingslengden)
  • Fleksibilitet i konfigurasjon og introduksjon av nye noder (opptil 120 noder per buss)
  • Standard maskinvare, lav pris og god tilgjengelighet
  • Regulert protokoll: ISO 11898

Trinn 4: Krets brukt

Krets brukt
Krets brukt

Her har jeg mottakerne. Det er en på hver side, og de er forbundet med et par ledninger. Den ene er ansvarlig for å sende og den andre for å motta data.

Trinn 5: Overføringslinjespenninger (differensialdeteksjon)

Overføringslinjespenninger (differensialdeteksjon)
Overføringslinjespenninger (differensialdeteksjon)

I CAN er den dominerende biten Zero.

Line Differential Detection reduserer støyfølsomhet (EFI)

Trinn 6: CAN -standarder og rammerformat

CAN -standarder og rammerformat
CAN -standarder og rammerformat

Standardformat med 11-bits identifikator

Trinn 7: CAN -standarder og rammerformat

CAN -standarder og rammerformat
CAN -standarder og rammerformat

Utvidet format med 29-biters identifikator

Trinn 8: CAN -standarder og rammerformat

Det er viktig å merke seg at en protokoll allerede beregner CRC og sender ACK- og EOF -signaler, som er ting som allerede gjøres av CAN -protokollen. Dette garanterer at meldingen som sendes ikke kommer på feil måte. Dette er fordi hvis det gir et problem i CRC (Redundant Cyclic Check eller Redundancy Check), som er det samme som et informasjonskontrollsiffer, vil det bli identifisert av CRC.

Trinn 9: Fire typer rammer (rammer)

Fire typer rammer (rammer)
Fire typer rammer (rammer)

Det er viktig å merke seg at en protokoll allerede beregner CRC og sender ACK- og EOF -signaler, som er ting som allerede gjøres av CAN -protokollen. Dette garanterer at meldingen som sendes ikke kommer på feil måte. Dette er fordi hvis det gir et problem i CRC (Redundant Cyclic Check eller Redundancy Check), som er det samme som et informasjonskontrollsiffer, vil det bli identifisert av CRC.

Fire typer rammer (rammer)

Overføring og mottak av data i CAN er basert på fire typer rammer. Rammetypene vil bli identifisert ved variasjoner i kontrollbitene eller til og med ved endringer i rammeskrivereglene for hvert tilfelle.

  • Dataramme: Inneholder senderdata for mottakeren (e)
  • Fjernramme: Dette er en forespørsel om data fra en av nodene
  • Feilramme: Det er en ramme sendt av noen av nodene når den identifiserer en feil i bussen og kan oppdages av alle noder
  • Overload Frame: Tjener til å forsinke trafikk på bussen på grunn av dataoverbelastning eller forsinkelse på en eller flere noder.

Trinn 10: Krets - Detaljer om tilkoblinger

Krets - Detaljer om tilkoblinger
Krets - Detaljer om tilkoblinger

Trinn 11: Krets - datafangst

Krets - datafangst
Krets - datafangst

Bølgelengder oppnådd for standard CAN med 11-bits ID

Trinn 12: Krets - datafangst

Krets - datafangst
Krets - datafangst

Bølgelengder oppnådd for utvidet CAN med 29-bits ID

Trinn 13: Krets - datafangst

Krets - datafangst
Krets - datafangst

Data innhentet av den logiske analysatoren

Trinn 14: Arduino Library - CAN

Arduino bibliotek - CAN
Arduino bibliotek - CAN

Jeg viser her de to alternativene der du kan installere CAN Driver Library

Arduino IDE Library Manager

Trinn 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

Trinn 16: Senderens kildekode

Kildekode: Inkluderer og oppsett ()

Vi inkluderer CAN -biblioteket, starter serien for feilsøking og starter CAN -bussen med 500 kbps.

#include // Inkluder et biblioteca KAN ugyldig oppsett () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println ("Senderen KAN"); // Inicia o barramento KAN 500 kbps hvis (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Trinn 17: Kildekode: Loop (), Sende en standard CAN 2.0 -pakke

Ved bruk av standard CAN 2.0 sender vi en pakke. 11-biters ID identifiserer meldingen. Datablokken må ha opptil 8 byte. Det starter pakken med ID 18 i heksadesimal. Den pakker 5 byte og lukker funksjonen.

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e identifiera a mensagem (prioridade, evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote … "); CAN.beginPacket (0x12); // id 18 em heksadesimal CAN.write ('h'); // 1º byte CAN.write ('e'); // 2º byte CAN.write ('l'); // 3º byte CAN.write ('l'); // 4º byte CAN.write ('o'); // 5º byte CAN.endPacket (); // encerra o pacote para envio Serial.println ("Enviado."); forsinkelse (1000);

Trinn 18: Kildekode: Loop (), Sende en utvidet CAN 2.0 -pakke

I dette trinnet har ID -en 29 bits. Den begynner å sende 24 bits ID og pakker igjen 5 byte og slutter.

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

Trinn 19: Mottakerens kildekode

Kildekode: Inkluderer og oppsett ()

Igjen vil vi inkludere CAN -biblioteket, starte serien for å feilsøke og starte CAN -bussen med 500 kbps. Hvis det oppstår en feil, skrives denne feilen ut.

#include // Inkluder et biblioteca KAN ugyldig oppsett () {Serial.begin (9600); // inicia a serial para debug while (! Serial); Serial.println ("Reseptor CAN"); // Inicia o barramento KAN 500 kbps hvis (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN"); // caso não seja possível iniciar o controlador while (1); }}

Trinn 20: Kildekode: Loop (), Få pakken og sjekk formatet

Vi prøvde å kontrollere størrelsen på pakken som ble mottatt. CAN.parsePacket () -metoden viser meg størrelsen på denne pakken. Så hvis vi har en pakke, sjekker vi om den er utvidet eller ikke.

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

Trinn 21: Kilde: Loop (), sjekker om det er en ekstern pakke

Her sjekker vi om den mottatte pakken er en dataforespørsel. I dette tilfellet er det ingen data.

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

Trinn 22: Kildekode: Loop (), datalengde forespurt eller mottatt

Hvis den mottatte pakken er en forespørsel, angir vi ønsket lengde. Vi får deretter Data Length Code (DLC), som angir lengden på dataene. Til slutt angir vi mottatt lengde.

Serial.print ("Pacote com id 0x"); Serial.print (CAN.packetId (), HEX); hvis (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 (Data Length Code, que indica o comprimento dos dados)} else {Serial.print ("e comprimento"); // aqui somente indica o comprimento recebido Serial.println (packetSize);

Trinn 23: Kildekode: Loop (), hvis data mottas, skrives det deretter ut

Vi skriver ut (på den serielle skjermen) dataene, men bare hvis den mottatte pakken ikke er en forespørsel.

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

Trinn 24: Last ned filene

PDF

INO

Anbefalt: