Proiect de diplomă: PETER Iosif Program de studii: Electronică Aplicată [308268]

PROIECT DE DIPLOMĂ

Absolvent: [anonimizat]: Ș.L. dr.ing. Stanca Aurel Cornel

BRAȘOV

2016

Comanda senzorizată a unui motor BLDC

Absolvent: [anonimizat]: Ș.L. dr.ing. Stanca Aurel Cornel

BRAȘOV

2016

FIȘA PROIECTULUI DE DIPLOMĂ

Cuprins

1. Scopul proiectului

Scopul proiectului este acela de a realiza un circuit de control senzorizat al unui motor BLDC cu puterea nominală de 200W (regim intermitent), care să îndeplinească următoarele cerințe:

Comanda sensului de rotație;

Comanda vitezei de rotație;

Oprirea la punct fix.

2. Obiectivele proiectului

Pentru realizarea scopului enunțat s-a urmărit îndeplinirea următoarele obiective:

Proiectarea circuitului de control senzorizat al motorului BLDS având ca nucleu microcontrolerul PIC 16F1825.

Realizarea circuitului de control senzorizat al motorului BLDS proiectat.

Realizarea programului de control al circuitului electronic implementat.

Verificarea funcționării și ajustarea parametrilor.

Stadiul actual în domeniu și noutatea adusă de proiect

În Fig.1 este prezentată construcția simplificată a unui motor BLDC. El conține un magnet permanent drept rotor și un număr de înfășurări statorice. Energia electrică este convertită în energie mecanică prin forțele de atracție dintre magnetul permanent și câmpul magnetic rotativ produs în bobinele statorice.

În exemplul din Fig.1 sunt 3 înfășurări conectate în stea. Fiecare bobină este întreruptă în centru pentru a permite rotorului să se miște în centrul câmpului magnetic indus. Cele mai multe motoare BLDC au 3 înfășurări statorice în totpologie stea. Un motor cu o astfel de topologie este rotit prin alimentarea în același timp a 2 faze. Alinierea din Fig.1 – stânga a rotorului este realizată prin alimentarea bobinelor A și B așa după cum indică sensul 1 din schema din Fig.1 – dreapta. Pentru a roti motorul cu 60˚ în sensul acelor de ceasornic de la alinierea A-B se alimentează bobinele C și B, sensul 2 din Fig.1 – stânga. Aliniamentul sugerat în Fig.1 este utilizat pentru vizualizarea comprehensivă a funcționării. [anonimizat] 90˚ față de direcția câmpului magnetic al bobinelor statorice.

Esențial pentru comutația motorului BLDC este detecția poziției rotorului și astfel controlul alimentării fazelor ce vor produce cel ami mare cuplu. Rotorul se deplasează cu 60˚ electrice la fiecare pas. Calea de curent potrivită pentru înfășurările statorice este activată când rotorul este aliniat la 120˚ față de câmpul magnetic curent al statorului și se deactivează când rotorul se află la 60˚ față de alinierea curentă. [anonimizat].

Controlul senzorizat al motorului BLDC

Cea mai simplă modalitate de a cunoaște momentul corect pentru comutarea curenților prin bobinele statorice este prin intermediul senzorilor de poziție. Mulți fabricanți de motoare BLDC livrează motoare cu 3 senzori de poziție cu efect Hall. Fiecare senzor prezintă la ieșire nivel ridicat pentru 180˚ electrice. Fiecare senzor prezintă un offset față de ceilalți de 60˚ electrice a.î. fiecare senzor este aliniat cu unul din circuitele electromagnetice. Diagrama temporală din Fig.2. Arată relația dintre ieșirile senzorilor și tensiunile de alimentare ale celor 3 faze.

În Fig.3 este prezentată schema de conectare a celor 3 [anonimizat] caz.

Controlul nesenzorizat al motorului BLDC

Este posibil să se determine când trebuie realizată comutația prin măsurarea tensiunii electromotoare la bornele bobinei nealimentate. Evident că avantajul acestei metode este costul redus datorat eliminării senzorilor. Există însă unele dezavantaje:

Motorul trebuie adus la turația minimă ce asigură generarea unei tensiuni suficiente pentru a fi sesizate;

Schimbarea bruscă a sarcinii motorului poate duce la blocare;

Metoda poate fi folosită doar pentru viteze ale motorului în limite ce asigură comutarea ideală tensiunii aplicate;

