SIMULATOR EMBEDDED PE NTRU BORDUL UNUI AUTOTURISM FOLOSIND COMUNICAȚIA CAN LUCRARE DE DIPLOMĂ Autor: Vlăduț-Alexandru DOBRĂ Conducător științific :… [613754]
FACULTATEA DE AUTOMATIC Ă ȘI CALCULATOARE
2017
SIMULATOR EMBEDDED PE NTRU BORDUL UNUI
AUTOTURISM FOLOSIND COMUNICAȚIA CAN
LUCRARE DE DIPLOMĂ
Autor: Vlăduț-Alexandru DOBRĂ
Conducător științific : Prof. dr. ing. Ioan Nașcu
FACULTATEA DE AUTOMATIC Ă ȘI CALCULATOARE
DECAN
Prof.dr.ing. Liviu MICLEA Vizat,
DIRE CTOR DEPARTAMENT AUTOMATICĂ
Prof.dr.ing. Honoriu VĂLEAN
Autor : Vlădut -Alexandru DOBRĂ
Simulator embedded pentru bordul unui autoturism folosind
com unicația CAN
1. Enunțul temei: Stabilirea unei conexiuni între doua microcontrolere prin
protocolul CAN si simularea unor indicatoare si afi șaje dintr -un bord de ma șina pe
baza datelor din comunicația realizat ă.
2. Conținutul proiectului: Pagina de prezentare , declarația de autenticitat, sinteza ,
cuprinsul, introducerea, studiul teoretic, analiza proiectului, proiectare,
implementare pe microcontrolere, concluzii, bibliografie.
3. Locul documentației: Universitatea Tehnică din Cluj -Napoca
4. Consultanți: ing. Gabriel Harja
5. Data emiterii temei:
6. Data predării:
Semnătura autorului
Semnătura c onducător ului științific
FACULTATEA DE AUTOMATIC Ă ȘI CALCULATOARE
Declarație pe proprie răspundere privind
autenticitatea proiectului de diplomă
Subsemnatul(a) Vlăduț Alexandru Dobră , legitimat cu CI/BI seria MM nr.
612405 , CNP [anonimizat] ,
autorul lucrării: Simul ator embedded pentru bordul unui autoturism folosind
comu nicația CAN elaborată în vederea susținerii examenului de finalizare a studiilor de
licență
la Facultatea de Automatică și Calculatoare ,
specializarea Automatică și Informatică Aplicată ,
din cadr ul Universității Tehnice din Cluj -Napoca,
sesiunea Iulie 2017 a anului universitar 2016 -2017 ,
declar pe proprie răspundere, că această lucrare este rezultatul propriei activități
intelectuale, pe baza cercetărilor mele și pe baza informațiilor obținu te din surse care au
fost citate, în textul lucrării, și în bibliografie.
Declar, că această lucrare nu conține porțiuni plagiate, iar sursele bibliografice au
fost folosite cu respectarea legislației române și a convențiilor internaționale privind
dreptur ile de autor.
Declar, de asemenea, că această lucrare nu a mai fost prezentată în fața unei alte
comisii de examen de licență.
In cazul constatării ulterioare a unor declarații false, voi suporta sancțiunile
administrative, respectiv, anularea examenului d e licență .
Data Prenume NUME
Vlăduț Dobră
(semnătura)
FACULTATEA DE AUTOMATIC Ă ȘI CALCULATOARE
SINTEZA
lucrării de diplomă cu titlul:
Simulator embedded pentru bordul unui autoturism folosind
comunicație CAN
Autor: Vlăduț -Alexandru Dobră
Conducător științific: Prof. dr . ing. Ioan Nașcu
1. Cerințele temei: implementarea unui afișaj analogic/digital ce va simula
accelerația, turația si treapta de viteză a motorului unei mașini.
2. Soluții alese: utilizarea microcontrolerelor de la STM, s -a folosit comunicația CAN
pentru transmiterea de informații, partea analogică are în componență două motoare
pas cu pas, iar cea digitală un LCD cu două linii.
3. Rezultate obținute: afișarea, prin controlul motoarelor pas cu pas si al LCD -ului, a
turației, vitezei si treptei prin tr-o comunicație CAN .
4. Testări și verificări: s-au efectuat teste atât pe partea de control al perifericelor
cât și pe partea de transmisii de date.
5. Contribuții personale: implementarea modului de funcțion are al dispozitivelor
utilizate.
6. Surse de d ocumentare: în mare parte din mediul online (site -uri de specialitate,
documentația componentelor, forumuri și în special tutoriale video ), dar și prin
schimburi de idei cu colegi sau profesori.
Semnătura autorului
Semnătura conducătorului știin țific
1
Cuprins
1 INTRODUCERE ………………………….. ………………………….. ………………………….. ………………………….. 2
1.1 CONTEXT GENERAL ………………………….. ………………………….. ………………………….. …………………….. 2
1.2 OBIECTIVE ………………………….. ………………………….. ………………………….. ………………………….. …… 3
1.3 SPECIFICAȚII ………………………….. ………………………….. ………………………….. ………………………….. … 3
2 STUDIU BIBLIOGRAFIC ………………………….. ………………………….. ………………………….. ……………….. 4
2.1 TRANSMITEREA DATELOR ………………………….. ………………………….. ………………………….. ……………… 4
2.1.1 Interfața paralelă si serială ………………………….. ………………………….. ………………………….. …. 5
2.1.2 Interfață serială sincronă și asincronă ………………………….. ………………………….. ………………. 6
2.1.3 Controller Area Network ………………………….. ………………………….. ………………………….. …….. 8
2.2 DESCRIEREA PLĂCII ………………………….. ………………………….. ………………………….. ……………………. 13
2.2.1 STM32L476RG Nucleo -64 ………………………….. ………………………….. ………………………….. …. 13
2.3 DESCRIEREA COMPONENT ELOR AUXILIARE ………………………….. ………………………….. …………………….. 15
2.3.1 Transceiver MCP2551 ………………………….. ………………………….. ………………………….. ………. 15
2.3.2 LCD ………………………….. ………………………….. ………………………….. ………………………….. ……. 16
2.3.3 Driver motor pas cu pas ………………………….. ………………………….. ………………………….. ……. 17
2.3.4 Motor pas cu pas ………………………….. ………………………….. ………………………….. …………….. 18
3 ANALIZĂ ………………………….. ………………………….. ………………………….. ………………………….. ……. 20
4 PROIECTARE ………………………….. ………………………….. ………………………….. ………………………….. . 21
5 IMPLEMENTARE ………………………….. ………………………….. ………………………….. ……………………… 23
5.1 DESCRIERE A PROGRAMELOR ………………………….. ………………………….. ………………………….. ………… 23
5.1.1 STM32CubeMX ………………………….. ………………………….. ………………………….. ……………….. 23
5.1.2 IAR Embedded Workbench ………………………….. ………………………….. ………………………….. .. 25
5.2 STADIILE PROIECTĂRII ………………………….. ………………………….. ………………………….. ………………… 26
5.2.1 Microcontroler 1 ………………………….. ………………………….. ………………………….. ……………… 26
5.2.1.1 Achizitie date ………………………….. ………………………….. ………………………….. ………………………….. 26
5.2.1.2 Modelul mașinii ………………………….. ………………………….. ………………………….. ………………………. 28
5.2.1.3 Configurația CAN ………………………….. ………………………….. ………………………….. …………………….. 32
5.2.1.4 Trimiterea datelor pe magistrala CAN ………………………….. ………………………….. …………………….. 35
5.2.1.5 Legatura fizica a comunicației CAN ………………………….. ………………………….. ………………………… 36
5.2.2 Microcontroler 2 ………………………….. ………………………….. ………………………….. ……………… 37
5.2.2.1 Continuarea legaturii hardware a comunicației CAN ………………………….. ………………………….. … 37
5.2.2.2 Receptia datelor de pe magistrala CAN ………………………….. ………………………….. …………………… 39
5.2.2.3 Programarea și conexiunile afișajului ………………………….. ………………………….. ……………………… 43
5.2.2 .4 Inițializarea motoarelor ………………………….. ………………………….. ………………………….. ……………. 47
5.2.2.5 Comandarea motoarelor ………………………….. ………………………….. ………………………….. ………….. 49
5.2.2.6 Înglobarea într -un sistem compact ………………………….. ………………………….. ………………………… 52
6 CONCLUZII ………………………….. ………………………….. ………………………….. ………………………….. …. 53
6.1 REZULTATE OBȚINUTE ………………………….. ………………………….. ………………………….. ………………… 53
6.2 DIRECȚII DE DEZVOLTAR E ………………………….. ………………………….. ………………………….. …………….. 54
7 BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. …………………………. 54
Introducere
2 1 Introducere
1.1 Context general
Comunicația dintre un emițător și un re ceptor, în ceea ce privește
microcontrolerele, are nevoie de o legatură și de o înțelegere reciprocă a comunicației ce
urmează a fi folosită. Această legatură poat e sa fie prin fir sau fără fir. Odată stabilită o
conexiune între emițător și receptor se pot crea diverse aplicații.
O aplicație de acest gen este descrisă în aceast ă lucrare, ce dorește a folosi dou ă
microcontrolere STM32L476RG conectate între ele prin fire și componente auxiliare.
Prin respectiva aplicație se poate vedea modul în care se realiz eaza comunicația într -un
sistem înglobat al unui board de autoturism. Comunicația se face printr -un protocul
numit CAN (Controller Area Network) , ce reduce numarul de fire necesare pentru a
transmite informații la componentele care compun sistemul.
Protocol ul CAN permite microcontrolerelor și dispozitivelor acestora s ă comunice
în aplica ții fără a fi necesar un calculator gazd ă pentru gestionarea re țelei de
comunicație. Acest protocol este folosit în special în industria auto.
Transmiterea datelor se realize aza cu o viteză suficient de mare pentru a nu exista
probleme de întârziere. Siguranța transmiterii datelor este de asemenea prezentă, având
un rol important în schimbul de înformații.
Odata stabilită conexiunea microcontrolerelor are loc conectarea tuturo r
perifericelor.
Primul microcontroler (ce va tine locul de CAN master) , va avea o rezistență
variabilă (potentiometru ) prin care se vor introduce date fizic în sistem și un dispozitiv
de emisie -recepție folosit în comunicarea CAN.
Transmiterea informat iei prin magistrala CAN, numita si CAN Bus, va fi însoțită de
doua tranceivere (dispozitivele de emisie -recepție) MCP2551 , doua rezistente de 120 Ω
si doua de 1kΩ . Acestea din urm ă (tranceivere si rezistente) vor servi în a face legătura
între protocolul C AN de pe microcontroler si magistrala fizica pe care o completeaza.
Al doilea controler deține partea mobilă și grafică a proiectului. El va avea un
dispozitiv de emisie -recepție identic cu cel al primului controler, va controla două
dispozitive specializa te în controlul motoarelor pas cu pas, motoare ce se regăsesc și ele
în acest proiect, și va mai controla un display LCD.
Programele pentru controlere vor fi incarcate de pe un laptop, iar apoi
controlerele se vor desurca singure. Alimentarile vor fi ofer ite de catre calculatorul
gazda pentru microcontrolere si de catre o sursa externa de 9V pentru motoare.
Structura lucrării permite implementarea cu succes a aplicatiei amintite. Mai întâi
se va discuta despre aspecte teoretice de care vom avea nevoie în p unerea în funcțiune a
dispozitivelor. În capitolul trei se va analiza aplicația, iar în capitolul patru se va indica
fiecare dispozitiv unde va fi situat si cum. Capitolul cinci constituie pașii concreți
Introducere
3 necesari în realizarea aplicației. Primul pas va fi legat de mediul de programare al
microcontrolerelor, iar apoi vom implementa incepând cu primul microcontroler și
terminând apoi cu cel de -a doilea. În cele din urma vom avea un capitol destinat
concluziilor ș i al directiilor de dezvoltare ulterioară.
1.2 Obiective
Obiectul principal este de a controla motoarele si display -ul printr -o comunicație
de tip CAN. Printre celelalte obiective se numară felul în care se produce acest control,
mai precis simularea unei accelerații de la un autovehicul și afișarea rezu ltatelor acestei
accelerari.
Prin urmare, la introducerea datelor in sistem(acceleram), un model matematic va
interpreta aceste date si va genera o anumita viteza si o anumita turatie ce vor fi
transmise celuilalt microcontroler. Aici turația si viteza vor fi afisate fiecare printr -un
motor pas cu pas, aceasta afisare analogic fiind insotita si de una digitala materializata
printr -un afisor LCD pe care se va pune la vedere informatia legata de treapta de viteza
in care se afla autoturismul.
Modelul matemati c al sistemului determina poziția indicatoarelor noastre. De
aceea, în functie de ce regasim în acel model, așa se vor manifesta si datele de ieșire.
Ieșirile acestui sistem vor fi motoarele si indicatorul digital. Vom pozitiona pe
capatul mobil al motoar elor, ace indicatoare pentru vizualizarea rezultatelor.
1.3 Specificații
În vederea realizării aplicației se vor folosi doua programe:
• CubeMX, cu ajutorul caruia va avea loc setarea pinilor ce urmeaza a fi utilizati in
aplicatie, gestionarea configuratiei ce asului microcontrolerului in vederea opținerii
rezultatelor dorite intern sau extern si configurarea perifericelor si protocoalelor alese.
• IAR Embedded Workbench pentru programarea în C a STM -urilor.
Programele pentru controlere vor fi incarcate de pe un PC, iar apoi controlerele se
vor desurca singure, cu exceptia alimentarii care se va face de la dispozitivul gazda.
Cea de -a doua alimentare va fi necesara pentru partea de putere a driverelor
folosite la motoare. Pentru a satisface această cerință vom f olosi o baterie de 9V ce va
alimeta cu energie ambele motoare.
Studiu bibliografic
4 2 Studiu bibliografic
2.1 Transmiterea datelor
Transmisia de date între microcontrolere se poate face folosind fire (cabluri din
cupru, fibră optică) sau folosind o comunicație fără fire (wirele ss) prin raze infraroșu
sau unde radio.
Transmiterea datelor prin mediul wireless necesită dispo zitive periferice atașate
microcontrolerului ce ulterior vor fi folosite pentru a trimite date spre un alt dispozitiv
ce captează aceste unde.
Folosirea acestu i tip de comunicație are avatanjul de a reduce drastic numărul de
conexiuni fizice (cablaj) și p osibilitatea de a modifica poziția lor î n spațiu cu ușurintă.
Conexiunea wireless nu este me reu cea mai bună în orice situaț ie deoarece pot aparea
interferen țe între dispositive ș i suntem limitați de raza de acț iune a emițătorului ș i al
receptorului.
Transmiterea datelor folosind un mediu fizic nu necesita dispoz itive auxiliare. În
marea majoritate a cazurilor sun t necesare conexiuni prin fire î ntre controlere,
rezistente pentru liniile de conexiuni sau cipuri de emisie -recepție (transceiver).
Acest mediu robust de conexiune da o garantie in plus a eficientizarii si al
corectitudinii transmiterii datelor , o viteza mai mare a comunicației si un cost redus.
Pentru realizarea unei conexiuni si a unei comunicatii totodata intre mai multe
microcontrolere este nevoie de un studiu in prealabil asupra modului de operare al
aplicatiei, mediul de lucru, costuri, distanta de la care trebuie sa comunice dispozitivele
si tipul de utilizatori ce va folosi sistemul ce urmeaza a fi conceput . Toate aceste
variabile trebuie puse in balanta si ales apoi modul de abordare.
Mediul fizic, prin cablu, în cazul microcontrolerelor, are mai multe tipuri de
protocoale ce pot fi utilizate. În functie de ce dorim sa facem în proiect trebuie ales
protocolul cel mai indicat pentru realizarea transmiterii si receptiei de date. Putem
aminti câteva protocoale de comunicație: SPI, I2C, UART, CAN, USB, Ethernet, PCIe.
Fiecare protocol este indicat î n a fi folosit pentru anumite tipuri de operatii, de
exemplu: Ethernet este utilizat pentru microcontrolere ce au acces la internet, PCIe
pentru transmiterea a mari cantitati de date cum ar fi imagini, USB prin intermediul
careia incarcam programele pe micro controler, I2C folosit la transmiterea datelor
sincronizate necesitand conexiunea a doar doi pini de pe microcontroler (SDA si SCL).
Electronica înglobată (embedded) se bazeaz ă pe interconectarea dispozitivelor,
senzorilor sau a altor circuite integrate pentru a crea un sistem. Pentru a putea
comunica independent între ele, mai exact să fac ă schimb de date, aceste circuite trebuie
să ai bă un protocol de comun icație comun. S -au dezvoltat multe tipuri de protocoale de
comunicație pentru a se realiza acest lucru. Putem să le separăm in două grupe: seriale și
paralele.
Studiu bibliografic
5 2.1.1 Interfa ța paralel ă si seria lă
Interfața par alelă transferă mai mulți biți în același timp. Se folosesc multe fire,
datele fiind transmise in pachete mari. În figura 2.1 se poate vedea un astfel de transfer,
pe fiecare s ăgeată se va transmite cate un bit ce va forma mai apoi un byte. La fiecare
impuls de ceas, se vor transmite d e la ieșirea 0 ->7 spre intrarea 0 ->7 c âte un bit . În
această schemă sunt ne cesare 9 fire pentru conectare.
Figura 2.1
Comunicația paralela are avantajul de a fi rapida, direct ă și relativ simplu de
folosit . Dezavantajul îl constituie numărul mare de pini de intrare/ieșire ce trebuie
folosiț i si multe leg ături fizice (cabluri suplimentare) .
Interfața serial ă transmite datele diferit de cea paralel ă. Transferul se face pe râ nd,
asem ănător unui tren , bit dup ă bit. Aceast ă interfață poate opera pe un num ăr redus de
fire, poate fi chiar ș i un singur fir, î n cazul din figura de mai jos sunt doar două fire, unul
pentru date și unul pentru ceas.
Figura 2.2
Un exempl u pra ctic legat de cele două interfeț e ar fi asemănarea interfeței paralele
cu o autostrad ă cu opt benzi pe sens , iar cea serială cu un drum comunal cu o band ă pe
sensul de mers. Prin urmare, autostrada cu o pt benzi este mult mai eficientă ,
autovehiculele putând înainta cu viteze mari intr -un numar mult superior celui cu o
band ă pe sens, dar pentru zona unde este situat drumul mai îngust este suficien t, facând
Studiu bibliografic
6 față traficului de mașini din zonă. Costurile pentru autostradă sunt semnificativ mai
mari față de drumul comunal. Concluzia ar fi ca tre buie adaptat modul de abordare î n
funcție de cerinte.
2.1.2 Interfață serială sincronă și asincronă
De-a lungul anilor au apă rut o mul titudine de protocoale seriale, cu posibilitatea
de a fi folosite î ntr-un sistem îngloba t. Dou ă dintre cele mai cunoscute și util izate
protocoale sunt Ethernet ș i USB (Universal Serial Bus). Alte interfete foarte răspândite
sunt SPI (Serial Peripheral Interface), I2C (Inter -Integrated Circuit), UART (Universal
asynchronous receiver/transmitte r), CAN (Contro ller Area Network) etc.
Interfața serial ă sincron ă își sincronizează liniile de date cu un semnal al ceasului
microcontrole rului, pentru c a toate dispoziti vele din aceasta magistrala sa î mpart ă un
impuls de ceas comun. Asta face ca interfa ța serial ă sincron ă să fie robust ă, rapidă, dar
necesită î ntotdeauna o legatur ă în plus î ntre dispozitivele de comunicare. De exemplu:
SPI si I2C (SCL – linia de ceas, SDA – linia de date).
Interfa ța serial ă asincronă se refer ă la transmiterea de date f ără a avea influența
unui impuls de ceas. Pentru un caz în care ne dorim minimizarea num ărului total de
conexiuni (fire) și pini de intrare/ie șire aceast ă metod ă este de interes major.
Mecanismul pentru pastrarea ro busteții și al lipsei de erori î n transferul d e date, datorit ă
lipsei unui ceas extern, are câ teva regului.
Aceste reguli sunt necesare pentru a fi siguri de buna funcț ionare a comunicației.
Dispozitivele de pe o magistrala de acest gen trebu ie configurate identic pentru a putea
utiliza acela și proto col. Acest set de reguli se refera la:
• Viteza de transmitere a datelor pe linia serial ă (numita si Baud Rate), de
obicei exprimat ă in biți pe secunda (bps). Aceast ă valoare determin ă cât timp
emițătorul ține linia serială pe 1/0 logic sau ce perioad ă este necesar ă pentru
dispozitiv s ă eșantioneze linia de date.
Baud rate poate s ă fie aproape orice valoare. Singura cerință este ca fiecare
dispozitiv s ă functioneze la aceea ș valoare. Cea mai intalnita rata este de 9600 bps.
Cu c ât este mai mare cu atat datele sunt transmise sau recepț ionate mai repede.
Printre cele mai mari viteze se numar ă cea de 115200 bps, ce este destul de rapid
pentru multe controlere.
Dacă se introduce o vitez ă prea mare, ceasul intern și configura ția
microcontrolerului nu mai fac fa ță și se vor trimite date eronate.
Studiu bibliografic
7 In fig. 2.3 avem un exemplu de date trimise cu o vitez ă prea mare (921600 )
Figura 2.3
În fig. 2.4 avem un exem plu de date trimise cu o configura ții dif erite.
Figura 2.4
• Divizarea datelor (Data frame). Datele sunt transmise sub forma unui
frame de bi ți. Aceste frame -uri sunt create adaug ând biți de paritate ș i biți de
sincronizare blocului de date. Un exemplu se poate vedea mai jos fig. 2.5:
Figura 2.5
Studiu bibliografic
8 • Biții de paritate sunt o metod ă foarte simpl ă de verificare a erorilor. Bitul
de p aritate poate s ă fie 0 sau 1 pentru a face num ărul de biți de 1 sa fie ori “even”
ori “odd”. Când transmitem date electronic, se poate întampla ca biții s ă-și schimbe
eronat starea din 1 în 0 sau invers.
De exemplu, avem biți i 10010 cu bitul de paritate 1 rezulând secventa
100101. Aceast ă informa ție transmis ă unui alt calculator, ajunge cu o eroarea
100001. Calculatorul receptor verific ă daca datele sunt corecte adun ând biții de 1 ,
iar suma lor o împarte la 2, restul rezultat fiind bitul de paritate. Daca restul
împarț irii este egal cu bitul de paritate recep ționat atunci informa ția va fi “even”
daca nu, va fi “odd”. În cazul î n care este “odd” se va cere retrimiterea datelor p ână
când acestea vor fi corecte.
• Biți de start și de stop , sau biți de sincronizare, sunt doi sau trei biți
transferați cu fiecare pachet d e date. Dup ă cum le spune și numele aceș ti biti
constituie delimita rea pachetului de date trimis. Î ntotdeauna exist ă un singur bit
de start însă biții de stop pot fi doi, depinde cum este configurat protocolul
respectiv(de obicei este doar unul).
• Datele din frame sunt cele mai importante, pe ele dorim să le trimitem î n
mod special, celelalte campuri de biți ajut ând doar la buna realizare a acestui
transfer.
Consider ând un frame cu dimensiunea datelor de 8 biți, adic ă un octet
(byte, cel mai des întâ lnit) , trebuie s ă se specifice și cap ătul de la care citim datele ,
numit și endian. De obicei se consider ă primul bit citit ca fiind cel mai
nesemnificativ bit (LSB) din zona de date, dar se poate considera și ca cel mai
semnificativ bit (MSB).
2.1.3 Controller Area Network
Dezvoltarea industriei automobilelor a fost cauza principal ă a necesita ții
acestui protocol. Cererea foarte mare de autovehicule a determinat aceast ă
dezvoltare, fiecare produc ător aduc ând ceva nou at ât în ceea ce prive ște design –
ul ma șinii c ât și al aerodinamicii, al motorului, al transmisie sau al altor
dispozitive (radio, ventila ție, naviga ție etc).
Inițial toate leg ăturile electronice erau realizate prin cabluri. Adaug ând tot
mai multe dispozitive electronice autovehiculului au fost necesare tot mai multe
legături, implicit tot mai multe cabluri. Asta n -a făcut dec ât să creasc ă greutatea
mașinii, s ă măreasc ă costurile de produc ție datorit ă multitudinii de cabluri și al
personalului de manufacturare. Pentru a elimina acest impediment produc ătorii
au încercat s ă înlocuiasc ă aceasta conexiune prin cabluri cu o conexiune de tip
retea de calculatoare, reduc ând costurile, materialele folosite, complexitat ea ș i
greutatea ma șinii. Î n 1985 Bosch a propus Controller Area Network, protocol ce
a devenit mai t ârziu un standard. Putem aminti standardele ISO 15765 pentru
automobile, J1939 pentru tractoare si masini industriale DeviceNET sau
CANopen.
Studiu bibliografic
9 Avantajul acestui protocol este dat de posibilitatea conect ării la
computerul de baza al masinii, zis si ECU (Elec tronic Control Unit), prin
magistral a CAN (CAN Bus).
Figura 2.6
In figura 2.6 putem observa diferen ța de conexiuni dintre o re țea fără CAN ( foarte
multe fire) ș i o retea cu CAN.
Controlerul CAN este sofisticat. Aproape toat e acțiunile ce le face acest protocol
sunt controlate de c ătre controler cu o foarte mic ă interven ție din exterior (PC). Idea de
bază este sa configur ăm control erul prin scrierea î n regi ștrii lui și să-i introducem date,
de transmiterea mesajului pe magist rală se ocupa el. Controlerul cite ște toate frame –
urile detectate pe magistral ă si le pastreaza într-un FIFO. Apoi va notifica calculatorul
central de existenta datelor din fra me, date ce vor fi preluate de calculatorul central.
Controlerul mai con ține un mecanism de filtrare ce poate fi programat s ă ignore unele
mesaje CAN ce nu se doresc a fi prelucrate.
Tranceiverele CAN ajut ă și mai mult re țeaua, contribuind pr intr-un mediu mai
stabil ș i mai eficient f ără a fi nevoie de cabluri scumpe și sofisticate. El are doua sarcini
de indeplinit:
• Recep ție- adapteaz ă semnalele primite de pe magistral ă pentru a putea fi
interpretate de controlerul CAN, are si un rol de protec ție;
• Transmitere – converte ște biții primi ți de la controler î ntr-un semnal ce îl va
trim ite pe magistral ă;
În figura de mai jos (fig 2.7) este prezentată o schem ă general ă a unei magistrale
CAN cu n noduri. Fiecare nod este format dintr -un microcontroler cu protocol CAN (nod) ,
un tranceiver C AN și leg ăturile MCU -Tranceiver -magistral ă CAN.
Studiu bibliografic
10
Figura 2.7
În mod normal magistrala CAN este formata din 2 fire reprezentate de CANH (CAN
High) și de CANL (CAN Low) ce conectează toate dispozitivele din rețea. Cele dou ă linii
CAN au aceeaș secvență de date, dar au a mplitudini opuse. Deci dacă un impuls pe linia
CANH va merge de la 2.5V la 3.75V atunci impulsul corespunzator de pe linia CANL va
merge de la 2.5 V la 1.25V. Transmițând datele î n felul acesta, în impulsuri egale ca
poziție ș i amplitudini opuse , se permite o imunitate mare la z gomot și șanse mai mari ca
datele să nu fie eronate.
Figura 2.8
Dupa cum se poate observa și î n figura de sus, un bit ce are o diferen ță de tensiune
de 2.5V va fi un bit dominant ( 0 logic), i ar un bit ce va avea o diferentă de tensiune între
CANH si CANL de 0V el va fi recesiv (1 logic).
Controlerul CAN prime ște datele de la integratul afla t în microcontroler ce face
functiile de CAN ( acest ansamblu controler+integrat CAN este cunoscut ca si nod CAN).
Microcontrolerul proceseaz ă datele și le trimite tranceiverului CAN. Microcontrolerul ce
utilizeaz ș acest protocol CAN poate s ă și primeasc ă date de la tranceiverul CAN, le
proceseaz ă și le trimite zone i destinate lucrului cu interfața CAN. Tranceiverul este un
dispozitiv de emisie -recepție . El convertește datele , ce controlerul CAN le trimite ca
Studiu bibliografic
11 semnal electric, și le trimite pe magist rală. De asemenea primeș te date pentru
microcontroler, date pe care le convertește cu scopul de a fi percepute de controler. La
capătul magistralei se g ăsesc rezistente, de obicei de 120Ω. Aceste previn ca datele
trimise s ă se reflecte la capete ș i să fie trimise î napoi ca ecouri.
Transferul de date in cadrul protocolului CAN are urmatoarele etape: achiziția
datelor, trimiterea datelor, recepționarea datelor, v erificarea și acceptarea datelor.
• Achiziția datelor: nodul CAN aduce date controlerului CAN pentru transfer;
• Trimiterea datelor: dispozitivul de emisie -recepție prime ște date de la
controlerul CAN, le convertește in semnal electric și il
trimite înapo i in rețea;
• Primirea datelor: toate nodurile CAN conectate la rețea (magistral ă) devin
zone de recepție;
• Verificarea datelor: nodul CAN verifică dacă a primit informația cerută;
• Acceptarea datelor: dac ă datele primite sunt importante ele vor fi accep tate
si procesate, daca nu, ele vor fi ignorate.
Figure 2.9
Studiind mai de aproape fenomentul, aflăm că sistemul CAN este împărțit în două
în ceea ce prive ște mesajele. Așadar avem mesajul 2.0A si 2.0B, cele dou ă standarde de
mesaje di feră prin marimea num ărului de biți (a identificatorilor -ID):
Standard CAN (2.0A) folosește 11 biți de identificare în zona de mesaj.
Extended CAN (2.0B) folosește 29 biți de identificare, acesta este compus din cei
11 biți de identificare de la 2.0A, co nsiderați biți de bază și 18 biți suplimentari.
Figure 2.10
Studiu bibliografic
12 SF(Start Field): indic ă inceputul mesajului cu un bit dominant. De exemplu un bit
cu 3.75V este transmis pe linia CANH și un bit de 1.25 V este transmis pe linia CANL,
diferen ța va fi de 2.5V prin urmare vom avea un bit dominant .(1 bit)
Mesajul de identificare : defineste nivelul de prioritate al protocolului de date.
Daca doua noduri vor sa transmita in acelasi timp date, nodul CAN cu cea mai mare
prioritate va avea întâietate. Cu cat valoarea este mai mica, prioritatea mesajului va fi
mai mare. Totul depinde de standardul folosit (ID=11 sau ID=29). (11 sau 29 biți)
Control (cunoscut si ca zona de verificare): ne arat ă num ărul de c âmpuri de
informa ție ce vor fi în zona de date. Acest c âmp permite oric ărui receptor s ă verifice
dacă a primit toate informa țiile ce i -au fost transferate. (6 biți)
Date (sau z ona de date): din aceasta zonă sunt preluate datele și transmise c ătre
alte noduri CAN. (până la 64 biți)
CRC (Cyclic Redundancy Check) cunoscut ă și ca zona de siguran ță, con ține 15 biți
de cod și un bit delimitator recesiv. Acest c âmp este folosit pentru a determina
transferul eronat de date. (16 biți)
ACK (Acknowledge Field) numită și zona de confirmare, aici receptorii anun ță
emițătorii c ă au primit datele corect . Daca se detecteaz ă o eroare, se anun ță emițătorul
imediat. Emițătorul transmițând datele din nou la aflarea acestei “vești” . (2 biți)
EF(End Field): indica sf ârșitul protocolului de date. Este ultima posibilitate de a
semnala o eroare în transmisie. Daca nu apare acest set de date atunci mesajul se va
retrimite. (7 biți).
Într-un sistem CAN nu exi stă o componenta de tip master ce controleaz ă
transmisia și recepția de date între noduri. Când un nod CAN este gata sa transmit ă un
mesaj, verific ă statusul magistralei, iar daca este liberă trimite un mesaj(frame) în rețea.
Frame -urile CAN ce sunt transm ise nu conțin adrese exacte ale nodurilor de unde
trebuie s ă primeasc ă mesaje sau unde trebuie s ă transmit ă mesajele, în schimb ele au un
ID de identificare unic în rețea prin care se eticheteaz ă.
Toate nodurile CAN din rețea primesc fram e-ul CAN și depinz ând de ID -ul de
identificare transmis cu mesajul , fiecare nod decide dac ă accept ă sau nu acest mesaj
recepționat.
Dacă mai multe noduri vor s ă transmit ă în rețea în același timp se va ține cont de
prioritați. Prioritatea cea mai mare (cu ID de arbitrare ce l mai mic) prime ște automat
acces la magistrală. Cele cu prioritate mai mic ă așt eapt ă până când magistrala devine
disponibilă pentru a putea trimite informații.
Studiu bibliografic
13 2.2 Descrierea plăcii
2.2.1 STM32L476RG Nucleo -64
Seria placilor STM32 Nucleo este o serie low -cost, ușor de folosit și de programat.
Este compatibilă cu o gam ă mare de extensii, conectica este asemanatoare si compatibil ă
cu numeroase dispositive (are î n componen ță conexiuni Arduino Uno R3 si ST morpho).
Integreaz ă un sistem de depanare cunoscut ca ST -Link Debugger. Partea software vine
cu library HAL (Hardware Abstraction Layer) și o multitudine de exemple ce pot fi
testate și studiate folosind diverse medii compatibile de programare: IAR EWARM, Keil
MDK -ARM sau ARM mbed online .
Figura 2.11
Placa Nucleo -L476RG are cea mai mare memorie flash (1 MB) din seria Nucleo -64
și o vitez ă 128-KB SRAM . Un processor ARM Cortex -M4 cu o frecventa de 80 MHz , dou ă
tipuri de conexiuni Arduino Uno si ST morpho si un debugger Embedded ST -LINK/V2 -1.
Placa mai are posibilitatea interfa țării pinilor, ceasului si al protocoalelor cu un program
numit STM32CubeMx.
Alimentarea se poate face at ât de la un PC printr -un cablu USB c ât si de la o surs ă
extern ă. Alimentarea prin cablu mini -USB se face prin portul CN1 (ST-LINK USB) c ând
avem jumperul JP5 pus pe pinii 1 si 2 adic ă spre U5V ( fig. 2.12). Daca dorim sa alimentam
de la o alta surs ă va trebui sa mut ăm jumperul pe pinii 2 si 3 adic ă spre E5V ( fig. 2.13).
Figura 2.12 Figura 2.13
Studiu bibliografic
14
Pe placa STM32L476RG putem distinge urmatoarele particularitati:
• Un LED tricolor (verde, portocaliu si ro șu) LD1; acest led ofer ă informa ții
despre statusul co municației cu ST -LINK. Culoare implicit ă a LED -ului este ro șie.
Se face verde atunci c ând indic ă o comunicare î n curs între PC și ST -LINK/V2 -1,
cu urmatoarele particularit ăți:
– LED roșu când conexiune a între PC si ST -LINK este complet ă;
– LED verde dupa o con exiune recent ă realizat ă cu succes;
– Oscila ție roșu/verde în timpul comunicării cu PC -ul;
– LED portocaliu înseamna o comunicare eșuată;
– Roșu intermitent atunci cand am conectat dispozit ivul la
tensiune dupa ce am iniț ializat o altă comunicare.
• Un LED tip u tilizator, un LED verde pe care î l putem folosi (I/O PA5).
• Un LED ro șu ce anun ță că STM32 este alimentat și +5V sunt disponibili.
• Un but on pentru utilizator (I/O PC13).
• Un buton pentru reset, acest buton este folosit pentru a reseta
microcontrolerul. În figura 2.11 se pot observa aceste particularit ăți, iar în
figura 2.14 sunt pinii de intrare/ie șire ai pl ăcii.
Figura 2.14
Aceast ă plac ă are numeroase componente și periferice înglobate ce pot fi
utilizate. Amintim cele mai i mportante și cele mai utilizate dintre ele:
ADC=3, CAN=1, I2C=3, RCC=1, SPI=3, TIM=11, UART=5 etc .
Studiu bibliografic
15 2.3 Descrierea componentelor auxiliare
În vederea ob țineri i unui sistem controlat prin CAN vom implica mai multe
dispositive periferice . Pentru a afi șa și a ajut a la afi șarea datelor ob ținute din
comunicația dintre microcontrolere prin magistrala CAN.
2.3.1 Transceiver MCP2551
MCP2551 este un dispozitiv pentru CAN, de mare viteza, cu toleranta la eroare, ce
serveste ca intermediar între un protocol CAN al unui microcont roler și o magistrală
fizică. Functioneaz ă la viteze de pana la 1 Mb/s.
În mod normal fiecare nod CAN din sistem trebuie sa aib ă o component ă ce va
converti semnalul digital generat de un microcontroler CAN în semnale ce vor putea fi
transmise pe magistra la CAN. De asemenea poate oferi un tampon între controlerul CAN
și zgomotul ce se poate genera pe magistrala din partea surselor externe (interferen țe
electromagnetice, designul circuitului sau varia ții ale tensiunii de alimentare). În figura
2.15 este pr ezentata schema emițător -receptor -ului :
Figura 2.15
Descriere pini:
RXD(4) – recepționează date de pe magistrala CAN
CANL(6) – reprezint ă voltajul minim din magistral ă
CANH(7) – reprezint ă voltajul maxim din magistral ă
VSS(2) si VDD(3) – sunt GND, respectiv 5V
TXD(1) – conectat la Tx -ul controlerului
RS(8) – se alege modul de operare (H -Speed,Slope -Control sau Standby)
VREF(5) – tensiune de referin ță (definit ă ca VDD/2)
Studiu bibliografic
16 2.3.2 LCD
1602A QAPASS este un LCD de caractere industrial. Din denumir ea lui putem
extrage informa ții referitoare la num ărul de linii, coloane si caractere. El fiind asociat și
cu denumirea de 16 x 2 LCD, venind de la un LCD cu 16 coloane și dou ă rânduri (fac ând
un total de 32 de caractere).
LCD -ul are urm ătorii pini:
• VS S – reprezent ând ground -ul dispozitivului
• VDD – tensiunea de alimentare
• V0 – intensitatea luminoas ă a scrisului (rezistenta variabil ă)
• RS – selectarea registrului (H: Date IN, L: Instructiun IN)
• R\W – selectia tipului de comand ă (H: Citire, L: Scriere)
• E – permite instruc țiunii s ă treac ă
• D0,D1,D2,D3,D4,D5,D6,D7 – zona de date (se poat utiliza 4 sau 8 biți)
• A – anodul ecranului, conectat la 5V lumineaza in “high -power”
• K – catodul ecranului, de conectat la GND
Anodul și catod ul dac ă sunt cupla ți la VCC respectiv GND, ecranul va func ționa î n
modul high -power, adic ă va fi luminat complet. Dac ă nu se fac conexiunile între ace ști
doi pini, ecranul va func ționa în modul low -power , ecranul va fi vizibil dar cu o
intensitate mult red usă.
Figura 2.16
În figura de mai sus este afi șat un mesaj pe un astfel de LCD.
Exist ă un modul special pentru aceste display -uri care ajut ă la comunicarea cu
microcontrolerul mult mai u șor. Se conecteaz ă dispozitivul respectiv (de exem plu
PCF857AT) la LCD 16×2 și prin protocolul I2C se face legatura cu controlerul doar prin
doua fire (SCL si SDA). Aceast ă reducere de fire se face doar pentru biții de date,
aliment ările r ămân aceleaș.
Studiu bibliografic
17 2.3.3 Driver motor pas cu pas
A4988 este un driver pentru motoarele pas cu pas bipolare ce ofer ă mai multe
moduri de func ționare: fullstep(pas întreg), halfstep (jumatate de pas 1/2),
quarterstep(sfert de pas 1/4), eighthstep (optime de pas 1/8) si sixteenthstep
(șaisprezecime de pas 1/16).
Driverul poate funcț iona cu motoare ce necesit ă o tensiune de alimentare de p ână
la 35 V și in jur de 2 A.
Implementarea este simpla. Datori tă translatorului inter a driverului este de
ajuns ă introducerea unui puls pe intrarea STEP iar motorul va primi un semnal de a se
mișca un pas. Nu are tabele cu secven țe de faz ă, controlul liniilor de frecvent ă înalt ă sau
interfe țe complexe de programat. A4988 este ideal pentru aplica ții unde un procesor
complex nu este disponibil sau este suprainc ărcat.
Tabelul de adev ăr pentru modurile de func ționare a rezolu ției pa șilor este
prezentat mai jos, iar sub tabel este o imagine cu driverul respectiv ( fig. 2.17 ):
Figura 2.17
Studiu bibliografic
18 Driverul are in total 16 pini. Ei au urm ătoarea distribu ție: un pin de ground și unul
de alimenta re a cipului ac țiune ce se va face de pe microcontrolerul folosit (între 3 și 5.5
V); patru pini de ie șire p rin care se va comanda motorul ș i anume pentru prima faz ă 1A
și 1B și a dou ă fază cu 2A și 2B (aceste a patru vor fi conectat e la motor); un pin de g rond
și unul de alimentare al motorului ce suport ă o tensiune de alimentare intre 8 si 35 V
fiind indicat s ă se mai lege între cele dou ă fire un condensator de 100μF pentru a rejecta
eventualele oscila ții venite de la motor; un pin de direc ție numit DIRECT ION, acest pin
de intrare va determina direc ția de deplasare a rotirii motorului; un pin pentru pa și
numit STEP, acest pin este tot de intrare ș i la fiecare puls va e xecuta un pas; un pin de
reset ș i unul de sleep, aceș ti doi pini se leag ă de cele mai mul te ori î ntre ei pentru a avea
pe reset valoarea 0 logic ce va determina puner ea motorului în func țiune (pinul de sleep
se folose ște atunci cand este dorit ă economisirea energiei electrice în cazul î n care
motorul nu are nici o comand ă de executat); urmatori i pini: MS1 , MS2 , MS3 sunt pinii ce
determin ă modul de executare a pa șilor, ace ști trei pini sunt pini de intrare, dac ă sunt
lăsați in gol driverul va functiona î n modul de fullstep, daca sunt activa ți toți cu 5V atunci
driverul va func ționa î n modul micro step (sixteenth steps); ultimul pin, cel de enable
este folosit la activarea ieșirilor sau la dezactivarea acestora, dac ă este l ăsat î n aer, fiind
activ pe 0 , acest a activează ieș iriile și rela ția driver+motor va avea loc cu succes.
Acest tip de drivere au un mic potenț iometru pe ele. Cu ajutorul lui se poate regla
tensiunea de referin ță cu care va func ționa driverul. Valoarea maxim ă a limitei de curent
este determinata de rezisten țele de pe driver RS. Intensitatea curentu lui maxim este
dată de formul ă:
(2.1)
Unde, Vref este tensiunea masurată la capetele poten țiometrului și al ground -ului
de pe driver conectat la microcontroler, Rs este rezisten ța de selec ție care î n cazul
acestui driver este de 0.1Ω .
2.3.4 Motor pas cu pas
Acest tip de motor, cunoscut în literatur ă de specialitate ca “stepper motor”, este
un motor de curent continuu f ără perii. Conceptul acestui motor este, dupa cum ii spune
si numele, un motor cu pasi discret i. Motorul are mai multe bobine grupate dou ă câte
două în faze . Aceste bobine se reg ăsesc în statorul motorului (partea static ă). Polariz ând
fiecare faz ă in parte , în secven țe bine stabilite, rotorul (partea mobilă) a motorului se va
roti c âte un pas odat ă datorit ă magnetului aflat în rotorul motorulu i. În func ție de
numărul de din ți pe care rotorul î l are, mi șcarea va fi caracterizat ă de fluen ță sau
sacad ări. Dac ă are un num ăr mare de din ți rota ția va fi mai fin ă, dac ă numărul de dinți
este mic rotaț ia va fi caracterizat ă de o sacadare la fiecare pola rizare.
Modul în care s e face polarizarea bobinelor în statorul motorului determină
comportamentul rotorului. Exist ă mai multe moduri de operare a acestor polariz ări.
Amintim c âteva moduri :
– Wave drive : fazele sunt polarizate pe r ând, câte una, î n ordine,
rotorul aliniindu -se mereu cu zona polarizat ă;
Studiu bibliografic
19 – Full drive : fazele sunt polarizate in pereche, dou ă câte dou ă,
rotorul ajung ând în zona dintre doua faze al ăturate;
– Half drive : fazele se polarizează combinând wave drive si full
drive astfel: se polarizează o fază , apoi ace eaș faz ă cu
urmatoarea, ca mai apoi s ă se polarizeze doar a doua fază.
Procedeul continu ă asemanator și cu celelalte faze din stator.
Rotorul se alineaz ă atât în dreptul fazelor cât și între ele. Acest
lucru cre ște rezolu ția motorului.
Un m od de control al motorului mult mai fin este “microstepping”. Acesta poate s ă
împartă pașii până la 256 de ori, facând pașii mici și mai mici. Acest tip ce polarizare
folose ște dou ă sinusuri de 90°. În acest mod, motorul va fi foarte silențios și fară
saca dări detectabile. Controlând direcția și amplitudinea curentului c e trece prin
înfășurări, cresc caracteristicile motorului. Vibrațiile sunt mai mici și deplas ările mai
fluente. Aplic ând polariz ări de tip sinus, curentul va cre ște într-o înfășurare și va
descre ște î n cealalt ă rezult ând o rota ție a rotorului fluen tă și progresiv ă.
Figure 2.18
Exist ă mai multe tipuri de motoare pas cu pas, și anume: motor pas cu pas cu
magnet permanent, sincron hibrid și cu reluctan ță variabil ă(alinierea rotorului cu
statorul se face cu un spațiu minim între dinți) . Un exemplu de motor este mai jos:
Figura 2.19
Analiză
20 3 Analiză
În cele ce urmează se va proiecta un sistem înglobat ce va simula un bord auto al
unui autoturism. Aceast ă simulare va cuprinde un afișaj grafic și dou ă indicatoare
analogice ce vor reprezenta afi șarea rota ților pe minut a ma șinii, iar cel ălalt viteza în
kilometrii pe ora.
Pentru realizarea acestui proiect sunt necesare cuno știnte legate de programarea
microc ontrolerelor, limbajul C, operaț ii pe biți, transmisii de date, protocoale de
comunicație, func ționarea motoarelor pas cu pas, electronica de baz ă precum și
dexteritate cu obiecte mici și fragile.
Materialele folosite sunt urm ătoarele:
• Dou ă microcontrolere Nucleo -64 STM32L476RG
• Un afișaj LCD 1602A
• Dou ă motoare pas cu pas
• Dou ă poten țiometre B1k si B50K
• Dou ă transceivere MCP2551 pentru CAN
• Dou ă drivere pentru motoarele pas cu pas A4988ET
• Dou ă rezisten țe de 120 Ω și dou ă de 10k Ω
• O baterie 9V cu 1.5 A și un modul pentru cablare
• Doua breadboarduri pentru cablare
• Tipuri de fire (folosite): tată -tată(17), mamă -mamă(2), tată -mamă(28) și
jumpere rigide(18)
Pentru protec ție și aspect s -a folosit o cutie confec ționat ă din carton tare în care s –
au introdus toat e componentele utilizate.
Proiectarea software a “cluster -ului” s -a realizat cu un laptop Lenovo G580 cu
procesor i5, memorie de 4GB RAM ce ruleaza pe Windows 7 Ultimate Edition.
Programele folosite au fost STM32CubeMX, IAR Embedded Workbench și emulatoru l
terminal Tera Term.
Utilitatea acestui proiect const ă în deprinderea cuno ștințelor de transmisii de date
și controlul perifericelor prin cod C utiliz ând microcontrolere din gama
STMicrocontrollers. Dup ă realizarea acestui proiect se va putea înțelege mai bine cum
func ționeaz ă clusterul unui automobil, ce presupune proiectarea acestuia, iar apoi
realizarea fizic ă și programarea astfel încat s ă simuleze un sistem real de control al
indicatoarelor ce afi șează utilizatorului ma șinii informa ții despre tura ția motorului și
viteza de deplasarea a ma șinii. Toate acestea introduc ând o singur ă variabil ă de intrare
și anume accelera ția (reprezentat ă prin poten țiometrul B50K).
Proiectare
21 4 Proiectare
Dacă știm toate componentele necesare urmeaz ă să stabilim cum le vom aranja și
conecta pentru a crea sistemul dorit. Asadar, dup ă cum putem observa și în figura 4.1, ca
date de intrare avem o rezistent ă variabil ă reprezentat ă prin poten țiometrul P1. Aceste
valori sunt introduse in microcontrolerul MC1 de tip master care con ține un mod el
matematic, model ce determina trei variabile transmise mai apoi pe magistrala CAN
microcontrolerului MC2 (slave). Acesta controleaz ă, în func ție de informa țiile primite de
pe magistral ă, dou ă motoare pas cu pas și un afi șaj LCD.
Figura 4.1
Transmiterea respectiv citirea datelor î n cadrul celor dou ă microcontrolere se
face folosind timere. Timerele respective sunt periferice caracteristice controlerelor ce
au diferse func ții ce pot fi utilizate. Func ția folosita în proiectul nostru se caracterizeaz ă
prin num ărarea unui anumit interval de timp și dupa trecerea timpului prestabilit se va
executa instruc țiunea precizat ă în zona de cod din program.
În microcontrolerul MC2 controlul celor dou ă motoare se realizeaz ă tot prin
întreruperi folosi nd unit ăți de timp.
In figura 4.2 este prezentat ă o schem ă mai detaliat ă și dore ște prezentarea
componentelor utilizate în acest proiect. Dup ă cum s -a enumerat în partea de analiz ă,
acestea sunt principalele compo nente utilizate.
Proiectare
22
Figura 4.2
Introducerea tranceiverelor și a driverelor ajut ă la buna func ționare a sistemului.
Tranceiverele fac posibil ă comunicația dintre cele dou ă microcontrolere. F ără ele
protocolul C AN nu ar putea s ă interpreteze magistrala la care este conectat ă și prin
urmare, datele transmise pe aici nu ar putea fi recep ționate sau transmise. Driverul
A4988 face parte din mecanismul de punere în func țiune a motorului stepper. F ără
acesta ar fi fost necesare mult mai multe implement ări software și elemente fizice
auxiliare pentru a -l putea controla. Driverul ajut ă în principal la determinarea direc ției
și a pa șilor executa ți de motor. Bateria de 9V este prezent ă datorita consumului mai
mare de energi e ap ărut odata cu introducerea motoarelor. Aliment ând motoarele de
aici, consumul de energie se echilibreaza și tot sistemul poate func ționa în condiț ii
optime. În ceea ce prive ște display -ul, conectarea sa cu microcontrolerul necesit ă o
multitudine de fir e. Fapt datorat lipsei une i interfe țe sau driver compatibil, element ce ar
scadea drastic num ărul de fire și ar fluidiza transmisia de date. Un astfel de element ar
putea fi o interfa ță compatibil ă cu protocolul I2C. Pinii utiliza ți din microcontroler s -ar
reduce la doar doi : SCL și SDA, reprezentâ nd transmiterea serial ă a ceasului și
transmiterea serial ă a datelor. Pentru introducerea datelor în sistem am ales un
poten țiometru deoarece este mai u șor de utilizat. Ini țial s -a dorit utilizarea unui senzor
cu infraro șu de distan ță, dar din cauza lipsei de precizie al acestuia și al fluctua ției
permanente a valorilor, alegerea unei poten țiometru a fost mai benefic ă și mai simplă,
pentru o gam ă mai stabilizat ă de valori achizi ționate.
Implementare
23 5 Implementare
5.1 Descrierea prog ramelor
5.1.1 STM32CubeMX
STM32CubeMX face parte din ini țiativa STMicroelectronics STMCube de a facilita
ușurin ța utiliza torilor î n configurarea proiectului ce urmeaz ă a fi creat. STM32Cube
include programul STM32CubeMX , el este o interfa ță grafic ă configurabil ă menit ă să
genereze cod C de ini țializare.
La crearea unui proiect nou în STM32CubeMX se selecteaz ă microcontrolerul
folosit. Dupa selectare o nou ă fereastr ă va ap ărea ce va con ține to ți pinii
microcontrolerului selectat anterior.
• În tabul Pinout (fig 5.1) se poate observa în partea dreapt ă interfa ța grafic ă a
pinilor de unde putem selecta ce dorim sa folosim si cum sa fie pinii respectivi (intrare,
iesire, intreruperi, analog, timer, clock etc). In stanga vor fi perifericele disponibile, daca
le activa m de aici vom putea vedea si in zona grafica activarea pinilor alocati
perifericelor respective.
Problema este ca nu se pot folosi toti pinii oricand si oricum deoarece sunt
periferice ce isi impart pini, asta ducand la o excluderi de utilizare. Exista to tusi solutii
pentru acest impediment, una ar fi posibilitatea mutarii unor periferice activate pe alti
pini. Acest lucru se poate face dupa activare (culoarea verde a pinilor) se tine apasat
butonul Ctrl, se tine apasat click stanga pe pin si apoi, cu alba stru vor aparea pinii
disponibili de a prealua aceasta sarcina.
Figura 5.1
Implementare
24 • Accesand tabul Clock Configuration vom putea modifica valorile de ceas ale
microcontrolerului.
Figura 5.2
Cand vine vorba de ceas ne referim la ceasul care ne arata spune cat de repede
functioneaza procesorul microcontrolerului si nu la ceasul ce ne spune ora din zi (acest
tip de ceas este cunoscut sub denumirea de Real Time Clock).
In procesor avem un oscilator cu frecventa de 16MHz cu o precizie mica . Este
frecveta din patratul albastru denumit HSI RC ce vine de la High Speed Internal Resistor
Capacitor. Oscilatorul este facut folosind o retea de rezistente si condensatori, frecve nta
osciland cu temperatura. Avantajul acestui oscilator de precizie mica este costul scazut,
un oscilator extern ar ridica costul, si daca nu e nevoie de o precizie foarte mare
oscilatorul procesorului isi face treaba. Insa placa cu care vom lucra are un oscilator
extern de 8MHz ce genereaza precis aceasta frecventa si este foarte stabila si mult mai
toleranta la temperatura decat a oscilatorului intern.
Configurarea frecventei implica niste calcule ce se pot genera automat. Daca dorim
sa modificam un anu mit bloc sau sa selectam un anumit oscilator sau o anumita
prescalare vom observa ca unele campuri se vor colora in rosu. Asta inseamna ca
valoarea respectiva nu se incadreaza in limitele impuse. Apasand butonul ce va
rezolva automat problemele aparute. Butonul va reseta toate tot la valori predefinite.
• In tabul numit Configuration se pot vedea perifericele ce sunt activate. Se pot
modifica variabilele fiecarui periferic activat ca mai apoi cand generam codul C, toata
configuratia sa fie gata scrisa. Se pot seta in functie de periferice: viteza de transmisie a
datelor, setarea rezistentelor de pull -up sau pull -down asupra pinilor GPIO, activarea
intreruperilor, prescalarea timerelor etc.
• In ultimul tab pus la dispozitie de program putem estima putere a care o baterie
conectata la microcontroler o va avea in timp.
Implementare
25
5.1.2 IAR Embedded Workbench
IAR Systems este o companie de programare din Suedia ce ofera solutii de
programare pentru sisteme inglobate. A fost fondat in 1983 si are sediul la Stockholm.
Abreviere a vine de la Ingenjörsfirman Anders Rundgren, prin traducere: Compania de
Inginerie Anders Rundgren.
IAR Embedded Workbench este un IDE (Integrated Development Environment)
unde toate uneltele necesare producerii aplicatiei sunt integrate (compilator C, librarii,
editor, IAR C -SPY Debugger ). Cu acest IDE se pot programa mai multe microcontrolere,
trebuie doar descarcare pachetele pentru serile de placute dorite.
Dupa instalare, pornirea aplicatiei se face accesand IarIdePm.exe ce se gaseste in
directorul co mmon \bin. Odata pornit, IDE -ul arata ca in figura 5.3 de mai jos:
Figura 5.3
La prima deschidere a programului se va afisa centrul de informare unde se
regasesc toate informatiile necesare pentru inceput (t utoriale, exemple de proiecte,
suport informatic si un ghid de utilizare).
Pentru simplitate si eficienta in initializarea proiectului se recomanda folosirea
programului descris anterior STM32CubeMX pentru initializarea pinilor, configurarea
clock -ului si configura perifericelor folosite. Din CubeMX, dupa ce am terminat de setat si
configurat, apasam butonul ce ne va deschide o fereastra de unde ne vom seta cateva
optiuni cum ar fi : numele proiectului, locati a, IDE -ul ce dorim sa -l folosim : EWARM
pentru IAR (sau MDK -ARM V5 daca folosim Keil μVision 5 ). Setand acestea dam click pe
OK si asteptam sa se deschida IAR Embedded Workbench. Odata deschis, programul ne
Implementare
26
va afisa in stanga spatiul de lucru ce contine directoarele cu fisierele, in dreapta vom
avea deschis fisierul main.c si jos zona de informatii asupra compilarii si debuggingului.
Pentru a compila programul trebuie sa accesam butonul (cursorul trebuie sa
selecteze mai intai zona de cod pentru ca butonul de compilare sa fie activ). Daca dupa
compilare totul a decurs normal, fara erori sau warninguri, putem accesa butonul de
rulare a programului ,ce il va incarca pe microcontroler .
Odata incarca programul pe controler, se vor deschide mai multe ferestre in
IDE.Apasand si butonul se va intra in debugging mode si setând in Live Watch cateva
variabile, se pot vedea cum acestea oscileaza (cu roșu). In figura 5.4 se vede acest lucru:
Figura 5.4
5.2 Stadiile proiect ării
5.2.1 Microcontroler 1
Primul controler STM32L476RG il vom considera microcontrolerul master din
sistemul nostru deoarece el va trimite datele spre executie catre al doilea controler. Aici
vor fi putine componente hardware atasate.
5.2.1.1 Achizitie date
În prima faza, vom conecta doar potentiometrul la microcontroler pentru a vedea
cum primim date de la acesta. Introducem potentiometrul B50K in breadbord, legam
pinul 1 la VCC(5V) si pinul 3 GND(ground), la apoi legam pinul 2 al potentiometrului la
pinul A5 de pe placa STM. Pinul A 5 se gaseste in partea stanga jos a placii in zona CN8.
Dupa cum se poate observa si in figura 5.5, potentiometrul este legat cu jumpere la
zona de alimentare a breadboard -ului, alimentarea este oferita de controler prin cele
Implementare
27 doua cabluri rosu si negru. F irul alb este cel de semnal, el leaga pinul 2 al
potentiometrului cu pinul A5 (PC0) al microcontrolerului.
Figura 5.5
Dupa ce am terminat de conec tat deschidem programul CubeMX. Aici va fi necesar
sa ne ins talam librariile necesare pentru familia de microcontrolere din care face parte
placuta noastra. Astfel ca, intram in Help ->New Libraries manager, de aici cautam
STM32CubeL Releases si instalam Firmware -ul cu ultima versiune existenta. Dupa ce am
terminat de instalat librariile, dam un restart la aplicatie si vom selecta placa noastra
urmand succesiunea: New Project ->Board Selector ->Type of Board alegem Nucleo64
apoi de la MCU Series dam dublu click stanga pe NUCLEO -L476RG. În cel mai scurt timp
se va desch ide o fereastra ca in figura 5. 1. Din partea dreapta alegem ADC1 din tabul
Peripherals. Maximizam structura si in dreptul zonei IN1 apasam pe sageata si selectam
IN1 Single -ended. Putem apoi observa in partea dreapta ca in zona pinului PC0 a aparut
ADC1_IN 1 si pinul s -a colorat verde, programul anuntandu -ne astfel ca pinul este activ si
gata de a fi utilizat.
Configuratia pinului este facuta, acum urmeaza sa exportam aceste configuratii in
IAR Embedded Workbench pentru a scrie codul ce il vom incarca pe mi crocontroler.
Mergem la tabul Project si de acolo selectam Generate Code. Se va deschide o fereastra
unde vom introduce un nume de proiect sub Project Name, locatia unde dorim sa salvam
proiectul accesand Browse din dreptul chenarului Project Location, sel ectam Toolchain –
ul pe care il folosim, in cazul nostru EWARM. In cele din urma trebuie sa selectam locatia
librarii ce am instalat -o anterior. La ultimul chenar de jos, selectam Browse si dam
locatia unde este salvata libraria pentru tipul de microcontrole re L4. Dupa ce am
terminat de configurat apasam Ok si asteptam sa se deschida IAR Workbench.
Odata deschis IAR -ul deschidem Application, apoi User si in cele din urma intram
in fisierul main.c unde vom incepe programarea de fiecare data. Cautam zona de cod
unde avem o bucla while (1). Aceasta bucla este delimitata de niste comentarii: “USER
CODE BEGIN/END WHILE” si “USER CODE BEGIN/END 3” . Intre cele doua comentarii de
inceput si sfarsit de cod din bucla while vom introduce doua linii de cod ce vor pornit
pinul ADC setat in CubeMX si apoi va lua valoarea introdusa de potentiometru. Aceasta
valoare o vom salva intr -o variabila de tip integer.
Implementare
28 Urmatorul lucru ce trebuie s ă-l facem este s ă ne asigur ăm c ă jumperul JP5 al
microcontrolerului ( figura 2.11 ) este cone ctat pe pinul 2 si 1 (vezi figura 2.12 ) deoarece
alimentarea va fi prin cablul USB de la laptop. Conectam cablul la laptop folosind un
cablu mini -USB ->USB (intrarea USB 2.0 va fi in laptop, iar cea mini -USB in
microcontrolerul STM32L476RG Nucleo)
Odata con ectat microcontrolerul, se va aprinde LD3 (roșu) si LD1 (roșu). Din IAR
vom compila programul sa vedem daca totul este bine si se poate incarca pe controler.
Daca nu primim erori sau avertizari dupa compilare apasam butonul de Run sau din
tabul Project sel ectam Download and Debug (CTRL+D). In program se va vedea cum
fisierele se incarca pe controler in partea de jos, iar pe controler vom vedea cum acesta
intra in modul de comunicație cu laptopul si primeste in memorie programul trimis de
noi. Dupa un semnal sonor din laptop si aprinderea becului verde la LD1 putem selecta
din IAR butonul de ce ne introduce in zona de Debug. Odata selectat acest buton se va
vedea pe microcontroler o alternanta de culori verde -rosu in ledul LD1. Acuma selectam
de sus tabul Vie w si alegem Live Watch de la mijlocul coleanei aparute. Dupa selectare
va aparea o fereastra numita cu acelasi nume unde vom putea sa vizualizam date din
variabilele utilizate de controler. În zona de <click to add> dam click si scriem “val” apoi
dam enter . Presupunand ca am salvat datele primite de la potentiometru in variabila
denumita ”var” de tip integer fara semn (uint32_t) . Valori le variabilei “var” se pot
observa in dreptul acesteia cu roșu. Ele se modifica in functie de cum modificam noi
pozitia potentiometrului.
Astfel am realizat introducerea datelor in microcontroler, date ce vor servi mai
tarziu ca materie prima pentru realiz area a trei marimi: turatie, viteza de deplasare si
treapta de viteza. În cele ce urmeaza vom vorbi despre aceste lucruri si cum le realizam .
5.2.1.2 Modelul mașinii
În scopul interfa țării câ t mai exacte a unui b ord auto trebuie sa avem date câ t mai
apropiate de realitate. Acest lucru este destul de greu de obț inut deoare ce exista foarte
multi factori ș i variabile ce compun o comportare de ansamblu a ma șinii.
În cazul unei mașini reale acceleraț ia, viteza ma șinii, combustibilul consumat,
emisiile de gaze , caldura generată toate ac estea sunt particularităț i ce caracterizează
mașina, cu cât aceș ti parametrii sunt mai buni cu atât mai mult putem spune că acel
autotorism este mai bun.
Materialele folosite în construcț ia ma șinii determin ă uzura ulterioară a
autovehico lului, acesta fii nd un alt factor ce influentează performantele ma șinii.
Zona de deplasare, înclinația șosel ei, dimensiunile cauciucurilor ș i a jentilor, toate
acestea au ca scop îngreunarea sau îmbunătăț irea parametrilor p e care în această
lucrare dorim să îi simulăm.
Implementare
29 Vom minimiza acest sistem la o singur ă variabilă de intrare (potent iometrul) ce va
simula acceleraț ia. Determinarea, în funcție de variaț ia potentiometrului , a parametrilor
nostrii, o vom face folosind câteva formule matematice și interpolări (scalări).
Idea de bază ar fi că, datele introduse aflate î ntr-un interval de valori de 0 -4095, să
fie raportate la o gama de valori ce mai apoi sa fie folosita pentru controlul motoarelor
stepper.
Mai trebuie sa avem in vedere că ulterior c ând vom folos i comunicația CAN nu vom
putea trimite decat valori pe opt biți deoarece z ona de date din CAN are opt spaț ii
disponibile de transfer de date de la zero la sapte si fiecare este pe un byte adica opt biți
ceea ce inseamna valori de la 0 la 255.
Modelul maș inii creat pentru această aplicație constă î n cateva analogii logice în
prima faz ă. Așadar, pentru a transforma niste valori dintr -un anumit interval in alte
valori raportate la un alt interval va trebui sa ne gandim astfel: daca datele ce le avem
inițial su nt în intervalul inchis [0,a] și vrem s ă le convertim în [0,b] trebuie s ă scalăm cu
un anumit raport. Așa că, “0” corespunde lui “0”, “a” corespunde lui “b” si un numar din
intervalul datelor de intrare sa zicem “t” va fi egal cu :
(
) (5.1)
De exemplu:
Intrare : Iesire:
Fie t=3 (din intrare). Scalat la intervalul de ie șire el va deveni:
(
) (5.2)
Pentru o abordare mai concret ă vom avea î n vedere urmat oarele aspecte. Un
interval de intrare dupa cum urmeaza : are un total de numere egal cu:
(5.3)
Poate fi considerat ca un interval de:
(5.4)
Ieșirea poate avea aceea ș analogie cu intervalul (5.4).
O intrare “in” este egala cu:
(5.5)
Din analogia ecua ției (5.1) reiese ca :
q (5.6)
Dacă ne uit ăm la return -ul funcț iei “map” folosita la programarea din Arduino o sa
constatam urmatoarele:
Ca declarare:
Implementare
30 long map (long val, long in_min , long in_max , long out_min , long out_max )
Unde val este valoarea c e urmeaz ă a fi scalat ă, in_min minimul posibil din
intervalul lui val, in_max maximul din acela și interval, iar out_min și out_max sunt
minimul și maximul din intervalul î n care vrem sa scal ăm valoarea val.
Returnarea funcț iei map va fi urm ătoarea:
(5.7)
Față de analogiile f ăcute anterior i anume ajungerea la ecuatia ( 5.6) observam
aparitia ultimului termen de adunare. Prezen ța lui nu face dec ât ca atunc i cand se
calculeaz ă noul termen s ă se înceapa de la prima valoare dorit ă din intervalul î n care
vom scala.
De exemplu:
Intrare: Ieșire:
Fie t=9 (din intrare). Scalat la intervalul de ie șire el va deveni, conform ( 5.7):
(5.8)
Noul “t” va fi pentru intervalul de ie șire 9.75 fa ță de intervalul de intrare unde era 9.
Există diverse ecuații între viteză și turație. Aceste ecuații le putem folosi pentru
a ne determina o valoare in fu nctie de cealalta. Noi avand turatia, data de la
potentiometru, avem nevoie doar de o formula ce ne va calcula viteza
(
) (5.9)
Unde val este valoarea de la potentiometru, TireDim este dimensiunea anvelop ei,
GearRatio este un numar egal cu raportul de dinti dintre doua roti dintate alaturate ale
cutie de viteze si numarul vine de la un raport de conversie a valorilor de masura a
variabilelor, acest fiind pentru km/h (pentru mile pe ora se foloseste 336).
Deducția matematica a acestei formule se bazeaza pe ce dorim sa aflam în funție de
ce avem. Prin urmare, consideram ca avem nevoie de viteza masurata în kilometrii pe
oră:
(5.10)
Unde , RotM=rotațiile motorului (rpm) , Dr=diametrul roții(inci), Gr=gear ratio. Acel
numar “39370” reprezinta corespondența în inci a unui kilometru.
(5.11)
Simplificam ecuația (5.11) cu 1 88.4955 și obținem:
Implementare
31
(5.12)
Din (5.13) reiese ecuația vitezei folosite în modelul matematic:
(5.13)
Bazandu -ne pe aceste ecua ții putem implementa un model matematic de
recalculare a turatiei, vitezei si a treptelor de viteza pentru a avea in spatele afisarii
bordului auto si o simulare a unei cutii de viteze automate.
Impleme ntarea din IAR a modelulu i incepe prin a declara doua variabile de tip
integer fara semn (uint32_t): rpm și speed. În prima variabilă “rpm” vom introduce
turația î n rota ții pe minut și în “speed” viteza de deplasare a mașinii în kilometrii pe oră.
Pentru citirea de la potențiomet ru folosim un timer ce ne va citi cu o frecventa mare
datele de la dipozitivul de intrare și le va salva în variabila “val”. Vom mai avea si un
vector cu 5 elemente numit GearRatio ce va avea datele unui autoturism V olkswagen
Passat din 1993 (3.3, 1.944, 1. 308, 1.034, 0.838) , o variabila “gear” ce va indica pozitia
din vector a elementului dorit si TireDi, un macrou definit cu valoarea 16(reprezentând
dimensiunea gentii masinii).
Aici vom avea o serie de condiții în funcție de rpm:
• Daca rpm<=1600 atunci
Gear=0;
(
) (5.14)
• Daca ((rpm>1600)&&(rpm<=2300)) atunci
Gear=1;
(
) (5.15)
• Daca ((rpm>2300)&&(rpm<=3000)) atunci
Gear=2;
(
) (5.16)
• Daca ((rpm>3000)&&(rpm<=4000)) atunci
Gear=3;
(
) (5.17)
Implementare
32 • Daca ((rpm>4000)&&(rpm<=5000)) atunci
Gear=4;
(
) (5.18)
Urmeaza implementarea acestui model pe microcontroler si apoi trimiterea
datelor rezultate spre microcontrolerul numarul 2 pe magistrala CAN.
Deschidem din proiectul creat înainte, fiș ierul cu extensia .ioc reprezentand fisierul
STM32CubeMX. Odata deschis vom activa din partea stanga timerul TIM2 astfel:
maximizam structura lui TIM2 si de la Clock Source alegem Internal Clock, in tabul Clock
Configuration verificam daca est e bifat butonul HIS si in tabul Configuration mergem la
sectiunea Control. Accesam TIM2, setam Prescaler -ul la 48000 si Counter Period la 1.
Din tabul configuratorului TIM2 selectam NVIC Settings si bifam Enable din linia “TIM2
global interrupt”. Aceste se tari folosesc in continuare la implementarea in IAR a codului
pentru transmisia de date.
5.2.1.2.1 Model real
Pentru rezolvarea problemei modelului matematic al masinii am încercat
implementarea unei secțiuni de cod folosit pe un controler dintr -un cluster de serie .
Acest cod simula în funcție de accelerația introdusă o cutie de viteze automate. Codul
folosind librării externe am încercat reducerea lui până când am reușit doar cu funcția
de interpolare(scalarea pe care am utilizat -o și în această lucrare), funcția m odelului
mașinii(calcularea turației, vitezei) si vectorii de mapping folosiți , să ruleze intr -un
mediu de programare C (CodeBlocks). În CodeBlocks totul a decurs normal, dar la
introducerea in IAR au aparut probleme. De și se comporta bine in primele secu nde de la
rulare, intervenea o creștere exagerată a unor variabile ce au determinat creșterea
vitezei de la 40 -60 până la 600 -1200 în doar cateva recalculari.
5.2.1.3 Configuraț ia CAN
Dupa ce am terminat de configurat timerul ne intoarcem la tabul de Pinout si
activam protocolul CAN. Activarea acestui protocol va seta automat pinii PA11 si PA12
ca fiind CAN1_RX respectiv CAN1_TX. Dorim sa mutam pinii respectivi in alta zona
pentru a fi mult mai accesibili in zona hardware cand vom conecta tranceiverul la
controle r. Pentru a muta pinii respectivi tinem apasat butonul CTRL si cu click stanga
PA11 il vom putea muta in cealalta zona accesibila pentru CAN1_RX si anume in PB8,
acelasi lucru facem si cu pinul PA12 ce il vom muta pe portul PB9 care va fi CAN1_TX.
Acum int ram in tabul Configuration, intram la Connectivity pe CAN1 si astfel am
intrat in fereastra de configurare a protocolului CAN de pe microcontroler. Urmatoarele
configuratii au fost facute: Prescaler (for Time Quantum) a fost setat la 16, Time Quanta
in Bit Segment 1 are valoarea 3 Times, iar Time Quanta in Bit Segment 2 are valoarea 5
Times, ReSynchronization Jump Width setam pe 1 Time. In optiunile din Basic
Parameters toate vor fi Disale iar Operating Mode va fi Normal.
Implementare
33 De asemenea nu vom uita sa pornim o scilatorul. Din Pinout maximizam RCC si la
High Speed Clock (HSE) alegem Crystal/Ceramic Resonator.
În tabul Configuration -> System vom intra in NVIC de unde vom bifa Enable in
dreptul CAN1 RX0 interrupt in cazul in care nu este bifat.
In ceea ce priveste configuratia ceasului setarile pot fi vazute in figura 5.6 :
Figura 5.6
Dupa ce am facut toate acestea generam configuratia in codul C pentru IAR. Ajunsi
in IAR intram in main.c de unde continuam configurar ea inceputa in CubeMX pentru
protocolul CAN. Prin urmare, ne setam trei structuri de date la inceputul programului in
zona dedicata variabilelor private (/* Private variables*/). Prima data definim o
structura de timp CAN_FilterConfTypeDef ce va contine fi ltrele folosite pentru protocol.
Urmatoarele doua sunt structuri pentru transmiterea si receptia datelor definite prin
structuri de timp CanTxMsgTypeDef si CanRxMsgTypeDef. Denumirea acestor structuri
este recomandat sa fie cat mai expresive cu scopul de a nu ne incurca pe viitor. Astfel ca
pentru prima structura putem folosi FilterConf si pentru urmatoarele doua TxMesaj
respectiv RxMesaj.
Restul configurarii protocolui CAN consta in setarea anumitor valori filtrelor din
structurile amintite si declarate m ai sus. Între comentariile USER CODE BEGIN/END 2
vom scrie tot ce este nevoie pentru finalizarea configuratie i protocolului.
În primul rand , dam adresele variabilelor TxMesaj si RxMesaj zonelor de pointer
ale structuri hcan1 prin atribuirea hcan1.pTxMsg = &TxMesaj, acelasi lucru si pentru
Implementare
34 receptia transmisiei Rx. Apoi vom seta valori mai multor campuri din structura de date
definita mai sus FilterConf. Prin numele structurii declarate “.” Si apoi denumirea
filtrului vom face aceste modificari.
• FilterNum ber ce va fi setat “0” (specifica filtrul ce va fi initializat, valori
permise intre 0 si 27);
• FilterMode = CAN_FILTERMODE_IDLIST (specifica modul filtrului utilizat
poate fi ori LIST ori MASK);
• FilterScale = CAN_FILTERSCALE_32BIT (poate fi unul de 32 de biți sau
doua de 16);
• FilterIdHigh aici setam adresa protocolului CAN de pe acest
microcontroler. Vom seta o valoare de adresa intre 0x0 si 0xFFFF. Alegem
valoarea 0x2 44<<5 (in decimal va fi 185 60 si in hexa 48 80) ce va reprezenta
adresa microcontrol erului master;
• FilterIdLow (numarul de identificare al filtrului) il vom seta 0;
• FilterMaskIdHigh = 0;
• FilterMaskIdLow = 0;
• FilterFIFOAssignment = 0 (specifica care din FIFO le vom folosi, 1 sau 0);
• FilterActivation il vom activa dandu -I valoare = ENABLE deoarece dorim
sa folosim parte din filtrele puse la dispozitie de protocol;
• BankNumber seteaza de unde incepe zona de filtre (valori intre 0 si 28),
noi vom seta 14;
Acestea au fost filtrele folosite, in continuare le vom introduce in structura
protocolului pentru receptie. Functia HAL_CAN_ConfigFilter va seta in hcan1
filtrele initializate mai cu ajutorul structurii FIlterConf definita in zona de variabile.
Pentru a receptiona mesaje trebuie activata o rutina de intreruperi responsabila
de citi rea acestor mesaj ce urmeaza sa fie primite. Ea se numeste HAL_CAN_Receive_IT
avand ca parametrii hcan1 si CANFIFO0.
În ultimele doua functii, în afara de CANFIFO0, restul parametriilor sunt
transmisi ca adrese, cu “&” in fata lor.
Datele transmise spre ma gistrala vor avea nevoie si de adresa celulalt
microcontroler unde vor ajunge datele. Asadar in structura hcan1, campul pTxMsg,
variabila StdId va memora valoarea 0x245 ce va reprezenta “partenerul de discutie”. Tot
in cadrul acestui camp (pTxMsg) se vor i nitializa inca trei variabile:
• RTR = CAN_RTR_DATA (se va utiliza zona de date din frame si nu zona
remote) ;
• IDE = CAN_ID_STD (aici se alege intre tipruiel de identificator ale CAN –
ului Standard Id sau Extended Id, in cazul nostru folosim Standa rd);
Implementare
35 • DLC = 4 (specifica cati bytes de date vor fi trimisi pe frame, noi am ales 4
pentru ca de atatea avem nevoie, se pot alege pana la 8 bytes de date)
5.2.1.4 Trimiterea datelor pe magistrala CAN
Ultimele doua subcapitole au descris implementarea modelului matematic si
configurarea protocolului CAN. In acest subcapitol vom transmite datele acestea pe
magistrala CAN controlerului MC2.
Avand toate configuratiile facute putem programa direct din IAR transmisia
datelor. În partea de inceput a main.c între comen tariile USER CODE BEGIN/END 0 vom
apela o functie numita HAL_TIM_PeriodElapsedCallback. Aceasta functie se autoapeleaza
in functie de conditiile pune in interiorul ei.
Cream o funcț ie de tip void cu denumirea HAL_TIM_PeriodElapsedCallback si cu
parametrul TIM_HandleTypeDef *htim. În interiorul functiei punem conditia ca odata
avuta loc intreruperea timerului TIM2 sa se execute comenziile avute in interior. TIM2 l –
am setat in capitolul 5.2.1.2 astfel incat se apeleze la fiecare 1 milisecunda. Condiția
respec tivă arată aș a :
if (htim -> Instance == TIM2)
{
//model matematic
//date trimise spre MC2
}
În felul acesta evitam sa punem in bucla while codul respectiv, avem un control
mai mare asupra lui si este mu lt mai eficient si ingrijit. Înainte de a tran smite datele pe
CAN trebuie sa le pregatim. Aceasta pregatire este necesara datorita limitarii de biți ce
pot fi transmiși pe o linie de date a frame -ului (maxim 255). Astfel declaram un vector cu
doua elemente vv[2] de tip char (char pentru ca este de ace eas dimensiune ca o zona de
date).
Valoarea lui rpm este pe 16 biți deoarece 800 reprezentat in binar este pe 16 biți
dupa cum urmeaza : 0000001100100000. Prin urmare in vectorul declarat mai sus “vv”
vom pune in primul element vv[0] primii 8 biți din rpm astfel : vv[0]=rpm. Ceilalti 8 biți
ii vom pune in vv[1] deplasand la dreapta biții din rpm. Atribuirea in vector va fi
urmatoarea: vv[1]=rpm>>8;
În felul acesta am salvat o valoare pe 16 biți in doua locatii de cate 8 biți.
Considerand secventa binara ca avand primul bit din dreapta cel mai nesemnificativ bit
si primul bit din stanga cel mai semnificativ bit dupa cum este precizat si mai jos:
Cel mai semnificativ bit= 000000110010000 0=cel mai nesemnificativ bit .
Implementare
36 Transmisia spre magistrala CAN se va produce atribuind aceste valori in zona de
date a structurii hcan1 in campul pTxMsg la zona de date dorita. Pentru transmitearea
rpm -ului selectam structura,campul si zona de date dupa cum urmeaza:
• hcan1.pTxMsg ->Data[0]=vv[0] (aici am adaugat in frame -ul ce urm eaza a
fi trimis primii 8 biți de date ai rpm -ului, valoarea din vv[0] a fost pusa in zona
“0” de date );
• hcan1.pTxMsg ->Data[1]=vv[1] (aici adaugam ceilalti 8 biți ai rpm -ului
atribuind valoarea din vv[1] în zona de date numarul “1” );
• hcan1.pTxMsg ->Data [2]=speed (aceasta atribuire in zona de date “2”
constituie viteza de deplasare a masinii, aflandu -se in marja 0 -180 nu este nevoie
sa o împartim deoarece este in limitele dimensiunii zone de date);
Ultima instructiune ce trebuie precizata este apelarea fu nctiei de transmitere a
mesajului ce reprezinta frame -ul CAN -ului. Utilizand HAL_CAN_Transmit si dând ca
argumente adresa structurii hcan1 si o valoare de timeout, mesajul creat se trimite pe
magistrala CAN ca mai apoi sa ajunga la celalalt microcontroler. Salvam fisierul si
inchidem aplicatia.
5.2.1.5 Legatura fizica a comunicației CAN
Înainte de a rula programul pe microcontroler trebuie sa stabilim si partea
hardware. Conexiunea fizica cu tranceiverele si cu celalalt microcontroler este necesara.
Prin urmare, ne asiguram ca avem microcontr olerul deconectat de la surse de
alimentare. În breadboard introducem tranceiverul MCP2551 astfel incat pinii sa fie pe o
parte si pe cealalta a canalului longitudinal despartitor din mijlocul breadboardului.
Apoi suntem atent i la schema cu pinii disponibili a tranceiverului ( Fig 5.7). Conectam
pinul TXD al lui MCP2551 la Tx -ul microcontrolerului reprezentat de pinul D14 si pinul
RXD de la tranceiver la pinul D15 al STM32 -ului. Ap oi conectam pinul numarul 2 al
tranceiverului Vss la GND si pinul 3 al tranceiverului Vdd la 5V. Pinul 8 si anume Rs il
vom conecta la GND -ul Vss -ului in serie cu o rezistenta de 1kΩ .
Pinii 7(CANH) si 8(CANL) ai tranceiverului îi vom conecta dupa cum urme aza:
CANH al primului tranceiver se va conecta cu CANH de la al doilea tranceiver si CANL de
la primul la CANL de la al doilea. În aceste ultime doua legaturi se va include si doua
rezistenta de 120Ω una legata la intrarile primului tranceiver si cea dea d oua rezistenta
la cel de -al doilea tranceiver. (aceasta conectare se va face dupa ce vom pozitiona si
tranceiverul numarul 2 pe placa breadboard, detalii ce vor fi precizate în urmatorul
capitol). În figura de mai jos se poate vedea modul de conectare prez entat mai sus.
Implementare
37
Figura 5.7
5.2.2 Microcontroler 2
5.2.2.1 Continuarea legaturii hardware a comunicației CAN
La sfarsitul ultimului subcapitol am prezentat modul de conectare al tranceiverelor
si al microcontrolerului master. În continuare vom conecta si tranceiverul al doilea cu
microcontrolerul slave.
Introducem tranceverul al doilea MCP2551 în cealalta parte a breadboardului. La
fel cum l -am introdus si pe primul. Conectam conform figurii 5.8 Vss la GND, Vdd la 5 V,
RS la GND cu o rezistenta de 1kΩ legata in serie . Conectam pinii TXD si RXD de la
tranceiver la pinii D14 respectiv D15 microcontrolerului slave.
În ceea ce priveste CANH si CANL se va proceda cum am explicat la sfarsitul
subcapitolului 5.2.1.5 unde am preci zat exact aceasta conexiune.
Implementare
38
Figura 5.8
Pentru o întelegerea de ansamblu a implementarii hardware a comunicației CAN se
poate studia schema de mai jos
Figura 5.9
Alimentarile celor doua mic rocontrolere se va face cu grijă ș i respect ând urm ătorii
pași pentru a nu deteriora dispozitivele :
Implementare
39 • Se determin ă ce controler dorim sa alimentam deoarece daca il
alimentam direct de la laptop putem folosi debuggerul.
• Daca alimentam microcontrolerul master va trebui sa ne asi guram ca
jumperul JP5 se afla pe pinul 1 si 2 (figura 2.12). Conectam în zona de alimentare a
breadboardului la “+” cu 5V si la “ -” cu GND de pe placa. La microcontrolerul slave vom
pune jumperul JP5 pe pinul 2 si 3(figura 2. 13). Conectam in zona de alimen tare a
breadboardului la “+” vom conecta pinul VIN si la “ -” un pin de GND.
• Daca alimentam microcontrolerul slave va trebui sa ne asiguram ca
jumperul JP5 se afla pe pinul 1 si 2 (figura 2. 12). Conectam în zona de alimentare a
breadboardului la “+” cu 5V si la “ -” cu GND de pe placa. La microcontrolerul master vom
pune jumperul JP5 pe pinul 2 si 3(figura 2. 13). Conectam in zona de alimentare a
breadboardului la “+” vom conecta pinul VIN si la “ -” un pin de GND.
5.2.2.2 Receptia datelor de pe magistrala CAN
Implementarea in program va necesita în prima faza copierea fisierului creat
pentru microcontrolerul master. Astfel ca ne vom duce in zona unde avem salvat fisierul
de unde am configurat controlerul 1 si il vom copia in intregime dandu -i alt nume. În
acest nou director vom accesa CubeMX de unde vom debifa ADC1, pentru ca nu mai
avem nevoie de el pe acest microcontroler. Setarile ramase sunt bune pentru a testa
comunicația CAN. Mergem la Project si apasam Generate Code. Dupa ce fereastra din IAR
a fost deschi sa mergem in Application ->User ->main.c unde vom continua scrierea
codului.
Primul lucru pe care trebuie sa -l facem este de a utiliza timerul TIM2 ramas activ
de de la microcontrolerul precedent. În zona de cod USER CODE BEGIN/END 0 folosim
functia HAL_TIM _PeriodElapsedCallback în care vom citi datele venite pe magistrala.
Asemanator transmiterii datelor din microcontrolerul master, aici in microcontrolerul
slave vom apela aceasi functie de timp si aceeas conditie if (htim -> Instance == TIM2)
doar ca vom s chimba de data asta campurile de transmitere cu cele de receptie.
Asadar vom apela functia de intreruperi HAL_CAN_Receive_IT care va avea doi
parametrii, adresa mesajului ce va fi primit hcan1 si CAN_FIFO0, coada unde vor intra
mesajele si vor iesii pe baz a regulii de primul intrat primul iesit. Apoi aceasta functie va
fi urmata de patru linii de cod ce vor reprezenta citirea datelor din frame.
• v[0]=hcan1.pRxMsg ->Data[0] (în acest element se va salva prima parte
de 8 biți a rpm -ului)
• v[1]=hcan1.pRxMs g->Data[1] (aici se va salva a doua parte a rpm -ului)
• v[2]=hcan1.p RxMsg ->Data[2] (viteza in km/h)
Pregatirea “rpm” este necesara si aici ca atunci cand am realizat transmiterea
datelor. Declaram o variabila pe 16 biți numita rpm in care salvam imediat dupa ce am
citit datele din frame sub urmatoarea forma valoarea: rpm=((v[1]<<8) | v[0]). Salvand
astfel nu facem decat sa mutam la stanga 8 biți elementul 1 din vector si sa -l adunam cu
Implementare
40
elementul 0 folosind operatorul sau “|”. Mai departe atribuim variabil elor declarate pe 8
biți speed=v[2] si gear=[3].
În ceea ce priveste configurarea CAN, mai trebuie sa modificam unele detalii
referitoare la adresa microcontrolerelor. În zona USER CODE BEGIN/END 2 cautam
FilterIdHigh si inlocuim 0x245 cu 0x244 si mai jos StdId inlocuim 0x244 cu 0x245. Astfel
va fi terminata configurarea intre cele doua controlere prin protocolul CAN.
Înca o linie de cod importanta trebuie precizata, aceasta fiind pornirea bazei de
intreruperi pentru TIM2. Acest lucru il facem chiar inaint e de bucla while(1) apeland
functia cu un singur argument (adresa lui TIM2): HAL_TIM_Base_Start_IT(&htim2).
Nu ramane decat sa incarcam programele pe microcontrolere si sa testam daca
informatiile se transmit cum trebuie.
Deschidem din directorul de proie cte, proiectul microcontrolerului 1, intram in
folderul EWARM si deschidem fisierul Project.eww, intram in fisierul main.c din User si
pornim TIM2 si acolo folosind aceeas functie ca la microcontrolerul 2:
HAL_TIM_Base_Start_IT(&htim2).
Legam cablul intre laptop si microcontrolerul master de la un port USB de la laptop
si portul CN1 de la microcontroler. Odata aprinse becurile pe controler apasam butonul
de incarcare a programului microcontrolerului master pe acesta. Dupa terminare
schimbam si cuplam celal alt controler la laptop de unde incarcam programul
microcontrolerului salve. Va trebui sa avem grija in permanenta cum schimbam
jumperele si cum conectam fierele de alimentare (dupa cum am precizat la
implementarea hardware de la 5.2.21 -jos) si sa avem gri ja in program ca adresele
controlerelor sa fie bine precizate:
• mC1 cu FilterIdHigh=244 și StdId=245;
• mC2 cu FilterIdHigh=245 și StdId=244;
Verificarea datelor o vom face cu debugg mode -ul activ. Avand un singur laptop la
dispozitie vom face aceasta verificare pe rand. Conectam microcontrolerul master la
laptop, rulam programul lui din nou din IAR si dupa ce s -a incarca apasam butonul .
Deschidem Live Watch -ul si in fereastra aparuta scrie hcan1 si pe alta linie val.
Maximizand frame -ul hcan1 , apoi maximizand zona de transmisie de date vom putea
vedea un camp numit “Data” unde se pot vizualiza zonele activate de date ce transmit
informatia si cum se modifica valorile lor in functie de potentiometru. În comparatie se
poate vedea si variabila va l, prima variabila ce salveaza datele citite de la potentiometru,
cu variabilele de dupa intrarea in modelul masinii: rpm, speed si gear.
Daca totul arata in regula si datele se transmit fereastra de live watch va arata ca in
figura urmatoare:
Implementare
41
Figura 5.10
Daca vom conecta microcontrolerul slave (pe viitor vom mentie acest controler
conectat la alimentare) la laptop o buna afisare a datelor va fi vazuta astfel:
Figura 5.9
Impl ementare
42 O aplicatie de t est, unde se poate vedea in mediul fizic si nu doar prin debugger
cum are loc comunicarea pe magistrala CAN intre cele doua microcontrolere. O astfel de
aplicatie usor si rapid de facut si implementat con sta în construirea unui numarator
realizat din ledur i. Astfel ca la fiecare intrerupere de la butonul de USER al unei placi se
va aprinde un bec legat la cealalta placa si invers. Becurile respective vor fi pozitionate
pe linnie, in ordine, de la cel mai nesemnificativ bit pana la cel mai semnificativ bit.
În aceasta aplicatie se pot folosi patru leduri pentru fiecare microcontroler,
numarand un total de opt leduri ce vor avea nevoie de inca pt rezistente de 1kΩ.
O abordare aproximativa are loc si in aceasta aplicatie cum am abordat
comunicația CAN in proiec tul nostru. Ce difere sunt valoarea lui DLC=1 deoarece
numaratorul nostru odata ajuns la 15 ceea ce va insemna toate cele patru becuri aprinse
se va reseta trecand la 0000. El reprezentand in binar doar de la 0000 la 1111 in afisarea
pe leduri. În IAR impl ementarea codului sa facut astfel: in main.c s -a configurat precum
am configurat si in proiectul nostru si in stm32l4xx_it.c s -a facut restul programarii.
Aici, in functia CAN1_RX0_IRQHandler am scris urmatoarele: HAL_CAN_Receive_IT
cu adresa frame -ului si FIFO0 si GPIOB ->ODR ce va semnal de activare ledurilor citind
mesajul din hcan1.pRxMsg si anume cu 12 poziti deplasate la stanga Data[0]<<12 pentru
a prinde doar numerele de care am amintit mai sus.
În rutina de intreruperi a butonului de USER activat in CubeMX vom pune o
conditie, daca butonul este sau nu apasat, se va intra intr -o zona de instructiuni
constand in incrementarea unei variabile ce va fi pusa in zona de date a campului de
transmitere, iar apoi frame -ul va fi trimis.
Mai jos avem schema aces tui mini -proiect:
Figura 5.10
Implementare
43 5.2.2.3 Programarea și conexiunile afișajului
Afisajul folosit este un LCD a1602, ce are 16 caractere pozitionate pe doua linii.
Pentru inceput trebuie sa activam pinii necesari confi gurarii si programarii LCD –
ului. Acest lucru il facem intrand in documentul microcontrolerului slave si pornim de
acolo aplicatia CubeMX. Odata deschisa fereastra vom activa urmatorii pini GPIO setati
ca pini de iesire:
• Pinii PB6,PB5,PB4,PB3 ii vom aleg e ca pini de date, ca sa ne fie mai usor
vom schimba denumirea implicita a pinilor. Acest lucru il putem face dand click
dreapta pe un pin activat si alegem optiune “Enter User Label”, o fereastra mica va
aparea cu un chenar unde putem introduce noua denum ire a pinului. Vom
redenumi dupa cum urmeaza: PB6=D7, PB5=D6, PB4=D5 si PB3=D4.
• Pinii PC2 si PC3 ii vom folosi ca pini de reset si enable necesari display –
ului. Denumirile lor vor fi de asemenea modificate: PC2=RS si PC3=E.
Dupa aceste setari ne mutam la tabul de Clock Configuration , aici ne asiguram ca
HIS din PLL Source Mux este setat la fel si PLLCLK de la System Clock Mux. Mai departe
AHB Prescaler de 4 si HCLK=16 MHz .
Figura 5.11
Mutandu -ne apoi in IA R (actiune realizata odata cu generarea codului din
CubeMX), va fi nevoie sa importam librariile necesare LCD -ului. Aceste librarii se pot
importa astfel:
• Copiem librariile respective in documentul de pe laptop unde se afla
fisierele microcontrolerului slave. Apoi din IAR deschidem Application ->User, dam click
Implementare
44 dreapta pe User, selectam Add si apoi Add files. De aici cautam fisierul
STM_MY_LCD16x2.c si STM_MY_LCD16x2.h pe care le selectam si le aducem in IAR.
• Dăm click dreapta pe fisierul mare din IA R(deasupra fisierului
Application), ne ducem la Options, la Category selectam C/C++ Compiler si intram pe
tabul Preprocessor si selectam butonul numit “….”. Va aparea o vereastra numita “Edit
Include Directories”, în aceasta fereastra mergem pana in josul ei si dam click pe “<Click
to add>” de aici ne alegem calea catre directorul mare al proiectului nostru, dam click
OK, apoi OK in Options.
Figura 5.12
Dupa terminarea acestor operatiuni va trebui sa dam re ferinta in main.c a
headerului librarii LCD. Asta se face introducand linia de cod #include
"STM_MY_LCD16X2.h" in zona USER CODE BEGIN/END Includes. Mai trebuie sa facem o
modificare în libraria importata deoarece ea a fost creata pentru o alta familie de
microcontrolere de la STM32. Asadar intram in IAR si din User accesam fisierul cu
extensia .c a librariei unde inlocuim include -ul referitor la placa folosita cu #include
"stm32l4xx_hal.h", la fel procedam si pentru fisierul header al librariei.
Urmeaza de finirea catorva macrouri in main.c si anume pinii folositi. Folosind
simbolul “#” urmat de “define” vom putea atribui valori unor variabile dupa cum
urmeaza: RS=2, E=3, D4=3, D5=4, D6=5 si D7=6.
În zona de program USER CODE END 2 si Infinite loop vom folos i o functie din
libraria nou introdusa numita LCD_begin4BIT (se vor folosi doar 4 biti de date) . Aceasta
librarie va indica porturile folosite pentru comunicarea cu LCD -ul. Parametrii ceruti de
aceasta functie(în total opt) sunt dupa cum urmeaza: structura de date a grupului de pini
Implementare
45 folositi în urmatoarele doua pozitii (GPIOC), pinul de restart si cel de , structura de date
a grupului de pini folositi în urmatoarele patru pozitii, pinii D4,D5,D6 si D7.
Datorita necesitatii unui delay al afisajului, codul scr is pentru LCD se va produce in
bucla while(1) a fisierului main.c. Codul este scris intre USER CODE BEGIN/END.
Primul lucru va fi selectia cursorului prin functia LCD_setCursor avand ca
parametrii linia si coloana de la care se incepe scrierea. Parametrii folositi in aceasta
functie vor fi “1” (prima linie) si “2” (coloana a doua) deoarece vom afisa un text ce va
trebui incadrat astfel.
Apeland functia LCD_print vom putea scrie un text tat printr -o variabila de tip
string. Textul scris intre ghilimele “Tr eapta viteza” are 14 caractere si pentru o afisare
ingrijita vom scrie de pe coloana a doua pana pe a 15 -a, lasand prima si ultima coloana
libere.
Trecem la urmatorul rand unde vom scrie un singur caracter si anume o cifra de la
0 la 5 reprezentand treapta de viteza in care ne aflam din functie de ceilalti doi
parametrii (viteza si turatie). Setam cursorul pe linia 2 si coloana 9.
Mai departe avem nevoie de o functie ce face conversia intr -un parametru de tip
string dintr -un parametru de timp integer. Asta se poate realiza cu functia din librarie
numita LCD_itoa. Functia are nevoie de doi parametrii, variabila integer si un vector de
tip char. Declaram in zona de declaratii o variabila de timp char pentru a ne folosi de ea
in vederea conversiei executata de aceasta functie. Acesta conversie este necesara
deoarece functia de scriere din librarie accepta doar parametru de tip string. Dupa
conversie apelam functia de scriere cu parametrul dat de variabila char .
În continuare apelam o functie ce ne va sterge cu rsorul de pe display, functie
numita LCD_noCursor. Ea nu are niciun parametru. Va fi necesara apelarea functiei HAL
de întarziere deoarece textul afisajului se schimba, iar lipsa unei intarzieri nu ar facilita
vizualizarea altor lucruri inafara de primul c od rulat in bucla(am setat o întarziere de
100 ms).
Ultima functie apelata este LCD_clear, aceasta functie va sterge ecranul urmand sa
se reia codul pentru a se scrie altceva in cazul in care acest lucru este posibil. Functia
clear nu are parametri. Dupa terminare salvam si iesim din program. În urma acestei
programari display -ul va arata astfel. Mai urmeaza sa facem legaturile fizice, iar apoi
putem rula noul program.
Figura 5.13
Implementare
46
Conexiunile fizice necesa re pentru a pune în functiune display -ul sunt cele mai
numeroase din acest proiect. Nu mai putin de 12(+2 de prelungire) fire sunt folosite
pentru implementarea lui in proiect.
De la Vss se va duce o legatura la GND microcontrolerului si de la Vdd la 5V. A cesti
doi pini vor alimenta afișajul in low power mode. Pentru o vizualizare mai puternica
vom folosi pinii A(anod) si K(catod) legati la 5V respectiv GND. Pinul RS il vom conecta
la PC2, iar pinul de enable E la PC3. Vom folosi un potentiometru B1K cu pin ul 1 la 5V I
pinul 3 la GND ca pinul 2 sa fie legat la V0 pe display pentru a putea jongla cu
intensitatea luminoasa a textului. Pinul RW se va lega la GND pentru a fi activata
optiunea de scriere pe LCD. Pinii D4,D5,D6,D7 vor fi conectati la iesiri active ale
microcontrolerului dupa cum urmeaza: D4 la PB3, D5 la PB4, D6 la PB5 si D7 la PB6.
Aceasta configuratie poate fi observata si in imaginea de mai jos :
Figura 5.14
Implementare
47 5.2.2.4 Inițializarea motoarelor
Proiectul ne cesita existenta a doua motoare stepper (motoare pas cu pas). Cele
doua motoare vor afisa turatia motorului (in rotatii pe minut) respectiv viteza masinii
(in kilometrii pe ora). În varful acului rotativ vom pune un indicator de plastic. În figurile
de mai jos sunt afisate cele doua componente utilizate:
Figura 5.15 Figura 5.16
Verificarea fazelor acestui motor se poate realiza utilizand aparatul de masura.
Masurarea curentului ce trece prin cele doua bobine ne va indica cum sunt legate pentru
a putea stii pe viitor cum sa e polarizam. Asadar cuplam sondele aparatului de masura,
cea neagra la GND partea de jos a aparatului si cea rosie deasupra celei negre la desenul
ce semnifica partea pozitiva. Apoi invartim de rotita apara tului pana ajungem la zona
unde se masoara rezist enta simbolizata prin Ω. Aici selectam scala de 200.
Dupa ce am setat aparatul de masura acesta este gata pentru a verifica contactele
motorului. Avem nevoie de o bucata de hartie si un pix pentru a face un tabel si a nota ce
pini sunt conectati intre ei. Începem prin a pune sonda de neagra pe primul pin si apoi
sonda rosie o mutam pe rand la fiecare din ceilalti 3 pini. Constatam ca doar la primii doi
pini avem o valoare de 148.9 Ω. Ne mutam cu sonda neagra la urmatorul pin si verificam
ceilalti pini cu s onda rosie sa vedem unde mai obtinem asemenea valoare. Dupa toate
incercarile posibile constatam ca pinii sunt grupati doi cate doi.
Figura 5.17
Implementare
48 Acest tip de motor este folosit pentru a indica diverse marim i în mai multe domenii
si aparaturi. Cel mai raspandit fiind cel auto unde se foloseste în bordul din spatele
volanului.
Interiorul motorului este compus din doua bobine o melc prins la un capat de un
magnet aflat in zona dintre bobine de unde polarizarile survenite vor determina
invartirea acestui melc. Melcul aflat in conexiune cu o roata melcata o va invarti si pe
aceasta. In mijlocul rotii melcate este inglobata o tija lunga care iese destul de mult in
incapsularea motorului. Aceasta tija este capul pe care vom pune indicatorul de plastic.
Melcul, odata pus in miscare, se va tot rotii învartind cealaltă roata până cand opritorul
de pe ea se va lovi intr -unul din capetele de cursa existente. Ajuns acolo miscarea va tot
trepida din cauza incapacității de a merge mai departe. Se poate observa interiorul
motorlui în imaginea de mai jos:
Figura 5.18
Stiute aceste aspect mai ramane doar determinarea numarului de pasi necesari
pentru o rotatie completa. Rotorul m otorului nu face o rotatie completa, el face un arc de
cerc de la o pozitie de start pana la o pozitie de stop de 315°. Numarul de pasi efectuati
pe acest arc de cerc l -am determinat experimental. Un total de 200 de pasi executati de
la start inspre stop. Aceasta determinarea experimentala a fost facuta conectand
motorul la microcontroler si dandu -i semnale repetate intr -o anumita ordine astfel incat
rotorul sa se invarta. Numarând dintii de pe roata melcata aflam ca sunt un total de 50
de dinți.
Implementare
49 5.2.2.5 Comandarea motoarelor
Pentru a putea comanda motoarele pas cu pas de care am vorbit in subcapitolul
anterior va trebui sa folosim drivere ce sunt capabile sa le comande. De ce folosim
drivere? Deoarece este mult mai greu sa scriem un cod care sa aiba in vedere toat e
aspctele unei astfel de operatiuni, numarul de legaturi fizice ar fi foarte mare, o
multitudine de fire ar trebui incluse in proiect si multi pini de pe controler ar fi ocupati
pentru aceste chestiuni. .
Prin urmare vom folosi doua drivere pentru comanda motoarelor pas cu pas,
drivere folosite adesea in imprimantele 3D, dar si in alte aplicatii ce necesita un control
fin al miscarilor executate. Driverul de pe care il vom folosi este A4988ET. Schema de
principiu arata ca in imagine:
Figura 5.19
Sa incepem cu caracteristicile hardware ale implementarii in proiect ale acestor
drivere si al motoarelor. Introducem driverele in breadboard in locul din mijloc unde a
mai ramas spatiu, intre cele doua tranceivere. Le vom pozitiona cu potentiometrul spre
dreapta si cu pinii de o parte si de cealalta a canalului longitudinal de pe breadboard
pentru a avea acces la toti pinii. Dupa introducerea driverelor A4988 vom conecta pinii
stepperelor la pinii driverului. Urmarin d schema de mai sus vom proceda astfel: o
pereche de pini de pe stepper o vom conecta la pinii 1A si 1B si cealalta pereche la 2A si
2B. Procedam astfel cu ambele steppere si ambele drivere.
Dupa ce am terminat de legat stepperul de driver vom lega pinul D IRECTION de pe
driver la pinul A2 al microcontrolerului si pinul STEP la pinul A3. Pentru driverul al
doilea vom conecta pinul de directie la pinul A4 si pinul de STEP la pinul A5. Vom
conecta între ei pinii Reset și Sleep pentru a putea activa driverul (a tât pentru driverul 1
cât și pentru driverul 2). Conectam la ambele drivere pinul MS2 la 5V pentru a activa
modul de microsteping de ¼.
Implementare
50 În ceea ce priveste tensiunea de alimentare a driverelor, acestea se vor lega in
urmatorul mod: pinul Vss al driverului la GND si pinul Vdd la 5V de pe microcontroler.
Alimentarea de putere se va face de la o sursa externa de tensiune de exemplu o baterie
de 9V ce se va conecta cu “+” la Vmot si cu “ -” la Vss -motor (partea de jos a driverului
față de potentiometru). Vom dec upla totusi sursa de tensiune externa de la driver
pentru a putea face si alte modificari, iar acea t ensiune sa nu se influenteze acum.
Figura 5.20
Potentiometrul respectiv ajuta la determinarea tensiunii d e functionare respectiv
la determinarea curentului. Am setat, masurand cu aparatul de masura de la pinul Vss
alimentat de placa si poteniometru o tensiune egala cu 0.5 V pentru amandoua driverele.
Aplicand formula (2.1) si stiind ca RS=0.1 optinem o intens itate a curentului de 0.625 A.
Acuma trebuie sa scriem codul pentru comanda driverele si motoarele. Întram in
directorul proiectului, accesam fisierul CubeMX de unde ne pornim timerele TIM8 si
TIM3. Generam codul C si intram in IAR Embedded Workbeanch. Aic i in fisierul main.c
adaugam in functia HAL_TIM_PeriodElapsedCallback inca doua instante de intrerupere
bazate pe timere.
Asemanator cu instanța de intrerupere folosita pentru citirea si trimiterea datelor
de pe si pe magistrala CAN, tot asa vom proceda s i cu comanda driverului.
Configuram timerul pentru primul driver avant prescaler de 1600 si perioada de
49, iar pentru al doilea driver prescaler=1 600 si perioada= 79.
Vom crea trei functii pentru primul driver si inca trei pentru cel de -al doilea.
Prima fu nctie se va numi “step”, va face un singur pas si va da directia de deplasare.
Cele doua argumente ale functiei prima de tip boolean si a doua de tip integer, compun
functia in felul urmator: se pune conditia ca variabila integer sa fie mai mare decat 2
(pentru a se face pasi doar daca este o diferenta mai mare decat 2 intre valoarea actuala
si valoarea urmatoare rpm -ului). În aceasta conditie de face “SET” si apoi “RESET” pe
Implementare
51 pinul dedicat pasului ce va fi trimis spre driverul rpm -ului. Apoi vom avea o alta condiție
ce va utiliza variabila booleana. Daca aceasta va fi “true” atunci r2 va creste cu o unitate,
daca nu, r2 va descrește.
A doua func ție este numita “step_speed”cu un parametru integer. Ea va determina
viteza de deplasare a acului indicator in func tie de diferentele de valori aflate intre o
valoare a rpm -ului actuala si una precedenta. Astfel daca valoarea va fi mai mica sau
egala cu 200 se va apela functia step, daca va fi intre 200 si 550 se va apela de doua ori
functia, iar in ultimul caz se va a pela de trei ori.
Ultima functie, functia “direction”, va avea doi parametrii intregi. Aceasta functie
face posibila activarea pinului de directie al driverului. Valorile venite ca parametrii sunt
valoarea actuala si valoarea precedenta. Daca actual -preced ent este mai mare decat 0
atunci se va scrie( HAL_GPIO_WritePin ) SET pe pinul de directie și acul se va învârti spre
dreapta, dacă va fi mai mic decat 0 atunci se va scrie RESET si acul se va roti spre stanga.
Celalalt set de trei functii este dedicat drive rului si motorului numarul 2,
reprezentând viteza. Singurele modificari in aceste functii sunt legate de pinii pe care
dorim sa -i activam. Dar mai intervine inca o functie ce determina treapta de viteza ce va
fi afisata pe ecran.
Aceasta functie numita “tr eapta” are un argument intreg. Ea conține 5 condiții. O
condiție pentru fiecare treapta de viteza (1 ->5). Acest argument este dat la apelul
functiei de variabila s2. Variabila s2 este variabila ce tine pozitia actuala a acului
indicator pentru motorul de v iteza.
În ceea ce prive ște apelarea func țiilor ele vor fi prin intreruperile timerel or
amintite mai sus .Functiile le apelam astfel:
Dacă (htim ->Instance==TIM2) atunci
Scalăm r1 în intervalul 0 ->750
Aflam diferenta dintre r1 si r2 (int ref)
direc tion(r1,r2)
step_speed(ref)
Dacă (htim ->Instance==TIM3) atunci
Scalăm s1 în intervalul 0 ->750
Aflam diferenta dintre s1 si s2 (int refe)
direction_2(s1,s2)
step_speed_2(refe)
treapta(s2)
Se salveaza programul, apoi se conecteaza placa slav e la laptop, dupa aprinderea
becurilor se incarca programul pe microcontroler.
Sa nu uitam de alimentarea motoarelor, acestea trebuie sa primeasca 8 -9 V la pinul
Vmot al driverelor. Dupa ce am alimentat motoarele si al legat microcontrolerul slave la
Implementare
52 lapto p putem intra ori in debugger ori ap ăsăm butonul reset de pe plac ă. Action ând
potentiometru putem ve dea cum motorul stepper al turaț iilor se misc ă mult mai repede
decat cel al vitezei, iar pe display se afiseaz ă treapta de vitez ă în func ție de viteza de la
motorul stepper ce afiseaz ă viteza de deplasare.
5.2.2.6 Înglobarea î ntr-un sistem compact
Pentru a arata mult mai bine din punct de vedere estetic se vor introduce toate
componentele intr -o cutie de carton de duritate crescuta. Aici se vor aranja in asa fel
incat sa incapa toate elementele ce compun acest proiect. Zona din față o vom decupa
pentru a avea acces la componente. În capacul superior se vor decupa si gaurii locuri
specifice pentru a pozitiona LCD -ul si motoarele. În partea de jos se va gaurii si se v or
introduce suruburi cu piulite prin microcontrolere pentru a le pozitiona fix.
Breadboardurile le vom lipi tot de partea inferioara a cutiei, in interior. Cablurile le vom
aseza in ordine si le vom prinde cu banda izolatoare atat intre ele cat si de pere tii cutiei.
În ultima instanta vom gaurii spatele cutiei pentru a face loc iesirilor pentru
cablurile de alimentare. Vom inveli cutia intr -un ambalaj neutru si vom marca zonele de
indicator ale motoarelor.
În figura de mai jos se poate observa proiectul fin al:
Figura 5.21
Concluzii
53 6 Concluzii
6.1 Rezultate obținute
S-a urmărit simularea unei părți din bordul unui autovehicul și anume a
indicatoarelor de turație și de viteză a mașinii precum și afisarea treptei de viteză în care
ne aflăm în funcție de ceilalți doi parametrii.
Împlementarea s -a realizat utilizând doua microcontrolere STM32L476RG. Aceste
controlere jucând un rol esențial în coordonarea celorlalte componente ce alcătuiesc
întregul proiect.
Datele preluate de la potențiometru au fost prelucrate si au oferit doua alte marimi
de utilizat: turația si viteza. Prelucrarea a constat în rularea unui model matematic ce a
simulat aceste doua informatii pentru un autovehicul aflat in miscare. În functie de
viteza am sta bilit si treapta de viteza in care se afla simulatorul bordului auto.
Coordonarea motoarelor s -a realizat controland cu microcontrolerele doua drivere
pentru motoare pas cu pas. Transmisia de date intre controlere realizându -se, asemeni
autovehiculelor, pr in protocolul CAN.
Alegerea acestor doua controlere a fost datorita prețului scazul si al posibilitații
utilizarii protocolului CAN. Nevând doua canale CAN pe un singur controler, a fost
nevoie de doua microcontrolere. Acest lucru a facilitat înțelegerea ș i vizualizarea de
ansamblu a proiectului. Daca aveam un singur microcontroler în care puteam face
aceasta comunicare între doua noduri, obțineam doar rezultate, doar valori, și nu
puteam sa vedem ce se întâmplă dacă una din conexiuni este eronat pusă. Astf el punerea
în functiune a sistemului a necesitat si competențe hardware nu doar software.
Alt motiv al alegereii ar fi posibilitatea utilizarii programului CubeMX si al
programului IAR Embedded Workbench. Cu primul, configurarea este foarte accesibila și
facilă, putând fi modificate oricând si reimplementate dupa bunul plac. Ce -a dea doua
aplicatie a oferit un control foarte bun al codului pe tot parcursul proiectului. Oferta de
librarii bine structurata si la indemana, optiuni de cautare si patrundere ada ncă în
ierarhizarea si modularea functiilor si variabilelor, plus comentarii la obiect asupra
instructiunilor ce puteau fi folosite.
Zona de debugging a fost din nou foarte avantajoasa. La inceput utilizam
terminalul Tera Term si activam UART pentru a pute a vizualiza informatiile de pe un pin
sau altul. Dar cu debuggerul acestei placi nu mai este nevoie de utilizarea acelui terminal
în toate cazurile. Pentru a vedea daca niste date sunt transmise sau nu este suficient sa
intram in debugger si din live watch sa vizualizam ce dorim.
Bibliografie
54 6.2 Direcții de dezvoltare
Pe viitor se poate implementa un modul bluetooth prin care am putea controla
simulatorul prin telefon. Acest lucru necesita crearea unei aplicatii Android sau IOS,
depinde de telefonul mobil folosit, care sa poata transmite date unui modul bluetooth ce
mai apoi va oferii informatiile microcontrolerului master.
Algoritmul de determinare al vitezei si rotației se poate imbunatatii, introducandu –
se noi variabile ce va simula si mai bine experienta afișajului.
Controlul motoarelor stepper se poate face utilizand un mod mai fin de a face
pașii(în proiect folosim ¼, dar am putea implementa 1/16 pași).
Am putea introduce noi mecanisme pentru afișarea uleiului motorului,
combustibilul existent in rezervor, temperat ura motorului, temperatura din mediul
exterior sau temperatura din mediul interior. Acest lucru se poate face fie cu indicatoare
analogice(ace indicatoare rotite de un motor) fie cu indicatoare digitale (reprezentate
printr -un display).
O idee de dezvoltar e mult mai importanta ar fi eliminarea celor doua controlere si
inlocuirea lor cu integrate specializate in transmisia CAN numite si controlere stand –
alone CAN. Un exemplu de aceste cipuri ar putea fi MCP2515. Utilizând MCP2515 cu
tranceiverele MCP2551 vom avea nevoie doar de un microcontroler care nu va avea
nevoie neaparată de un protocol CAN înglobat (doar daca se dorește a se utiliza si
acesta). Acest microcontroler master va coordona munca celorlalte integrare externe.
Astfel “munca” din proiect este d ivizată si devine mult mai eficientă.
În ceea ce privește alimentarea sistemului ar fi de avut în vedere înlocuirea
bateriei cu o sursă ce nu îș[ pierde energia in timp.
7 Bibliografie
[1] UM1724 User manual, STM32 Nucleo -64 board, 2016
http://www.st.com/content/ccc/resource/technical/document/user_manual/98/
2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/tra
nslations/en.DM00105823.pdf
[2] RM0351 Reference man ual, STM32L4x5 and STM32L4x6 advanced ARM -based
32-bit MCUs, 2017
http://www.st.com/content/ccc/resource/technical/document/reference_m
anual/02/35/09/0c/4f/f7/40/03/DM00083560.pdf/files/DM00083560.pdf/jcr:co
ntent/translations/en.DM00083560.pdf
Bibliografie
55 [3] CAN Primer: Creating Your Own Network, CAN: Controller Area Network Lab
using ST STM32 Cortex -M processors, V 2.0 Robert Boys
http://www.keil.com/appnotes/files/apnt_236.pdf
[4] Auto motive CAN Bus System, Kiril Mucevski , 8 decembrie 2015
https://www.linkedin.com/pulse/automotive -can-bus-system -explained -kiril –
mucevski
[5] High -Speed CAN Transceiver MCP2551 Microchip.
http://ww1.microchip.com/downloads/en/DeviceDoc/21667f.pdf
[6] Where Does The "336" Come From In the Speed/RPM/Gear -Ratio/Tire -Size
Formula, de Marlan Davis, în 6 febru arie 2015
http://www.hotrod.com/articles/speed -rpm -gear -ratio -tire-size -formula/
[7] What is a Stepper Motor?, de Bill Earl, 23 noiembrie 2015
https://learn.adafruit.com/all -about -stepper -motors/what -is-a-stepper -motor
[8] A4988 Stepper Motor Driver Carrier
https://www.pololu.com/product/1182
[9] Spcification for LCD Module 1602A -1
https://www.openhacks.com/uploadsproductos/eone -1602a1.pdf
[10] Controling STM32 Hardware Timers using HAL, 31 martie 2016
https://visualgdb.com/tutorials/arm/stm32/timers/hal/
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: SIMULATOR EMBEDDED PE NTRU BORDUL UNUI AUTOTURISM FOLOSIND COMUNICAȚIA CAN LUCRARE DE DIPLOMĂ Autor: Vlăduț-Alexandru DOBRĂ Conducător științific :… [613754] (ID: 613754)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