Comutarea la turații mai mari decât turația ideală va duce la funcționară discontină a motorului.

Tensiunea pe faza A, nealimentata, este data de relația de mai jos:

unde ABEMF este tensiunea electromotoare pe faza A, nealimentată iar CBEMF este tensiunea electromotoare pe faza C pusă la masă.

Noutatea adusă de proiect

Sistemul propus în prezentul proiect are două caracteristici cu caracter de originalitate:

Implementarea principiului de control al al motorului BLDC într-o schemă electronică cu componente cu cost redus;

Conceperea și implementarea algoritmului de control pentru oprirea motorului BLDC la punct fix.

Descrierea sistemului

În Fig.5 este prezentată schema bloc a sistemului de control a motorului BLDC. Nucleul sistemului este reprezentat de un microcontroler pe 8 biți din familia PIC ce are ca intrări:

Potențiometrul pentru prescrierea vitezei (intrarea analogică);

Comutator selecție sens de rotație (intrarea numerică);

3 senzori cu efect Hall de poziție, pentru determinarea poziției rotorului (intrări numerice);

Ieșirile din microcontroler sunt:

PWM pentru comanda turației motorului BLDC;

6 ieșiri numerice pentru generarea semnalului de alimentare trifazat trapezoidal al motorului BLDC.

În microcontroler rulează 2 algoritmi de control. Unul pentru comanda comutației și controlul sensului și vitezei de rotație (reglare tradițională) și altul pentru oprirea rotorului la punct fix.

Identificarea detaliilor constructive ale motorului BLDC

Dezvoltatea sistemului s-a făcut pe unul (din cele două motoare BLDC) fără senzoristică, ale unui actuator dedicat cutiilor de viteză automate ale autovehiculelor, Fig.6.

Configurația motorului BLDC din Fig.6 a fost determinată experimental. Numărul de înfășurări statorice ce sunt vizibile, este de 12. Așadar fiecare fază a motorului are un număr de 4 înfășurări dispuse la 90˚. Evident, decalajul între faze este de 120˚.

Identificarea numărului de poli magnetici ai rotorului s-a făcut printr-un set de determinări astfel: s-au alimentat câte două borne (cu tensiunea de 1,5V pentru a limita curentul prin bobine, asigurându-se totuși un cuplu suficient pentru roritrea în gol a rotorului) cu o anumită polaritate și s-a urmărit efectul. Asocierea polaritate, pereche de borne și rotația rotorului este prezentată în Fig. 7.

În urma determinărilor făcute s-a realizat schema constructivă a celor două motoare prezente pe modulul de test, Fig.8.

Determinarea semnalelor date de senzorii Hall așezați la 60˚ pentru fiecare din pozițiile ocupate de rotor este prezentată în Tab.1, pentru sensul de rotație în sensul acelor de ceasornic și în Tab.2 pentru sensul de rotație trigonometric.

Tab.1. Semnalele date de senzorii Hall în cazul succesiunii alimentării fazelor corespunzătoare sensului de rotație în sensul acelor de ceasornic.

Tab.2. Semnalele date de senzorii Hall în cazul succesiunii alimentării fazelor corespunzătoare sensului de rotație în sensul trigonometric.

Proiectarea și realizarea modulului electronic

Proiectarea circuitului electronic

S-a analizat în primă fază necesarul de componente cu capabilități corespunzătore aplicației propuse. A rezultat că următoarele componente satisfac aceste cerințe:

Microcontrolerul PIC 16F1825

Este folosit ca nucleu al sistemului de control. În Fig.9 este prezentată capsula microcontrolerului PIC 16F1825 [W1]. Fiecărui pin îi este asociată lista de funcționalități selectabile soft. Dintre caracteristicile puse la dispoziție, în aplicație sunt exploatate următoarele:

Oscilator intern de 32MHz calibrat în fabrică,cu o precizie de ±1%; frecvența de lucru poate fi ajustată de către utilizator în faza de proiectare sau în timpul rulării programului, în domeniul 31kHz-32MHz;

Tensiunea de alimentare într-un domeniu larg: 1,8V-5,5V;

Capabilitatea de programare serială în circuit (ICSP) prin pinii ICSPDAT și ICSPCLK;

12 pini ce pot fi utilizați ca intrări/ ieșiri digitale;

8 pini ce pot fi utilizați ca intrări analogice;

Ieșire PWM.

Lista completă a funcționalităților microcontrolerului 16F1825 este dată în Tab.3.

Driver-ul IR2101

Circuitul IR2101 este un driver de tensiune înaltă (max 600V) și mare viteză de comutare (ton/toff 130/90ns), utilizat pentru comanda tranzistoarelor MOSFET și IGBT de putere [W3].

Schema tipică de conectare a acestui circuit este prezentată în Fig.10.

Circuitul permite comanda independentă a canalelor inferior (LIN) și superior (HIN).

Intrările logice sunt compatibile cu ieșirile CMOS sau LSTTL standard.

Canalul flotant (high side) poate fi utilizat pentru comanda unui tranzistor MOSFET sau IGBT de putere.

Tab.3. Lista funcționalităților pinilor microcontrolerului PIC 16F1825

Tranzistorul IRF2807

Tranzistorul IRF 2807, Fig.11, este de tipul HEXFET – MOSFET de putere cu o rezistență în conducție extrem de mică și o viteză de comutație foarte mare [W6].

Principalele caracteristici în regim nominal de funcționare sunt prezentate în Tab.4.

Tab.4. Caracteristicile tranzistorului IRF2807 în regim nominal de funcționare.

Circuitul integrat CDB408

Circuitul integrat CDB408 conține 4 porți logice ȘI cu câte 2 intrări. Configurația pinilor circuitului este prezentată în Fig.12, [B1], iar în Tab.5 condițiile optime de funcționare [W5].

Tab.5. Condițiile de funcționare optimă ale circuitului CDB408.

Circuitul SS441 – senzor Hall

Circuitul integrat SS441, Fig.13. este un senzor cu efect Hall, de dimensiuni reduse, versatil, cu ieșire digitală. Este proiectat pentru a răspunde la alternanța polilor Nord și Sud ale unui magnet permanent sau electromagnet.

Funcționează la tensiuni de alimentare între 3,8V și 30V, și consumă pe ieșire, în regim continuu, 20mA și 50mA în regim ciclic.

Ieșirea sa digitală de tip open-colector (după cum se poate observa în Fig.14) permite conectarea la o mare varietate de dispozitive [W4].

Stabilizatorul de tensiune LM7805

Circuitul integrat LM7805 este un stabilizator de tensiune fixă de 5V, Fig.15. El poate furniza la ieșire un curent de până la 1,5mA.

Circuitul este imun la suprasarcină fiind prevăzut cu circuite interne de limitare a curentului și de protecție la supratemperatură.

Acest stabilizator poate furniza și tensiune reglabilă la ieșire utilizând componente externe ajustabile.

Schema electronică a circuitului

În Fig.16 este prezentată schema circuitului electronic al sistemului de control a motorului BLDC. Nucleul este un microcontroler PIC 16F1825 ale cărui capabilități multiple l-a calificat drept cel mai potrivit aplicației.

Alimentarea motorului BLDC se face prin intermediul unei punți trifazate realizată cu tranzistoare MOSFET de putere IRF2807, comandate prin intermediul driverelor IR2101.

Doar tranzistoarele din partea superioră a punții sunt comandate cu semnal PWM. Semnalul PWM aplicat acestor intrări este distribuit de la ieșirea PWM a microcontrolerului prin intermediul unor porți ȘI (integratul CDB408).

Realizarea circuitelor electronice

La implementarea schemei de control s-a optat pentru varianta unui modul pe placuță imprimată de test. Aceasta a oferit flexibilitatea necesară diverselor variante funcționale pe parcursul experimentelor.

O parte din conexiuni s-au realizat prin trasee pe placuță, cealaltă parte, care a suferit multe modificări configurații a fost realizată din fire cu conectori.

Software aplicație

Algoritmul de control

Mai jos este prezentat algoritmul de control al motorului BLDC. Algoritmul evidențiază opțiunile de alegere a sensului de rotație și modificarea turației precum și mecanismele de comutație și de monitorizare a poziției rotorului.

Pentru realizarea comutației se citesc senzorii Hall și, funcție de sensul de rotație, se comandă deschiderea tranzistoarelor pentru alimentarea înfășurărilor statorice a.î. rotorul să se rotească până în poziția următoare.

Algoritmul a fost implementat în limbaj de asamblare și este prezentat integral în Anexă.

Mediile de dezvoltare utilizate

Editarea, asamblarea și depanarea programelor au fost făcute în mediul de dezvolatre MPLAB v8.85 (freeware). În Fig.17 este prezentată o instanță a programului ce rulează pe microcontrolerului PIC 16F1825, în mediul MPLAB.

Programatorul utilizat pentru încărcarea programului în memoria microcontrolerului este de tip PICkit2 conectat la PC/ laptop pe magistrala USB, Fig. 18.

Software-ul utilizat pentru programarea microcontrolerului a fost PICkit2 v2.61 (freeware). O instanță a programluiu în cod mașină (HEX) este surprinsă în Fig.19.

Testarea sistemului

Au fost efectuate foarte multe teste pe parcursul dezvoltării sistemului. După punerea la punct a acestuia, diagramele temporale de funcționare sunt următoarele:

În Fig.20 semnalele de pe cele 3 senzori de proximitate cu efect Hall: pe CH1 (galben) semnalul de pe senzorul corespunzăto fazei U a motorului BLDC; pe CH2 (albastru) semnalul de pe senzorul corespunzăto fazei V a motorului BLDC; pe CH2 (mov) semnalul de pe senzorul corespunzăto fazei W a motorului BLDC;

În Fig.21 semnalele pe cele 3 faze – U, V, W / CH1 (galben), CH2 (albastru), CH3 (mov) pentru o turație mare a motorului (cca 90% din turația maximă);

În Fig.22 semnalele pe cele 3 faze – U, V, W / CH1 (galben), CH2 (albastru), CH3 (mov) pentru o turație mică a motorului (cca 20% din turația maximă).

Concluzii si dezvoltări ulterioare.

Sistemul proiectat și realizat funcționează în conformitate cu scopul propus:

Schimbarea sensului de rotație a motorului BLDC se face eșecuri;

Modificarea turației motorului BLDC se face de asemenea fără eșecuri;

Oprirea la punct fix a motorului BLDC se face cu o foarte bună probabilitate (cca 80%); s-a încercat reducerea procentului de eșecuri (ce era mare inițial, aproape 50%) prin ameliorări software ce vizat parametrii: frecvență PWM, întârziere comandă, viteză minimă. Cele mai bune rezultate s-au obținut prin forțarea unei viteze minime la sesizarea unei prescrieri sub un prag minim și micșorarea în acest fel a inerției rotorului (care ar fi, se pare, principala cauză a ratării opririi la punct fix).

Alte cauze de eșec pot fi identificate ulterior prin experimente extinse.

O îmbunătățire a sistemului poate fi aceea de completare cu un algoritm de reglare automată a turației în situația antrenării unor sarcini cu dinamică mare.

Bibliografia

[B1] * * *, Catalog "Circuite integrate digitale", IPRS Baneasa, 1985.

Webografia

[W1] http://ww1.microchip.com/downloads/en/DeviceDoc/41440B.pdf

[W2] https://www.fairchildsemi.com/datasheets/LM/LM7805.pdf

[W3] http://www.infineon.com/dgdl/ir2101.pdf?fileId=5546d462533600a4015355c7a755166c

[W4] http://sensing.honeywell.com/honeywell-sensing-ss400-series-product-sheet-009050-3-en.pdf

[W5] http://www.nxp.com/documents/data_sheet/74HC_HCT08.pdf

[W6] http://www.infineon.com/dgdl/irf2807pbf.pdf?fileId=5546d462533600a4015355dea79e18f2

Anexa

Listingul programului (realizat în limbaj de asamblare)

;Comanda senzorizata a motorului BLDC

;

;Faze motor: U, V, W

;Tranzistori punte: –––––––––––-

;Faza U: Q1 sus/ Q4 jos

;Faza V: Q2 sus/ Q5 jos

;Faza W: Q3 sus/ Q6 jos

;Functionare IR2101 –––––––––––

;HIN-LIN/HO-LO

;0_0/0_0

;0_1/0_1

;1_0/1_0

;1_1/1_1

;Succesiune comenzi sens rotire direct: –––––

;1 – U=hz/V=1/W=0 => Q1=0, Q2=1, Q3=0 | Q4=0, Q5=0, Q6=1

; HOU_HOV_HOW_LOU_LOV_LOW

; HINU_HINV_HINW_LINU_LINV_LINW

; 0 1 0 0 0 1 ;comanda pas 1

;2 – U=1/V=hz/W=0 => Q1=1, Q2=0, Q3=0 | Q4=0, Q5=0, Q6=1

; HOU_HOV_HOW_LOU_LOV_LOW

; HINU_HINV_HINW_LINU_LINV_LINW

; 1 0 0 0 0 1 ;comanda pas 2

;3 – U=1/V=0/W=hz => Q1=1, Q2=0, Q3=0 | Q4=0, Q5=1, Q6=0

; HOU_HOV_HOW_LOU_LOV_LOW

; HINU_HINV_HINW_LINU_LINV_LINW

; 1 0 0 0 1 0 ;comanda pas 3

;4 – U=hz/V=0/W=1 => Q1=0, Q2=0, Q3=1 | Q4=0, Q5=1, Q6=0

; HOU_HOV_HOW_LOU_LOV_LOW

; HINU_HINV_HINW_LINU_LINV_LINW

; 0 0 1 0 1 0 ;comanda pas 4

;5 – U=0/V=hz/W=1 => Q1=0, Q2=0, Q3=1 | Q4=1, Q5=0, Q6=0

; HOU_HOV_HOW_LOU_LOV_LOW

; HINU_HINV_HINW_LINU_LINV_LINW

; 0 0 1 1 0 0 ;comanda pas 5

;6 – U=0/V=1/W=hz => Q1=0, Q2=1, Q3=0 | Q4=1, Q5=0, Q6=0

; HOU_HOV_HOW_LOU_LOV_LOW

; HINU_HINV_HINW_LINU_LINV_LINW

; 0 1 0 1 0 0 ;comanda pas 6

;Corespondenta uC_port/pin-IR2103_IN/pin-tranzistor –––––

;RC0/pin10-HIN/pin2-Q1/HINU

;RC1/pin9-HIN/pin2-Q2/HINV

;RC2/pin8-HIN/pin2-Q3/HINW

;RC3/pin7-LIN'/pin3-Q4/LOU

;RC4/pin6-LIN'/pin3-Q5/LOV

;RC5/pin5-LIN'/pin3-Q6/LOW

;Pini intrare senzori Hall –––––––––

;RA2/pin11 – HallU

;RA3/pin4 – HallV

;RA4/pin3 – HallW

;––––––––––-

;RA5/CCP2/pin2 – iesire PWM

;––––––––––-

;RA1/pin12/AN1 – intrarea analogica

;RA0/pin13/AN0 – intrarea analogica

;Pini programare: ––––––––-

;RA0/pin13/ICSPDAT

;RA1/pin12/ICSPCLK

;RA3/pin4/VPP

;pin1/VDD

;pin14/VSS

;

PROCESSOR 16f1825

#include <p16F1825.inc>

;

__CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF

__CONFIG _CONFIG2 , _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF

;

;

; –––- Registre –––-

;

;

Cblock 0x020 ;Inceput RAM

FLAGS ;fanioane

rCmd ;registru comanda tranzistoare

rSz ;registru senzori

rSzOLD

rStart ;registru cu configuratia de start a senzorilor

rCuadr ;registru cuadratura

rVit ;registru viteza – memoreaza factorul de umplere

R0 ;registri de manevra

R1

R2

Endc

;

;––– Porturi ––––

;

#define iSpeed PORTA,2 ;RA0/AN2/pin11 uC – controlul vitezei

#define iSens PORTA,0 ;RA0/AN2/pin11 uC – controlul sensului

;

;––– Fanioane –––––

;

#define fStop FLAGS,0 ;fanion semnalizare procedura STOP

;

;––– Constante ––––-

;comenzi ===

;0_0_LINW_LINV_LINU_HINW_HINV_HINU

#define cCmd1 B'00100010' ;pas 1

#define cCmd2 B'00100001' ;pas 2

#define cCmd3 B'00010001' ;pas 3

#define cCmd4 B'00010100' ;pas 4

#define cCmd5 B'00001100' ;pas 5

#define cCmd6 B'00001010' ;pas 6

;senzori ===

; 0__SW_SV_SU_0__0 senzori

#define cSz1 B'00010100' ;pas 1 senzori

#define cSz2 B'00010000' ;pas 2 senzori

#define cSz3 B'00011000' ;pas 3 senzori

#define cSz4 B'00001000' ;pas 4 senzori

#define cSz5 B'00001100' ;pas 5 senzori

#define cSz6 B'00000100' ;pas 6 senzori

#define cStop .40 ;prag Stop

#define cPasi .8

ORG 0

GOTO MAIN

;

ORG 4 ;––– rutina de intrerupere de timp –––– GOTO MAIN

;

Speed

BANKSEL ADCON0

movlw b'00000101' ;bit7 = 0 – Aliniere la stanga,

;bit6 = 0 – Vref = VDD,

;bit5 =0 neimplementat

;bits4:2 = 001 – AN1,

;bit1 = 0 – nu este conversie,

;bit0 =1 – start acquisition

movwf ADCON0

;Temporizare necesara achizitiei

movlw .20

movwf R0

decfsz R0

goto $-1

;

BSF ADCON0,GO ;Start conversie

BTFSC ADCON0,GO ;Gata coversie?

GOTO $-1 ;Nu, retestare

BANKSEL ADRESH ;

MOVF ADRESH,W ;Citeste bitul superior

BANKSEL rVit

movwf rVit

return

;

Delay

movlw .7

movwf R1

movlw .50

movwf R2

decfsz R2

goto $-1

decfsz R1

goto $-5

return

;

; *** PROGRAMUL PRINCIPAL***

;

MAIN

;invalideaza CCP1

BANKSEL CCP1CON

clrf CCP1CON

;definire I/O

BANKSEL PORTA

clrf PORTA

clrf PORTC

BANKSEL TRISA

movlw B'00011111' ;

movwf TRISA

clrf TRISC

;setare frecventa oscilatorului intern

BANKSEL OSCCON

movlw B'01101010' ;4MHz

movwf OSCCON

;

;Setare intrare analogica

BANKSEL ANSELA

clrf ANSELA

clrf ANSELC

bsf ANSELA,ANSA1

;setare frecventa CAN

BANKSEL ADCON1

movlw b'01100000' ;Fosc/64

movwf ADCON1

;

BANKSEL APFCON1

clrf APFCON1

bsf APFCON1,CCP2SEL ;CCP2 asigant lui RA5

;

;Configurare modul CCP pentru operatii PWM:

;1. Invalideaza pinul alocat PWM (CCP2)prin setarea bitului corespunzator din TRIS.

BANKSEL TRISA

bsf TRISA,5 ;CCP2 pin (pin2 uC)

;2. Seteaza perioada PWM prin incarcarea registrului PR2.

BANKSEL PR2

movlw .250

movwf PR2

;3. Configureaza modulul CCP pentru modul PWM prin incarcarea registrului CCP2CON

;cu valoarea potrivita.

BANKSEL CCP2CON

movlw b'00001100'

;bit 7-6, Daca CCP2M<3:2> = 11

; 00 = Iesire unica; P2A modulat; P2B, P2C, P2D asigante ca porturi I/O

;bit 5-4 DC2B<1:0>=00 PWM cei mai putini semnificativi 2 biti pentru DC.PWM

;bit 3-0 PWM mode: 1100 = PWM mode: P2A, P2C active-sus; P2B, P2D active-sus

movwf CCP2CON

;4. Seteaza DC pentru PWM prin incarcarea registrului CCPR2L si bitii CCP2 din regidtrul CCP2CON.

BANKSEL CCPR2L

movlw .10

movwf CCPR2L

;5. Configureaza si starteaza Timer2:

;• Sterge fanionul pentru intrrupere TMR2IF din registrul PIR1.

BANKSEL PIR1

bcf PIR1,TMR2IF

;• Seteaza valuarea prescalerului pt Timer2 prin incarcarea bitilor T2CKPS din registrul T2CON.

;• Valideaza Timer2 bitului TMR2ON din registrul T2CON.

BANKSEL T2CON

movlw b'00000100';

;bit 6-3 TOUTPS<3:0>=1001=10 bitii Postscaler-ului reg Timer2

;bit 2 TMR2ON=1 (on) Timer2

;bit 1-0 T2CKPS<1:0>=00=1 bitii Prescaler-ului reg Timer2

;T2=250*1*1*1us=250us(4kHz) (Fosc=4MHz => Tcicl=1us)

movwf T2CON

;6. Valideaza iesirea PWM output

;• asteapta pana cand apare depasire pt Timer2 (bitul TMR2IF din registrul PIR1 este setat).

BANKSEL PIR1

btfss PIR1,TMR2IF

goto $-1

;• Valideaza pinul de iesire CCP1 prin stergerea bitului corespunzator din TRIS

BANKSEL TRISA

bcf TRISA,5

;

movlw B'00010000'

BANKSEL rStart

movwf rStart ;configuratia senzorilor la pornire

movlw cPasi

movwf rCuadr ;initializare registru cuadratura

clrf rSzOLD

;

MAIN0 ;====================== sectiunea programului principal

call Speed ;citeste viteza prescrisa de la potentiometru

;

movlw cStop

BANKSEL rVit

subwf rVit,W

btfsc STATUS,C ;Vit(rVit)<Vit_min(W)?

goto FUNCT

;

btfsc fStop ;motor in miscare?

goto STOP ;nu

movlw cStop ;da

movwf rVit ;asigura viteza minima

bsf fStopi ;procedura de stop initializata

BANKSEL OSCCON

movlw B'01010010' ;500kHz

movwf OSCCON

goto MAIN1

;

FUNCT ;functionare

bcf fStop

bcf fStopi

BANKSEL OSCCON

movlw B'01101010' ;4MHz

movwf OSCCON

MAIN1

BANKSEL rVit

movfw rVit

BANKSEL CCPR2L

movwf CCPR2L ;stabileste viteza

BANKSEL PORTA

movfw PORTA

andlw B'00011100' ;mascare, in W se afla configuratia actuala

BANKSEL rSz

movwf rSz ;incarcare configuratie curenta senzori

xorwf rSzOLD,W ;compara config.actuala cu cea veche, W se altereaza

btfsc STATUS,Z ;configuratie diferita?

goto MAIN0

;

movfw rSz

movwf rSzOLD ;actualizarea configuratie senzori

xorwf rStart,W ;comparare configuratie curenta senzori cu cea initiala

btfss STATUS,Z ;este aceasi? rSz(W)=rStart?

goto DIR ;nu

decfsz rCuadr ;da; Pozitia initiala?

goto DIR ;nu

movlw cPasi ;da, rCuadr=0

movwf rCuadr

btfss fStopi ;procedura de oprire motor?

goto DIR

STOP

clrf rVit

BANKSEL CCPR2L

clrf CCPR2L ;opreste motorul

;

DIR

btfss iSens

goto INV

Pas1

movfw rSz

xorlw cSz1

btfss STATUS,Z

goto Pas2

call Delay

movlw cCmd2

movwf PORTC

goto MAIN0

Pas2

movfw rSz

xorlw cSz2

btfss STATUS,Z

goto Pas3

call Delay

movlw cCmd3

movwf PORTC

goto MAIN0

Pas3

movfw rSz

xorlw cSz3

btfss STATUS,Z

goto Pas4

call Delay

movlw cCmd4

movwf PORTC

goto MAIN0

Pas4

movfw rSz

xorlw cSz4

btfss STATUS,Z

goto Pas5

call Delay

movlw cCmd5

movwf PORTC

goto MAIN0

Pas5

movfw rSz

xorlw cSz5

btfss STATUS,Z

goto Pas6

call Delay

movlw cCmd6

movwf PORTC

goto MAIN0

Pas6

movfw rSz

xorlw cSz6

btfss STATUS,Z

goto MAIN0

call Delay

movlw cCmd1

movwf PORTC

goto MAIN0

;

INV

movfw rSz

xorlw cSz1

btfss STATUS,Z

goto Pas2r

call Delay

movlw cCmd6

movwf PORTC

goto MAIN0

Pas2r

movfw rSz

xorlw cSz2

btfss STATUS,Z

goto Pas3r

call Delay

movlw cCmd1

movwf PORTC

goto MAIN0

Pas3r

movfw rSz

xorlw cSz3

btfss STATUS,Z

goto Pas4r

call Delay

movlw cCmd2

movwf PORTC

goto MAIN0

Pas4r

movfw rSz

xorlw cSz4

btfss STATUS,Z

goto Pas5r

call Delay

movlw cCmd3

movwf PORTC

goto MAIN0

Pas5r

movfw rSz

xorlw cSz5

btfss STATUS,Z

goto Pas6r

call Delay

movlw cCmd4

movwf PORTC

goto MAIN0

Pas6r

movfw rSz

xorlw cSz6

btfss STATUS,Z

goto MAIN0

call Delay

movlw cCmd5

movwf PORTC

goto MAIN0

END

Similar Posts