You are on page 1of 82

FPGA baserad PWM-styrning av BLDC-motorer

Examensarbete utfrt i elektroniksystem


av
Andreas Johansson

LiTH-ISY-EX-3341-2003
Linkping 2003





FPGA baserad PWM-styrning av BLDC-motorer

Examensarbete utfrt i elektroniksystem
vid Linkpings tekniska hgskola
av

Andreas Johansson
LiTH-ISY-EX-3341-2003















Handledare: Carl Persson, SAAB Bofors Dynamics AB
Examinator: Kent Palmkvist
Linkping 2003-05-30






Avdelning, Institution
Division, Department

Institutionen fr Systemteknik
581 83 LINKPING


Datum
Date
2003-05-30


Sprk
Language

Rapporttyp
Report category

ISBN

X Svenska/Swedish
Engelska/English
Licentiatavhandling
X Examensarbete

ISRN LITH-ISY-EX-3341-2003


C-uppsats
D-uppsats

Serietitel och serienummer
Title of series, numbering

ISSN

vrig rapport
____




URL fr elektronisk version
http://www.ep.liu.se/exjobb/isy/2003/3341/




Titel
Title


FPGA baserad PWM-styrning av BLDC-motorer

FPGA based PWM-control of BLDC motors

Frfattare
Author

Andreas Johansson



Sammanfattning
Abstract
This thesis work contains a litterature study about electrical motors in general and how PWM-
patterns for brushless DC-motors can be made. A suitable method has been implemented as a
simulation model in VHDL. A simulation model of a brushless DC-motor which describes the
phasecurrents, torque and angular velocity has also been made. The motor model made
simulations easier for the complete PWM-system.

The design was synthesised and tested with a prototypeboard including a SPARTAN II FPGA. In
order to test the design, a powerstage and a motor was included. The tests showed that the design
was working as expected according to the previous simulations.

A study about an alternative way to control a brushless DC-motor has also been made. This
alternative is best suited when the generated back-EMK for the motor is sinusoidal. A simulation
model for a part of a system like this has been made, and it has been synthesised in order to
examine if it is possible to implement using a FPGA availible today.


Nyckelord
Keyword
PWM, BLDC, electrical-motors, FPGA, VHDL, back-EMK, SVM, motor-control

Sammanfattning
Arbetet innefattar en studie om el-motorer i allmnhet och hur PWM-generering
fr borstlsa DC-motorer kan utfras. En lmplig metod har implementerats
som simuleringsmodell i VHDL. En simuleringsmodell av en BLDC-motor
gjordes ocks fr att p ett bra stt kunna simulera konstruktionen samt att
studera strmmarna, momentet och vinkelhastigheten fr motorn.

Konstruktionen har ven syntetiserats och testats med en riktig motor och
drivkrets. En spartan II FPGA frn XILINX har anvnts tillsammans med
tillhrande labkort. Testerna visade att konstruktionen fungerade enligt
simuleringsresultat.

Vidare s har ven en studie om ett alternativt stt att styra en BLDC-motor
utfrts. Denna variant lmpar sig bst d mot-EMK fr motorn r sinusformad.
Till viss del har en simuleringmodell gjorts fr detta alternativ. Modellen har
ven syntetiserats fr att f en uppfattning om det r genomfrbart i dagens
befintliga kretsar.

Frord
Detta examensarbete har utfrts under vintern/vren 2002-2003 p SAAB
Bofors Dynamics AB i Gteborg. Rapporten r det avslutande momentet p
mina studier till civilingenjr inom elektronikdesign.

Jag vill tacka min handledare Carl Persson p SAAB Bofors Dynamics och min
examinator Kent Palmkvist vid institutionen fr systemteknik.





Innehllsfrteckning
1 Introduktion ....................................................................................... 1
1.1 Inledning ........................................................................................................... 2
1.2 Syfte.................................................................................................................. 2
1.3 Metod................................................................................................................ 2
1.4 Disposition........................................................................................................ 2
2 Teori ................................................................................................... 5
2.1 PWM-styrning................................................................................................... 6
2.2 Allmnt elmotorer ............................................................................................. 6
2.2.1 Motorns uppbyggnad rotorns-poler och statorkonfiguration ................... 7
2.3 Borstls DC-motor och borstls AC-motor....................................................... 8
2.4 Utgngspunkter fr PWM-styrning BLDC jmfrt med BLAC....................... 9
2.4.1 Motorns moment....................................................................................... 10
2.4.2 Utgngspunkter fr PWM......................................................................... 11
2.5 PWM-styrning av BLDC-motor ....................................................................... 11
2.5.1 Rotorpositions bestmning....................................................................... 11
2.5.2 Transistorbrygga -drivsteg........................................................................ 12
2.5.3 PWM-generering ...................................................................................... 14
2.6 PWM-styrning av BLAC-motor ....................................................................... 15
2.6.1 Rotorpositionsbestmning........................................................................ 15
2.6.2 Space vector modulation (SVM)............................................................... 15
2.7 Analys av teoridelen ....................................................................................... 17
2.7.1 Blockkommutering.................................................................................... 17
2.7.2 SVM.......................................................................................................... 18
3 Implementering i VHDL................................................................... 21
3.1 Systemuppbyggnad fr blockkommutering - simuleringsmodell.................... 22
3.2 Blockdiagram blockkommutering ................................................................ 22
3.2.1 Clk_divider................................................................................................ 23
3.2.2 In_buffer ................................................................................................... 23
3.2.3 Time_calc ................................................................................................. 23
3.2.4 Comm_states ........................................................................................... 25
3.3 Modellering av motor ...................................................................................... 25
3.3.1 Mot-EMK modellering............................................................................... 28
3.4 Simuleringar ................................................................................................... 31
3.4.1 Pverkan p momentrippel med olika fasinduktans och PWM-frekvens. 31
3.4.2 Simulering med asymmetrisk och symmetrisk pulsgenerering................ 33
3.4.3 Problem vid simulering med motormodellen............................................ 33
3.5 Systemuppbyggnad fr SVM simuleringsmodell ........................................ 34
3.6 Blockdiagram -SVM........................................................................................ 35
3.6.1 Rom_adr................................................................................................... 35
3.6.2 ROM_1 och ROM_2................................................................................. 35
3.6.3 mult ........................................................................................................... 36
3.6.4 sub_and_shift ........................................................................................... 36
3.6.5 RAM_11bit ................................................................................................ 36
3.6.6 SVM_controller ......................................................................................... 36
3.6.7 ROM_6bit ................................................................................................. 36

4 Syntetisering och test..................................................................... 37
4.1 Syntetisering av blockkommuteringskonstruktionen...................................... 38
4.1.1 Val av FPGA............................................................................................. 38
4.1.2 Arbetsgng vid syntetisering .................................................................... 38
4.1.3 Syntetisering mot tidskrav ........................................................................ 38
4.1.4 Pipelining av kombinatoriskt nt............................................................... 39
4.1.5 Place and route ........................................................................................ 40
4.2 Test av syntetiserad krets .............................................................................. 40
4.3 Analys av tester .............................................................................................. 41
4.3.1 Fasstrmmarnas rippel............................................................................. 41
4.3.2 Fasstrmmarnas frekvensspektrum......................................................... 44
4.3.3 Problem.................................................................................................... 45
4.4 Syntetisering av SVM-konstruktionen ............................................................ 46
5 Resultat och slutsatser................................................................... 47
6 Kllhnvisningar ............................................................................. 49
7 Appendix.......................................................................................... 53
7.1 Appendix I - Frkortningslista......................................................................... 54
7.2 Appendix II - VHDL-kod simuleringsmodeller ............................................. 55
7.3 Appendix III - VHDL-kod syntetiserad......................................................... 68


Figurfrteckning

Figur 1, princip fr PWM___________________________________________________________________ 6
Figur 2, olika typer av elmotorer _____________________________________________________________ 7
Figur 3, statorkonfigurationer fr BLDC-motor, delta respektive Y. __________________________________ 8
Figur 4, mot-EMK och fasstrmmar i BLDC-motor_______________________________________________ 9
Figur 5, halvvgsoperation och helvgsoperation av BLDC motor __________________________________ 10
Figur 6, momentrippel med trapetsformad mot-EMK_____________________________________________ 10
Figur 7, momentrippel med sinusformad mot-EMK ______________________________________________ 11
Figur 8, transistorbrygga __________________________________________________________________ 13
Figur 9, olika PWM-moder_________________________________________________________________ 14
Figur 10, referensvektor fr SVM____________________________________________________________ 16
Figur 11, PWM-mnster med SVM fr sektor 0-60______________________________________________ 19
Figur 12, blockdiagram ver simuleringsmodell ________________________________________________ 22
Figur 13, tillstndsdiagram fr symmetrisk pulsgenerering________________________________________ 24
Figur 14, tillstndsdiagram fr asymmetrisk pulsgenerering_______________________________________ 24
Figur 15, tillstndsmaskin fr switchning______________________________________________________ 25
Figur 16, mot-EMK (BEMK) fr alla tillstnd __________________________________________________ 26
Figur 17, strukturell motormodell med switchar ________________________________________________ 28
Figur 18, simulering med ideal trapetsformad mot-EMK__________________________________________ 29
Figur 19, simulering med konstant mot-EMK i vergngarna ______________________________________ 30
Figur 20, simulering med konstant mot-EMK lika med 0 i vergngarna _____________________________ 30
Figur 21, sammanstllning av simulering med PWM-frekvens 50kHz ________________________________ 32
Figur 22, sammanstllning av simulering med PWM-frekvens 5 kHz ________________________________ 32
Figur 23, 5 kHz PWM-frekvens, induktans uppifrn och ner 1 mH, 0,1 mH, 0,5 mH, 1,5 mH, 2,5 mH. ______ 33
Figur 24, referensvektorer i olika sektorer _____________________________________________________ 34
Figur 25, simuleringsmodell fr SVM_________________________________________________________ 35
Figur 26, beskrivning av olika perioder fr en fasstrm___________________________________________ 42
Figur 27,h_pwm_l_on, extern induktans, PWM frekvens 58 kHz ____________________________________ 42
Figur 28, h_pwm_l_on, ingen extern induktans, PWM-frekvens 58 kHz ______________________________ 42
Figur 29, h_pwm_l_pwm, extern induktans, PWM-frekvens 58 kHz _________________________________ 43
Figur 30, h_pwm_l_pwm, ingen extern induktans, PWM-frekvens 58 kHz_____________________________ 43
Figur 31, h_pwm_l_on, extern induktans, PWM-frekvens 29,4 kHz__________________________________ 43
Figur 32, h_pwm_l_on, ingen extern induktans, PWM- frekvens 29,4 kHz ____________________________ 43
Figur 33, h_pwm_l_pwm, extern induktans, PWM-frekvens 29,4 kHz ________________________________ 43
Figur 34, h_pwm_l_pwm, ingen extern induktans, PWM-frekvens 29,4 kHz ___________________________ 43
Figur 35, h_on_l_pwm, extern induktans, PWM-frekvens 58 kHz ___________________________________ 44
Figur 36, h_on_l_pwm, ingen extern induktans, PWM-frekvens 58 kHz ______________________________ 44
Figur 37, PWM-frekvens 58 kHz, extern induktans ______________________________________________ 44
Figur 38, PWM-frekvens 58 kHz, ingen extern induktans__________________________________________ 44
Figur 39, PWM-frekvens 29 kHz, extern induktans ______________________________________________ 45
Figur 40, PWM-frekvens 29 kHz, ingen extern induktans__________________________________________ 45

INTRODUKTION

-1-
1 Introduktion
Hr beskrivs bakgrund, syfte och metod fr
arbetet, samt hur rapporten r disponerad.
INTRODUKTION

-2-

1.1 Inledning
P SAAB Bofors Dynamics i Gteborg utvecklas IR-sensorer. Dessa sensorer
innehller ett antal elmotorer. Motorerna r PWM styrda fr att spara
frlusteffekt. Drivning av motorerna sker med hjlp av en separat PWM-
drivkrets fr respektive motor. Lsningen r utrymmeskrvande, alstrar mycket
vrme och r kostsam. Drivkretsen r en MCM kapsel som har relativt hg vikt
vilket frsvrar montering och kar det mekaniska slitaget p ben och
mnsterkort.

Styrsignalen in till drivkretsen r analog vilket krver en DA-omvandling d
denna signal frn vriga systemet r p 16 bitars digital form. Motorerna r
borstlsa 3-fas DC-motorer med permanentmagnetrotor.
1.2 Syfte
Uppgiften bestr i att underska mjligheten att erstta nuvarande system fr
PWM-styrning av 3-fas DC motorer. Den tnkta konstruktionen bestr av en
eller flera FPGA:er dr de tre faserna styrs direkt frn utgngar p en FPGA.
Ngon enkel drivkrets eller transistorbrygga krvs mellan FPGA och motor.
Upplsningen ska vara minst 16 bitar.
1.3 Metod
En litteraturstudie om styrning av elmotorer i allmnhet ska gras, fr att f en
bild av vilka problem och svrigheter som finns. Vidare ska litteraturstudien
frdjupas i vilka mjliga PWM metoder som finns. Nr en tnkbar metod valts
ska en marknadsunderskning av lmplig FPGA gras. nskvrt r hr att ett
komplett labbkort finns att tillg fr att p s stt underltta test.

Nsta steg r att implementera vald lsning i VHDL och simulera denna.
Frhoppningsvis kommer ven syntes och testning mot den valda kretsen
innefattas av examensarbetet, men det sker i mn av tid. En preliminr tidsplan
utarbetas men tidpunkt fr syntetisering fr hllas flytande beroende p
simuleringsresultat.

1.4 Disposition
Rapporten inleds med en kort litteraturstudie om elmotorer, frmst d 3-fas
borstlsa DC-motorer (BLDC-motorer) eftersom det r sdana som
examensarbetet gr ut p att styra. Detta fljs av en frdjupning i olika PWM
metoder. Teorin analyseras infr rapportens implementeringsdel, dr arbetet
med VHDL-programmeringen beskrivs. Nsta del av arbetet behandlar hur
INTRODUKTION

-3-
syntetisering och testning av konstruktionerna fortlpt. Sjlva rapportdelen
avslutas med resultat och slutsatser.

I appendix II och III terfinns en del av VHDL-koden som utarbetats. En
frkortningslista finns i appendix I.
INTRODUKTION

-4-


TEORI

-5-
2 Teori
Detta kapitel bestr av en genomgng av PWM-
styrning och en inblick till olika elmotorer. Det
ligger till grund fr det fortsatta
konstruktionsarbetet.
TEORI

-6-

2.1 PWM-styrning
Grundidn med pulsbreddsmodulering eller pulse width modulation (PWM) r
att under en tidsperiod skapa en spnning som ett medelvrde av fyrkantspulser,
se figur 1. Fr att till exempel erhlla V
DC
/2 kommer fyrkantspulserna vara 1
respektive 0 under lika lng tid.


Figur 1, princip fr PWM

En av de vanligaste typer av pulsviddsmodulering (PWM) r sinustriangel
baserad. En triangelformad vg med konstant frekvens jmfrs med en
referenssignal. Varje gng referenssignalen skr triangelvgen sker ett omslag
p utsignalen. Nr referenssignalen r mindre n triangelvgen blir utsignalen 0
och om referenssignalen r strre n triangelvgen blir utsignalen 1 [6]. Den
absolut enklaste varianten p denna PWM metod r att anvnda en komparator
med en triangelformad insignal som jmfrs med en referenssignal.

En annan vanlig PWM metod r Space-vector modulering (SVM). SVM
anvnds framfr allt till 3-fas AC styrda motorer, se senare kapitel.
2.2 Allmnt elmotorer
Elmotorer kan delas in i ett antal kategorier, se figur 2 [15]. En DC-borstmotor
styrs av ett magnetflt som skapas genom att rotorn strmstts med en
glidkontakt, s kallad mekanisk kommutering. En rektangulrliknande strm
skapas d vid rotation. Varfr en borstls DC-motor (BLDC) kan kallas DC-
motor r just att den mekaniska kommuteringen r ersatt av en elektronisk
kommutering som skapar rektangulra strmmar [15]. Annars r likheterna rent
mekaniskt mellan en BLDC-motor och en AC-motor strre, vilket frklaras mer
ingende i nsta stycke [1]. En permanentmagnet-synkronmotor (PMSM) har
stora likheter med en BLDC-motor.

V
DC

T
PWM

TEORI

-7-

Figur 2, olika typer av elmotorer

En DC-borstmotors strsta nackdel r dess krav p underhll d glidkontakten
slits och ven orsakar gnistbildningar och strningar p nrliggande elektronik.
En borstls motor har inte dessa problem med glidkontakter, damm frn
kommutator och gnistbildningar, dock kan en borst-motor nd vara lmplig fr
vissa applikationer dr motorn inte anvnds kontinuerligt [16].
2.2.1 Motorns uppbyggnad rotorns-poler och
statorkonfiguration
Beroende p antalet magnetiska poler p rotorn varierar frhllandet mellan
rotationen fr magnetfltet och rotationen av rotorn. Vid kat antal poler s
roterar magnetfltet fler gnger per mekaniskt varv. Ett samband mellan
elektriska grader och mekaniska grader finns sledes [2].

(2/antalet poler)*elektriska grader = mekaniska grader.

Detta samband anger att det r ett konstant frhllande mellan dessa storheter,
varfr detta egentligen inte behver beaktas men kan vara bra att knna till fr
bland annat behandling av resolver signaler och simulering av motor. kat antal
poler ger hgre upplsning men komplexiteten p den mekaniska
konstruktionen kar.

Det finns tv mjliga statorkonfigurationer fr en BLDC-motor, antingen Y-
formad eller deltaformad, dr den frstnmnda r vanligast, se figur 3.



Application
DC-brush
Brushless
AC-motors
Switched reluctance
Permanent-
magnet
Induction
PMSM BLDC
TEORI

-8-

Figur 3, statorkonfigurationer fr BLDC-motor, delta respektive Y.

2.3 Borstls DC-motor och borstls AC-motor
I princip bestr en BLDC- eller BLAC-motor (PMSM kallas ofta fr BLAC i
litteraturen) av en stator och en rotor. Rotorn bestr av en permanentmagnet med
tv eller fler poler. Rotorn drivs med hjlp av ett roterande magnetiskt flt som
skapas d strm flyter genom statorns induktiva faslindningar. Antalet
faslindningar kan varieras men 3-stycken r vanligast, d en avvgning mellan
funktion och komplexitet mste gras. Med fler faser skulle motorn utveckla ett
jmnare moment men bde den mekaniska konstruktionen och styrlogiken blir
mer komplicerad. Om parallellen mellan en BLDC-motor och en DC-borstmotor
grs s har borstvarianten oftast fler faser och kommuteringslgen eftersom nr
glidkontakten rr sig kan varje ny kontaktyta ses som en switch som sls p eller
av [2]. I denna rapport antas en borstls motor ha 3-faser.

I en BLDC-motor sker den elektriska kommuteringen med hjlp av
fyrkantspulser som styrs s att endast en eller tv av de tre faserna r aktiva
samtidigt, s kallad blockkommutering. Detta r den strsta skillnaden mellan en
borstls 3-fas DC-motor och en 3-fas AC-motor, dr alla tre faserna r aktiva
samtidigt. Detta beror p skillnaden i uppbyggnad av dessa motorer. I en BLDC-
motor r motorn konstruerad s att mot-EMK (eng. frkortning - BEMF) som
skapas r trapetsformad (trapezoidal shaped). I en BLAC-motor dremot
verlappar statorlindningarna varandra och polerna r generellt stt fler vilket
gr att den mot-EMK som skapas r sinusformad [14]. Detta r den
fundamentala skillnaden mellan dessa motortyper vilket resulterar i olika
strategier fr PWM-generering. Detta frklaras i fljande kapitel.
A
B
C
A
B
C
TEORI

-9-
2.4 Utgngspunkter fr PWM-styrning BLDC jmfrt med
BLAC
Fr att konstant moment ska utvecklas i BLDC-motorn ska den styras med
fyrkantsstrmmar, blockstrmmar enligt figur 4. Styrning som utfrs p detta
stt benmns ofta som blockkommutering. Om fasstrmmarna kontrolleras p
detta stt kommer maximalt moment erhllas eftersom de tv faser som har
maximalt positiv eller negativ mot-EMK vid ett givet tillflle utnyttjas, se figur
4. Ea, Eb och Ec r respektive fas genererade mot-EMK och Ia, Ib och Ic r den
strm som ska skapas fr att utnyttja varje fas mot-EMK p bsta stt. Positiv
mot-EMK och positiv strm ger liksom negativ mot-EMK och negativ strm
positivt bidrag till momentet.

Figur 4, mot-EMK och fasstrmmar i BLDC-motor

Att kommutera faserna p detta stt kallas helvgsoperation. Vid
halvvgsoperation sker kommutering s att endast den positiva eller den
negativa delen av mot-EMK utnyttjas. Frdelen med halvvgsoperation r att
halva antalet cykler krvs fr rotorn ska rotera ett elektriskt varv, samt att endast
3 switchar krvs istllet fr 6 stycken i drivsteget, se figur 8. Nackdelen dremot
r att momentripplet blir avsevrt mycket strre varfr helvgsoperation oftast r
att fredra [1]. Figur 5 visar i vilken ordning fasstrmmarna ska aktiveras fr att
rotera rotorn ett elektriskt varv. Vid halvvgsoperation r centrumpunkten
jordad och endast en terminal styrs t gngen. Vid helvgsoperation r
centrumpunkten flytande och tv terminaler kontrolleras. I dagslget r det
vanligaste sttet att styra en BLDC-motor med en PWM-signal frn en
dedikerad PWM-krets eller med en mikroprocessor [1], [2], [3].
Ea
Eb
Ec
Ia
Ib
Ic
Fas a
Fas b
Fas c
TEORI

-10-

Figur 5, halvvgsoperation och helvgsoperation av BLDC motor
2.4.1 Motorns moment
Momentet som utvecklas i en BLDC motor kan beskrivas som

( )
r c c b b a a e
i e i e i e T / + + = (ekv. 1)

d motorns strmmar kontrolleras s att respektive fas mot-EMK utnyttjas
maximalt eftersom fyrkantsstrmmar genereras, som i figur 4. Dr e
i
r
respektive fas mot-EMK, i
i
respektive fasstrm och
r
vinkelhastighet. Idealt
stt utvecklas ett variationsfritt moment om fasstrmmarna r helt rektangulra.
Men eftersom faserna r induktiva kommer strmmarna att avvika frn den ideal
formen och ge ett visst momentrippel vid varje kommuteringstillflle, se figur 6.
Effekten av dessa oidealiteter minskas vid hga hastigheter d variationerna
filtreras bort av rotorns trghetsmoment [15].

Figur 6, momentrippel med trapetsformad mot-EMK

Att styra en BLDC-motor p detta stt r relativt enkelt men fr goda prestanda
r det viktigt att mot-EMK frn motorn r trapetsformad. I figur 4 r dock mot-
EMK idealt trapetsformad vilket inte r fallet i en riktig motor, men det r en
god approximation.

Om en BLAC-motor styrs p detta stt kommer momentvariationerna bli strre
och variera med sinusformen p mot-EMK, se figur 6. Om styrning fr en
BLAC-motor ska utformas s r drfr utgngslget annorlunda. Fasstrmmarna
som ska generera magnetfltet ska istllet vara sinusformade, vilket gr att vid
rtt styrning kommer en BLAC-motor att generera jmnare moment n en
TEORI

-11-
BLDC-motor. Det vill sga, prestandan fr motorstyrningen blir bttre. Detta
beror p att det r omjligt att skapa en ideal fyrkantsstrm genom en spole,
men en sinusstrm r enklare att skapa [15]. Det gr med strmreglering att
motverka effekterna av sinusformad mot-EMK i ett BLDC-styrsystem, men fr
bsta prestanda ska sinusstrm strategi anvndas [1].

Figur 7, momentrippel med sinusformad mot-EMK

2.4.2 Utgngspunkter fr PWM
Utgngspunkterna r sledes fljande:

Trapetsformad mot-EMK (BLDC):
Relativt enkel styrning
Visst momentrippel vid lgre hastigheter

Sinusformad mot-EMK (BLAC)
Komplicerad styrning
Bttre prestanda avseende momentrippel jmfrt med BLDC

Eftersom utgngspunkten fr detta arbete var att utarbeta ett system fr styrning
av BLDC-motorer s har huvuddelen av arbetet lagts p detta. Men d grnsen
mellan vad som kallas BLDC-motorer och BLAC-motorer inte r sjlvklar alla
gnger har ven en studie gjorts om hur en motor med sinusformad mot-EMK
kan styras. Detta gjordes under den senare delen av examensarbetet.
Specifikationen ver de motorer som arbetet syftar till att styra kallas BLDC-
motorer, men mot-EMK r sinusformad. Det finns ven liknande exempel i
litteraturen, dr grnsen mellan vad som kallas BLDC och BLAC r hrfin.
2.5 PWM-styrning av BLDC-motor
Fr ett komplett motorstyrsystem krvs oftast ngon form av reglering, men
detta arbete innefattar enbart PWM-genereringen, det vill sga enbart hur
pulserna genereras och kontrolleras/kommuteras utifrn en given insignal.
2.5.1 Rotorpositions bestmning
Som nmnts i fregende stycke ska fasernas strmmar kontrolleras beroende p
var rotorn befinner sig vid ett givet tillflle. Till detta behvs ngon form av
metod fr att avgra rotorns position.
TEORI

-12-

Det finns ett antal olika varianter fr positionsbestmning, det vanligaste sttet
r att anvnda 3 eller flera Hallsensorer och p s stt registrera det magnetiska
fltet nr rotorn passerar en sensor. Fr applikationer med begrnsat utrymme
kan det vara lmpligt att istllet anvnda en resolver. Den resolver som redan
finns i systemet fr att mta vinklar bestr av en transformatorkoppling mellan
stator och rotor som ger en vinkel utryckt i en sinus- och en cosinusvg. Med
hjlp av detta gr positionen av rotorn att berkna. Det finns ven ett antal
metoder som inte krver ngra extra komponenter utan anvnder sig av till
exempel statorlindningarnas mot-EMK [1]. Dessa metoder r idag under stark
frammarsch d kostnaden fr en sdan metod blir lgre, men detta behandlas
inte vidare i detta arbete eftersom en resolver nd mste ing fr
positionsservoregleringen.

Fr rotorpositionsbestmning i de specifika BLDC-motorerna fr detta arbete
anvnds resolversignaler. Tre syntetiska sensor signaler motsvarande signalerna
frn hallsensorer genereras utifrn resolversignalen. Med hjlp av de tre
kommuteringsignalerna kan positionen bestmmas med 60 graders noggrannhet
enligt tabell 1. Resolvern har fr vrigt 16-bitars noggrannhet och anvnds i det
vriga systemet fr positionsservoregleringen [10].

Tabell 1, kommuteringsignaler som funktion av elektriska grader
e K_A K_B K_C
0-60 1 0 1
60-120 1 0 0
120-180 1 1 0
180-240 0 1 0
240-300 0 1 1
300-360 0 0 1

2.5.2 Transistorbrygga -drivsteg
Eftersom helvgsoperation r att fredra beskrivs endast ett drivsteg avsett fr
detta. Sex switchar behvs fr att kunna skapa de signalkombinationer som
krvs. Figur 8 visar hur en sdan transistorbrygga kan utformas. Numreringen p
transistorerna kommer vara enligt denna figur genom hela arbetet.

TEORI

-13-

Figur 8, transistorbrygga

Dioderna som sitter parallellt med varje transistor kallas free-wheeling diodes
(FWD) och r ndvndiga dels fr att styra motorns strmmar under normalt
frfarande men ocks fr att skydda transistorerna frn de spnningstoppar som
skapas nr en transistor stngs av. Amplituden p spnningstopparna bestms av

dt
di
L V
pk
= (ekv. 2)

D motorns fas r induktiv kan dessa spnningstoppar bli stora och orsaka
kortslutning i transistorerna. FWD begrnsar spnningstopparna till
spnningsfallet ver dioden. Ett annat problem att beakta r de momentana
kortslutningar som kan intrffa d en av de tre vre dioderna r framspnd och
motsvarande undre transistor sls p. Dioden blockerar inte strmmen direkt
utan den krver en viss tid fr att terhmta sig (reverse recovery time), under
den tiden intrffar kortslutning i ett ben i transistorbryggan [3]. Kortslutning kan
ven intrffa om en sdan kommutering ges ifall den vre transistorn i ett ben r
aktiv och nstkommande transistorpar inkluderar den undre transistorn i samma
ben. En sdan sekvens r inte normal vid helvgsoperation fr BLDC-motorer
varfr detta frmodligen inte behver tgrdas. Fr AC-styrda motorer r alla tre
faser aktiva samtidigt och d kan detta bli ett problem. En frdrjning mellan
switchningarna mste d infras, s kallad dead-time delay.

1 5 3
4 6 2
TEORI

-14-
2.5.3 PWM-generering
Prestandan frndras, frmst med avseende momentrippel, beroende p hur
switchningen av transistorbryggan utfrs. Eftersom detta rippel r viktigt att
minimera br tester med olika switchmoder genomfras. Enligt [8, 9,17] finns
det tminstone 5 olika PWM-moder. Dels d bde den vre och undre switchen
fr respektive sekvens samtidigt switchas, eller s kan antingen den vre eller
den undre hllas konstant hg under PWM-perioden. Detta kan ven ske
alternerande, varannan gng r den vre transistorn konstant p och varannan
gng r den undre konstant p. Se figur 9 fr de olika moderna. Numreringen p
x-axeln anger inom vilket 60 graders intervall rotorn befinner sig, det vill sga
0-60 grader r intervall 1, 60-120 grader intervall 2 och s vidare. De vre
transistorerna r 1, 5 eller 3 och de undre r transistorerna 4, 6, eller 2 enligt
numrering i figur 8. Att anvnda sig av generering d antingen den vre eller
den undre switchen i ett ben r aktiv under en hel kommuteringssekvens ger
minst strmrippel enligt [19].

Med hjlp av de olika PWM-moder kan ven strningarna som orsakas av mot-
EMK i den inaktiva fasen pverkas. Vid sensorls kommutering r det nskvrt
att ha s lite strningar som mjligt vid tidpunkten fr kommutering i den
inaktiva fasen. Enligt [17] r h_pwm_l_on att fredra eftersom strningarna d
kommer s lngt ifrn varje kommuteringstillflle som mjligt. Huruvida dessa
strningar pverkar motorns gng och moment fr vrigt r oklart men pverkan
antas vara liten eller ingen. Eftersom detta arbete inte behandlar sensorls
kommutering kan dessa strningar frmodligen frsummas.



Figur 9, olika PWM-moder

h_pwm_l_pwm
h_pwm_l_on
h_on_l_pwm
pwm_on
on_pwm
1 2 3 4 5 6
vreben
undreben
TEORI

-15-
Hur pulserna ligger i frhllande till PWM-perioden kan pverka distorsionen i
fasstrmmarna [11]. Antingen kan symmetriskt eller asymmetrisk PWM
anvndas, dr den symmetriska varianten har pulsen centrerad och den
asymmetriska har en puls placerad antingen i brjan eller i slutet av PWM-
perioden. Detta kan vara intressant att utfra simuleringar och tester fr att
kontrollera vilka skillnader som finns vid anvndandet av dessa varianter.
Symmetrisk PWM verkar dock vara den mest anvnda.
2.6 PWM-styrning av BLAC-motor
D skillnaden mellan vad som kallas BLDC och BLAC-motor inte r s stor,
som tidigare nmnts, fljer hr en genomgng av en metod fr PWM-styrning
av BLAC-motorer.
2.6.1 Rotorpositionsbestmning
Fr en BLAC-motor ska fasstrmmarna synkroniseras med mot-EMK, som ven
sker fr en BLDC. Men hr r inte mot-EMK konstant med 60 graders intervall
utan varierar hela tiden. Detta gr att rotornsposition behver bestmmas med
bttre upplsning, ju hgre upplsning desto bttre prestanda p
motorstyrningen [19]. Drfr r det inte hr aktuellt med hallsensorer utan en
resolver r att fredra. Se nsta kapitel fr nrmare beskrivning.
2.6.2 Space vector modulation (SVM)
Den vanligaste och modernaste metoden fr att styra en BLAC motor r att
anvnda space vector modulation (SVM). Den beskriver ett trefas system med
en rumsvektor. Pulssekvensen som ska genereras varierar beroende p var i
koordinatsystemet referensvektorn befinner sig. En av tta mjliga
switchsekvenser anvnds beroende p var referensvektorn befinner sig. Med
hjlp av de tta switchsekvenserna i form av basvektorer kan tider fr respektive
fasaktivering berknas med projektion av referensvektorn p de tv fr tillfllet
nrliggande basvektorerna [21]. Tv av basvektorerna (111) och (000)
inaktiverar de tre faserna, eftersom ingen strm kommer att g genom ngon fas
vid dessa kombinationer. Basvektorerna skapas i ett drivsteg med 3 ben, samma
som fr BLDC fallet, dr till exempel (100) motsvarar att det frsta benet r
kopplat till Vdc och andra och tredje till gnd. Vid blockkommutering r det
endast en av de sex basvektorerna som aktiveras t gngen, vilket r den
fundamentala skillnaden jmfrt med SVM. Vid SVM approximeras
referensvektorn som en kombination av en nollvektor och tv basvektorer
kontinuerligt under hela varvet. Drfr behvs positionsbestmning med hgre
noggrannhet vid SVM.


TEORI

-16-

Figur 10, referensvektor fr SVM

Referensvektorn beskrivs som:

pwm pwm
b
pwm
a ref
T
t
V
T
tb
V
T
ta
V V
0
0
+ + = (ekv. 3)

Dr ta, tb och t0 r respektive tider fr att generera spnningsvektorerna Va, Vb
och V0 [22]. Dessa tider berknas med trigonometri och blir enligt fljande
ekvationer. Vinkeln r vinkeln mellan referensvektorn och den senast
passerade basvektorn.

( ) ( )
pwm ref
T V ta |
.
|

\
|
= sin
3
1
cos
2
3
(ekv. 4)

( )
pwm ref
T V tb sin 3 = (ekv. 5)

Tb Ta T t
pwm
= 0 (ekv. 6)

D SVM bygger p trigonometriska berkningar blir det komplicerat att
implementera i en FPGA direkt. Trigonometriska berkningar kan berknas med
till exempel CORDIC algoritmer (COordinate Rotation DIgital Computer). Men
om det finns mjlighet att berkna de trigonometriska funktionerna i frvg, kan
det vara mer frdelaktigt att spara frutberknade data i look up tables (LUT).
Detta gr att endast multiplikationer behvs, d vinkeln alfa kan anvnds fr att
adressera den minnescell som innehller rtt data. Fr till exempel ekvation 5
gller d att data fr (3)sin() finns lagrade i ett ROM, som sedan multipliceras
med Vref. P s stt erhlls tb utan ngon trigonometrisk berkning.


100
110
010
011
001
101
111
000
Vref
Vb
Va

TEORI

-17-
Hur skapas d referensvektorn? Om momentreglering av motorn nskas mste
terkoppling av fasstrmmarna ske. De tre fasstrmmarna transformeras till ett
tv-dimensionellt d,q koordinatsystem dr q r momentkomponenten och d r
komponenten fr det magnetiska fldet. Momentet regleras mot
momentbrvrdet och en transformation till - domnen grs fr att berkna
av och p tiderna enligt figuren ovan, varp korrekt PWM-mnster levereras till
drivsteget [23].

2.7 Analys av teoridelen
Huvudarbetet av implementeringsdelen har riktats in mot att frst skriva VHDL-
kod till en simuleringsmodell fr blockkommutering och sedan modifiera denna
fr att kunna syntetisera konstruktionen mot en FPGA. Nsta steg r att testa
funktionen med hjlp av ett testkort och motor.

Under arbetets gng vcktes tanken p att ven utforma ett system fr styrning
av en motor med sinusformad mot-EMK fr att se om det r genomfrbart.
Eftersom det gjordes under arbetets senare del har bara en del av en
simuleringsmodell utformats. I de tv kapitlen nedan anges frutsttningarna fr
arbetet med att konstruera de bda systemen.
2.7.1 Blockkommutering
Ett av mlen med arbetet r att erhlla en 16 bitars upplsning p moduleringen,
eller snarare underska om det r mjligt eftersom resten av systemet baseras p
16 bitars upplsning. PWM frekvensen r given och ska vara 50 kHz, vilket den
ocks r i det befintliga systemet. 50 kHz ger en periodtid p 20 s. Denna tid
ska d kunna delas in i 2
16
olika niver p pulsbredd om 16 bitars upplsning ska
erhllas. Hur stor det minsta tidsinkrementet ska vara bestms av

ns
s
res
pwm
T
3 , 0
2
20
16
= =

(ekv. 7)

Denna tid ger frekvensen

GHz
ns
3 , 3
3 , 0
1
= (ekv. 8)

3,3 GHz r en orimligt hg frekvens i dessa sammanhang. Eftersom detta system
ska implementeras i en FPGA s klarar inte dagens kretsar en sdan
klockfrekvens. Drfr mste avkall p antingen upplsningen eller PWM-
frekvensen gras. Lgre PWM-frekvens ger lngre periodtid och drmed strre
minsta tidsinkrement. Men att snka PWM-frekvensen pverkar negativt genom
TEORI

-18-
rippel i motorns moment, d tiden mellan fyrkantspulserna blir lngre. Att
istllet snka upplsningen frn tnkta 16 bitar verkar vara ett bttre alternativ.
En rimlig niv kan vara 12 bitars upplsning, vilket ger en klockfrekvens p
cirka 205 MHz. Fr klockfrekvenser runt 200 MHz finns ett antal FPGA:er att
vlja bland. Eftersom det r nskvrt med ett komplett labkort fr testning av
konstruktionen s r en klockfrekvens runt 200 MHz ven bra i det avseendet,
d labkort med FPGA:er i den prestandanivn finns tillgngliga hos ett flertal
fretag.
2.7.2 SVM
Idn med att gra en simuleringsmodell fr SVM r att dels se vad fr
svrigheter som kan uppst, dels att gra modellen syntetiserbar fr att
underska om tidskraven uppfylls vid syntetisering. Eftersom modellen inte r
komplett fr testning med motor tjnar endast syntetiseringen som en
fingervisning fr vilka marginaler som finns.

Fr att implementera PWM-generering i detta fall krvs en del berkningar och
det r mer komplicerat jmfrt med blockkommuteringsfallet. Ngon reglering
har inte behandlats i den tidigare delen av arbetet med blockkommuteringen
utan endast PWM-genereringen och kommutering, varfr utgngslget kommer
vara samma ven hr, ingen frdjupning i reglering. Drfr antas hr att en
referensvektor uttryckt i - koordinatsystemet erhlls frn vriga systemet.
Tiderna ta, tb och t0 berknas och PWM-pulser skapas enligt lmpligt mnster.
Eftersom PWM-signalen ska generera en vektor med hjlp av en kombination av
tre basvektorer under varje PWM-period, finns hr en rad olika varianter p hur
signalerna kan se ut. Det mnster som implementeras r en symmetrisk variant
dr samma ordningsfljd av vektorer upprepas vid varje ny PWM-period, se
figur 11 [24]. Figur 11 illustrerar vilka vektorer som anvnds fr sektor 0-60.
Nr referensvektorn befinner sig i ngon av de andra sex sektorerna sker
genereringen enligt samma mnster men med andra basvektorer.

TEORI

-19-

Figur 11, PWM-mnster med SVM fr sektor 0-60
Tpwm
4
0 t
2
ta
2
tb
2
0 t
2
tb
2
ta
4
0 t
000 100 110 111 110 100 000
a
b
c
TEORI

-20-

IMPLEMENTERING I VHDL

-21-
3 Implementering i
VHDL
I detta kapitel redogrs arbetet med VHDL-
konstruktionen av simuleringsmodellen fr
blockkommutering med tillhrande motormodell.
Detta fljs av arbetet med simuleringsmodellen
fr SVM med tidigare angivna begrnsningar.
IMPLEMENTERING I VHDL

-22-

3.1 Systemuppbyggnad fr blockkommutering -
simuleringsmodell
En tnkbar systemmodell arbetades fram, frst med vilka grundlggande
funktioner som kommer att krvas och senare mer noggrant i form av
blockdiagram dr dess funktioner ska implementeras i VHDL. De
grundlggande funktionerna som krvs r:
Frekvensdelare: Fr att utifrn en given oscillatorfrekvens kunna erhlla
nskad frekvens.
Buffert: Mjlighet att buffra insignalen med givet tidsintervall s att nskad
stabilitet p insignal erhlls.
Pulsgenerering: Pulser med bredd proportionell mot insignalen ska genereras,
mjlighet att vlja mellan symmetrisk och asymmetrisk PWM.
Utsignal: Olika switch-mnster genereras beroende p vald PWM-mode.

3.2 Blockdiagram blockkommutering
De olika delarna r sammansatta fr simulering enligt figur 15. Varje del
frklaras mer ingende i kapitel 3.2.1-3.2.4.

Insignalen ref_in samplas med hjlp av in_buffer. Den buffrade insignalen
anvnds som referens fr bredden p pulserna. Den genererade pulsen anvnds
sedan i comm_states som utifrn rotorns position ger korrekt utsignal fr
styrning av transistorbryggan. Motor_bridge r en simuleringsmodell av en
BLDC-motor som frklaras mer ingende i kapitel 3.3. Kommuteringssignaler
motsvarande hall-signaler erhlls frn motor_bridge vilket gr att de enda
insignaler som behvs fr simulering r en klocka och en referenssignal.


Figur 12, blockdiagram ver simuleringsmodell


clk_divider
U5
clk_global
gen_clk_20M
in_buffer
U1
ref_in
ref_buf clk clk_out
time_calc
U2
in_calc
clk t1
dir
in_calc
gen_clk_20M
comm_states
U3
clk
t1
dir_s
K s
s K
motor_bridge
U9
g
com
IMPLEMENTERING I VHDL

-23-
3.2.1 Clk_divider
Frekvensdelare dr den globala klockan delas ned till nskad frekvens med hjlp
av den generiska variabeln div.
3.2.2 In_buffer
Samplar ett vrde frn 16 bitars styrsignal med frekvensen clk. nskad
sampelfrekvens fs frn en instans av clk_divider.
3.2.3 Time_calc
Puls genereras utifrn storleken p insignalen. Insignalen trunkeras s att valfri
upplsning erhlls och eftersom insignalen r i tv komplement form srskiljs
hr den mest signifikanta biten fr att ange rotationsriktningen. Den globala
klockan stter grnsen fr tidsupplsningen. Uppbyggnaden av denna funktion
bygger p en tillstndsmaskin med fyra tillstnd, pulse_high, pulse_low, sample
och idle. I stort bestr denna funktion av en rknare som skapar en puls
proportionell mot insignalen. Det gr att vlja mellan tv moder, den ena fr
symmetrisk- och den andra asymmetrisk puls. Vilket tillstnd som ska vara
aktivt bestms p negativ klockflank och tilldelningen av tillstndet sker p
positiv klockflank. En del mrkliga simuleringsresultat intrffar om bara positiv
klockflank anvnds. Till den frsta modellen som gjordes anvndes inte
tillstndsbeskrivning, detta infrdes senare d den symmetriska genereringen
blir enklare att beskriva med hjlp av tillstnd. Figurerna nedan visar
tillstndsgraferna fr de bda varianterna av pulsgenerering.




IMPLEMENTERING I VHDL

-24-


Figur 13, tillstndsdiagram fr symmetrisk pulsgenerering

Cmp_vector r en rknare som rknas upp frn 0 till pwm_per. Rknaren
jmfrs enligt figurerna med trunk_in som r den trunkerade insignalen. Idle
tillstndet behvs ifall insignalen r odefinierad, vilket kan intrffa i brjan av
en simulering. PWM_per anger PWM-perioden i antal globala klockpulser.




Figur 14, tillstndsdiagram fr asymmetrisk pulsgenerering
cmp_vector<pwm_per/2 - trunk_in/2
pulse_high
pulse_low
idle
sample
pwm_per/2-trunk_in/2<cmp_vector<pwm_per/2+trunk_in/2
cmp_vector>=pwm_per
cmp_vector>=pwm_per
cmp_vector>=pwm_per/2-trunk_in/2
trunk_in = U
pulse_high
pulse_low
idle
sample
cmp_vector>= trunk_in
cmp_vector>=pwm_per
cmp_vector<trunk_in
trunk_in = U
IMPLEMENTERING I VHDL

-25-
3.2.4 Comm_states
De olika varianterna av PWM-mnster fr BLDC styrning bygger p samma
ordningsfljd av fas-aktivering. Det som skiljer r hur styrningen av de enskilda
transistorerna i transistorbryggan utfrs, se kap 3.4.3 Drfr kan en generell
tillstndsmaskin fr de olika PWM-moderna skapas dr endast tillstnden skiljer
sig t. Det normala frfarandet r att tillstnd S1 fljs t av S2 och s vidare. Fr
ndrad rotationsriktning p motorn ndras rotationsriktningen fr tillstnden.


Figur 15, tillstndsmaskin fr switchning
3.3 Modellering av motor
Fr att kunna simulera PWM-systemet p ett bra stt behvs
kommuteringssignaler frn en modell av en motor. Till att brja med gjordes en
enkel modell som enbart simulerade en rotation med fyra olika hastigheter.
Denna modell r tillrcklig om endast PWM-genereringen ska kontrolleras men
en bttre modell behvs om mer information om motorn nskas. Drfr
konstruerades en modell som beskriver fasstrmmar, moment och
vinkelhastighet, vilket kan vara bra fr att se hur olika PWM-moder pverkar
och hur stor induktansen till varje fas br vara fr att f bra prestanda.

En BLDC motor kan beskrivas enligt fljande [18]:
(
(
(

+
(
(
(

(
(
(

+
(
(
(

(
(
(

=
(
(
(

c
b
a
c
b
a
c
b
a
c
b
a
e
e
e
i
i
i
dt
d
M L
M L
M L
i
i
i
R
R
R
v
v
v
0 0
0 0
0 0
0 0
0 0
0 0
(ekv. 9)

dr

S1
S6
S2
S5
S3
S4
[Ka, Kb, Kc]
[1,0,0]
[1,1,0]
[0,1,0]
[0,1,1]
[0,0,1]
[1,0,1]
[1,1,0]
[0,1,0]
[0,1,1]
[0,0,1]
[1,0,1]
[1,0,0]
IMPLEMENTERING I VHDL

-26-
0 = + +
c b a
i i i (ekv. 10)

Momentet beskrivs som:

( )
r c c b b a a e
i e i e i e T / + + = (ekv. 11)

Rotationen beskrivs enligt:

J B T T
dt
d
r L e r
/ ) ( = (ekv. 12)

och EMK som

r e
k e = (ekv. 13)

Hur mot-EMK ska beskrivas finns en del olika varianter p. En vanlig metod r
att approximera den som idealt trapetsformad [9], se figur 16.

Figur 16, mot-EMK (BEMK) fr alla tillstnd

dr:
i
x
fasstrm [A]
T
e
elektromagnetiskt moment [Nm]
e
x
mot-EMK [V]
J trghetsmoment [Kgm
2
]
R statorresistans
L fasinduktans [H]
M msesidig induktans mellan faserna [H]

r
rotorhastighet [rad/s]
B dmpningskonstant [N/rad/s]
k
e
EMK konstant [Vs/rad]
ea
eb
ec
6-1 1-2 2-3 3-4 4-5 5-6
IMPLEMENTERING I VHDL

-27-
Det r underfrsttt att i, e, Te, w
r
r funktioner av tiden t

Eftersom modellen ska implementeras som en simuleringsmodell i VHDL mste
den anpassas fr diskret tid, dr approximationen


T
n y n y
dt
t dy ] [ ] 1 [ ) ( +
= (ekv. 14)

anvnds, dr T r samplingstiden. Detta ger fljande ekvationer:

| | | | | | ( ) 1 1 1 ] 1 [ ] [

+ = n e n Ri n v
M L
T
n i n i
a a a a a
(ekv. 15)
| | | | | | ( ) 1 1 1 ] 1 [ ] [

+ = n e n Ri n v
M L
T
n i n i
b b b b b
(ekv. 16)
| | | | | | ( ) 1 1 1 ] 1 [ ] [

+ = n e n Ri n v
M L
T
n i n i
c c c c c
(ekv. 17)

| |
| | | | | | | | | | | | ( ) n i n e n i n e n i n e
n
n T
c c b b a a
r
e
+ + =

1
] [ (ekv. 18)

| | | | | | | | | | ( ) 1 1 1 1 + = n B n T n T
J
T
n n
r L e r r
(ekv. 19)
| | | | n k n e
r e
= (ekv. 20)

Dessa ekvationer har implementerats som funktioner i ett package och anvnds i
en strukturell uppbyggnad av en transistorbrygga, se figur 17. Bryggan styr de
tre fasstrmmarna och driver en simulerad rotor. Tv olika typer av switchar har
konstruerats, en fr de tre vre och en fr de tre undre. Detta har gjorts d det r
enklare att gra en enkelriktad switch istllet fr dubbelriktad. Fr att simulera
avstngd respektive ledande transistor har en kontrollsignal av std_logic typ
anvnts. Detta eftersom den innefattar ett hgimpedivt lge, Z. Det gr att
tillsammans med den resolutionsfunktion som std_logic anvnder av gr det att
simulera en avstngd transistor. En andra signal anvnds fr att motsvara
strmmen, detta r en brf_real signal som r av datatyp real med en
resolutionsfunktion som lmpar sig bra fr strmsimulering, det vill sga i en
nod adderas samtliga signaler [20]. Med dessa grundfrutsttningar har en
fungerande modell byggts upp, se appendix II fr VHDL kod.

IMPLEMENTERING I VHDL

-28-
phase_model
a
n
a
l
o
g
_
d
a
n
a
l
o
g
_
s
s
t
d
_
s
a
n
a
l
o
g
_
d
upper_switch
s
t
d
_
d
a
n
a
l
o
g
_
d
gate
s
t
d
_
s
a
n
a
l
o
g
_
s
s
t
d
_
d
gate
s
t
d
_
s
sw1 sw3
sw4
lower_switch
s
t
d
_
s
a
n
a
l
o
g
_
d
gate
s
t
d
_
d
a
n
a
l
o
g
_
s
gate
s
t
d
_
d
a
n
a
l
o
g
_
s
sw6
e_a
p
o
t
_
p
o
s
emk
c
u
r
r
e
n
t
_
p
o
s
c
u
r
r
e
n
t
_
n
e
g
e_b
upper_switch upper_switch
s
t
d
_
d
a
n
a
l
o
g
_
d
gate
s
t
d
_
s
a
n
a
l
o
g
_
s
sw5
c
u
r
r
e
n
t
_
n
e
g
phase_model
lower_switch
sw2
lower_switch
s
t
d
_
s
a
n
a
l
o
g
_
d
gate
s
t
d
_
d
a
n
a
l
o
g
_
s
p
o
t
_
p
o
s
emk
c
u
r
r
e
n
t
_
p
o
s
c
u
r
r
e
n
t
_
n
e
g
p
o
t
_
p
o
s
emk e_c
phase_model
c
u
r
r
e
n
t
_
p
o
s

Figur 17, strukturell motormodell med switchar

3.3.1 Mot-EMK modellering
En BLDC motor genererar idealt stt en mot-EMK som r trapetsformad, se
figur 16. De tv faser som r aktiva vid varje tillflle, drar en positiv respektive
negativ strm och den inaktiva fasen kommer att generera en liten strm skapad
av den rampformade delen av mot-EMK. Vid modellering av motorn kan ngon
av fljande tre modeller av mot-EMK anvndas till de inaktiva faserna.

ideal trapetsformad, det vill sga rampformad vid inaktiv fas, figur 18.
mot-EMK behller samma vrde som vid fregende tillflle, figur 19.
mot-EMK r noll vid inaktiv fas, figur 20.

Frdelen med att anvnda det frsta alternativet r att det bst speglar en verklig
motor, men den blir lite mer komplicerad att implementera om bra resultat
nskas. Vid konstant hastighet finns inga svrigheter eftersom ven tiden fr
varje kommuteringstillflle r konstant. Detta gr att lutningen p rampen ltt
IMPLEMENTERING I VHDL

-29-
kan berknas. Men om rotationshastigheten varierar vid till exempel uppstart
blir det svrare att uppskatta lutningen p ett enkelt stt.

Om tiden mellan kommuteringarna antas kort, kan den inaktiva fasen behlla
samma vrde som vid fregende kommutering [9]. Hr uppstr inga problem
med att approximera rtt lutning. Men strmmen fr den inaktiva fasen blir
missvisande, d den r konstant och skild frn noll.

Den tredje modellen r att anvnda medelvrdet av den rampformade mot-EMK,
det vill sga mot-EMK lika med noll under hela den inaktiva
kommuteringssekvensen. Med denna approximering r strmmen fr den
inaktiva fasen konstant lika med noll.

Den modell som visat sig vara mest anvndbara r den sistnmnda d den ger en
bra bild av strmmarna samtidigt som den r oberoende av rotationshastighet.

I de tre figurerna nedan kan simuleringar med de olika modellerna ses. I figur
18, och figur 19 r strmmarna i de inaktiva faserna konstanta, med skillnad i
DC-offset. Fr den ideala trapetsmodellen i figur 17 finns variationer i de
inaktiva faserna som orsakas av de rampformade vergngarna. Hr har en
konstant hastighet p 700 rad/s anvnts.


Figur 18, simulering med ideal trapetsformad mot-EMK
e_a
i_a
e_b
i_b
e_c
i_c
w_r
IMPLEMENTERING I VHDL

-30-

Figur 19, simulering med konstant mot-EMK i vergngarna

Figur 20, simulering med konstant mot-EMK lika med 0 i vergngarna


e_a
i_a
e_b
i_b
e_c
i_c
w_r
i_a
e_a
i_b
e_b
i_c
i_c
w_r
IMPLEMENTERING I VHDL

-31-

3.4 Simuleringar
Som tidigare nmnts r det ett antal olika faktorer som pverkar prestandan hos
motorstyrningen. Det r upplsningen, PWM-frekvensen, val av switchmnster,
symmetrisk eller asymmetrisk puls och storleken p fasinduktanserna. Dessa
faktorer utom den frstnmnda pverkar momentripplet enligt litteraturstudien.
Fr att kunna underska hur dessa olika faktorer pverkar har ett antal
simuleringar av motorstyrningen tillsammans med motormodellen utfrts.
3.4.1 Pverkan p momentrippel med olika fasinduktans och
PWM-frekvens
Eftersom det r viktigt att minimera momentripplet har simuleringar med olika
fasinduktanser och PWM-frekvenser utfrts fr att p s stt underska om det
finns ngot optimum fr dessa faktorer. Nr induktansen kas blir
momentripplet mindre eftersom strmmen jmnas ut, men motorn kommer att
reagera lngsammare.

Eftersom simuleringsmodellen inte innefattar ngon reglering gr det inte att
mta stegsvar eller stigtider som annars r brukligt. Istllet har lutningen p
vinkelhastigheten mellan olika tider rknats ut, fr att p s stt f ett relativt
mtt p motorns reaktion. P s stt kan momentripplet sttas i samanhanget hur
reaktionen pverkas d momentripplet minskas genom att ka induktansen och
en avvgning mellan dessa faktorer kan gras.

Simuleringarna utfrdes p fljande stt. Insignalen hlls konstant under 15 ms
varefter den snktes fr att efter 45 ms sttas till 0, se figur 22 fr
simuleringsresultat. Eftersom motorn approximativt har linjr kning av
vinkelhastigheten som funktion av tiden vid uppstart, valdes ngra tidpunkter ut
fr att berkna lutning fr olika fasinduktans. De slutsatser som kan dras av
simuleringarna r att med en kning i PWM-frekvens kan motsvarande
minskning i fasinduktans anvndas fr bibehllet momentrippel. Frdubbling av
induktans motsvarar frdubbling av PWM-frekvens. Men eftersom en strre
induktans ger lngsammare reaktion s r en hgre frekvens att fredra framfr
kad induktans i detta avseende. Momentripplet mttes vid lg vinkelhastighet
d momentet r som strst. Eftersom endast ett ftal tester har utfrts kan endast
tendenser utlsas, vilket enligt sammanstllningsdiagrammen i figur 20 och figur
21 skulle ge en induktans i storleksordningen 0,1mH fr 50 kHz PWM-frekvens
och 0.5-1 mH vid 5 kHz fr optimalt momentrippel och snabbhet. Delta Te eller
momentripplet i figur 20 och 21 kan ses som ett relativt mtt mellan de olika
simuleringarna. Lutningen anger helt enkelt accelerationen/retardationen inom
ett visst tidsintervall.
IMPLEMENTERING I VHDL

-32-
50kHz
-10,00
-5,00
0,00
5,00
10,00
15,00
20,00
0.01 0.1 0.25 0.5
L [mH]
l
u
t
n
i
n
g
0,00
0,05
0,10
0,15
0,20
0,25
0,30
m
o
m
e
n
t
r
i
p
p
e
l
lutning [1.5: 8] ms lutning [0:1.5] ms lutning [15:20] ms delta Te

Figur 21, sammanstllning av simulering med PWM-frekvens 50kHz
5kHz
-10,00
-5,00
0,00
5,00
10,00
15,00
20,00
0.1 0.5 1 1.5 2.5
L [mH]
l
u
t
n
i
n
g
0
0,05
0,1
0,15
0,2
0,25
0,3
m
o
m
e
n
t
r
i
p
p
e
l
5k lutning [1.5: 8] ms 5k lutning [0:1.5] ms 5k lutning [15:20] ms 5k delta Te

Figur 22, sammanstllning av simulering med PWM-frekvens 5 kHz
IMPLEMENTERING I VHDL

-33-

Figur 23, 5 kHz PWM-frekvens, induktans uppifrn och ner 1 mH, 0,1 mH,
0,5 mH, 1,5 mH, 2,5 mH.

3.4.2 Simulering med asymmetrisk och symmetrisk
pulsgenerering
Enligt litteraturstudien ska symmetrisk pulsgenerering vara att fredra framfr
asymmetrisk pulsgenerering ur distorsionssynpunkt vid switchningen, men inga
mrkbara skillnader har noterats vid simulering. Detta beror frmodligen p att
ideala transistormodeller anvnts, som inte ger upphov till ngon distorsion i
strmmarna.
3.4.3 Problem vid simulering med motormodellen
Ett antal olika varianter av motormodellen har gjorts, den frsta och enklaste
simulerade endast en rrelse av rotorn s att kommuteringssignaler genererades
automatiskt vid simuleringar. Nr sedan modellen gjordes om fr att beskriva
strmmar, moment och vinkelhastighet uppkom problemet med att f modellen
att uppfra sig som en elektrisk krets dr Kirchhoffs lag ska vara uppfylld och
ge i
a
+i
b
+i
c
=0 i noden dr faserna kopplas samman. Detta lstes till en brjan
genom att styra signalerna vid varje kommuteringssekvens s att detta samband
uppfylldes. Detta blev ondigt stelt och oflexibelt s den befintliga modellen
utarbetades istllet, dr beteendet r mer realistiskt.

IMPLEMENTERING I VHDL

-34-
Problem med instabilitet har uppkommit d flera signaler kopplats till samma
nod och den tidigare nmnda resolutionsfunktionen anvnts i samband med
berkning av de olika differensekvationerna. Detta undviks genom att anvnda
temporra signaler.

Att med konstant hastighet rotera med negativ eller positiv rotation i modellen r
inga problem, men att g frn till exempel positiv rotation till negativ r svrare,
vilket stllt till problem, och fungerar inte till fullo. Men det har varit lrorikt att
gra en analog modell i VHDL.
3.5 Systemuppbyggnad fr SVM simuleringsmodell
Den modell som utarbetats fr implementering fr SVM-systemet bestr av ett
antal ROM dr multiplikander och utsignaler lagras. Fr att erhlla multiplikand
fr ta och tb adresseras tv ROM utifrn vinkeln mellan Vref och nrmaste
basvektor, se figur 10. Eftersom vinkelintervallet r 0<
1,2,6
<60 behvs
endast frutrknade multiplikander fr detta intervall. D 11 bitars upplsning
visat sig vara lmplig upplsning efter syntesresultat med blockkommuteringen,
se kapitel 4.1.3, antas denna pulsupplsning mjlig ven fr SVM. D
multiplikation mellan |Vref| och lagrade multiplikander ska ge
pulsbreddsreferensen valdes 6 bitars upplsning fr multiplikand och 5 bitar fr
|Vref|, vilket ger en 11 bitars produkt. I de tv ROMen kommer sledes 2
6

vrden lagras, vilket ger en vinkelnoggrannhet p 0,9375. Nr ta och tb erhllits
som 11 bitsvektor kan t0 berknas enligt ekvation 6, och ta, tb och t0 skiftas ett
steg t hger fr att erhlla ta/2, tb/2 och t0/2. Vid skiftning av t0/2 erhlls t0/4.
De utrknade vrdena lagras i ett RAM som fungerar som ett skiftregister dr
referensvrden skiftas till en rknare i SWM_controller fr pulsgenerering.
SWM_controller adresserar utgngsROMet som innehller de 7
switchkombinationer fr respektive 60 sektor, enligt figur 24.

Figur 24, referensvektorer i olika sektorer
Vref
100
011

Vref
110 010
001
101
111
000

5

IMPLEMENTERING I VHDL

-35-
3.6 Blockdiagram -SVM

Figur 25, simuleringsmodell fr SVM

Hr fljer en frklaring av konstruktionen, se figur 25 fr att flja
beskrivningen. Resolversignalen p 16-bitar konverteras till en 6 bitars adress i
rom_adr som anvnds fr att adressera i ROM_1 och ROM_2. I de tv mult
instanserna U8 och U9 multipliceras utsignalerna frn ROM_1 och ROM_2 med
signalen Vref_abs s att ta och tb erhlls. I sub_and_shift berknas t0 och
skiftning av ta, tb och t0 sker enligt ovan. De skiftade 11 bitars tiderna lagras i
RAM_11bit och skiftas ut ett i taget till SVM_controller. I SVM_controller
laddas en rknare med innehllet i den fr tillfllet adresserade minnesplatsen.
ROM_6bit adresserar en minnesplats under den aktuella tiden som motsvarar det
rknarvrde som fr tillfllet r aktivt. ROM_6bit bestr av 6 stycken ROM, ett
fr varje 60 graders intervall. Dessa 6 ROM innehller 7 minnesceller med 6
bitar i varje, en minnescell fr varje utsignalsekvens enligt figur 23. 3 bitars
signalen rom_select bestmmer vilket av de 6 ROMen som ska anvndas fr
tillfllet. Nedan fljer beskrivningar p respektive block. VHDL kod fr
RAM_11bit, SVM_controller och ROM_6bit finns att studera i appendix II fr
djupare frstelse av modellen.
3.6.1 Rom_adr
16 bitars resolver signal anpassas till 6 bitar. Utgngen anvnds fr att adressera
minnesceller i ROM_1 och ROM_2.
3.6.2 ROM_1 och ROM_2
ROM_1 innehller frutberknade vrden p ta och ROM_2 innehller vrden
fr tb.
ta_div2
tb_div2
t0_div2
t0_div4
sub_and_shift
SVM_controller
adr_pointer
rom_select
strobe_ram
in_abs
out_data
out_data
ROM_I
U5
adr
adr
reset
clk
res_sig
act_dir
adr_pointer
Vref_abs
ta
tb
mult
U8
in_angle
in_abs
out_time
in_angle out_time
U4
ROM_2
U6
rom_adr
U7 mult
U9
U1
clk
reset
counter_value
clk
strobe
sw_out
data_0
data_1
data_2
data_3
data_4
data_5
data_6
RAM_11bit
U2
out_data
ROM_6bit
U3
out_data
adr
rom_select
adr
IMPLEMENTERING I VHDL

-36-
3.6.3 mult
Multiplicering av absolutbeloppet fr Vref och ta respektive tb. Produkten
anvnds som tidsreferens, anges i antal globala klockpulser.
3.6.4 sub_and_shift
Hr berknas t0. Skiftning av ta, tb och t0 sker hr.
3.6.5 RAM_11bit
Ett RAM-minne bestende av 7 stycken 11 bitars minnesceller. Den skiftade
datan frn sub_and_shift lagras varje gng strobe-signalen gr hg. RAM-
minnet adresseras s att respektive tider frn sub_and_shift lggs p utgngen i
kronologisk ordning enligt figur 11.
3.6.6 SVM_controller
Styr adresspekaren till ROM_6bit med hjlp av rknare som laddas med data
frn RAM_11bit. Nr en rkneomgng r frdig gr signalen strobe_ram hg
som triggar RAM_11bit att byta adress.
3.6.7 ROM_6bit
Hr lagras utsignalsekvenser fr alla 6 sektorer, se figur 24. 6 bitars utgngen
styr drivkretsen enligt sekvens i figur 11.

SYNTETISERING OCH TEST

-37-
4 Syntetisering
och test
Hr redogrs arbetet med syntetisering mot en
specifik krets samt testningen av
blockkommuteringskonstruktionen med motor
och drivkrets
SYNTETISERING OCH TEST

-38-

4.1 Syntetisering av blockkommuteringskonstruktionen
4.1.1 Val av FPGA
Fr att uppfylla kraven p 12 bitars upplsning och 50 kHz PWM-frekvens
krvs en FPGA som klarar av en klockfrekvens runt 200 MHz. Efter en
marknadsunderskning efter lmpliga FPGA:er drogs slutsatsen att en
SPARTAN-II frn XILINX har ovanstende prestanda enligt specifikation. Ett
lmpligt labkort med en frmonterad SPARTAN-II hittades hos MEMEC
Insight som passar bra till denna uppgift.
4.1.2 Arbetsgng vid syntetisering
Till syntetisering anvnds endast PWM-genereringen, motormodellen r bara till
fr simulering. En strukturell arkitektur skapas dr samtliga ingende
komponenter instantieras, med ingngar fr den globala klockan, data, reset
signal, kommuteringssignaler och styrutgngar. Det r dessa som sedan ska
mappas till pinnar p FPGA:n vid place and route. Fr att f en grov uppfattning
av vad som behver ndras infr syntetiseringen, gjordes en frsta syntetisering.
De mest uppenbara felen ndrades, ssom att ge en signal ett defaultvrde vid
deklarering och att lgga till alla signaler i sensitivitetslistan. Dessa r i och fr
sig inga direkta fel utan de ger bara varningar i syntesverktyget. Fr att kunna se
om den syntetiserade kretsen fungerar p samma stt som simuleringsmodellen
anvndes motormodellen tillsammans med den VHDL-kod som genereras av
syntetiseringen till simulering. Den syntetiserade VHDL-koden anvnder sig
endast av frdefinierade simuleringskomponenter frn XILINX med
tidsinformation, vilket gr att simuleringen blir mer realistisk med avseende p
tidsfrdrjningar i kretsen.
4.1.3 Syntetisering mot tidskrav
De strsta ndringarna jmfrt med simuleringsmodellen har franletts av
tidskrav, eller krav p 200 MHz klockfrekvens. Syntetisering av i princip
ofrndrad simuleringskod gav en maximal klockfrekvens p cirka 80 MHz
enligt syntesverktyget Leonardo. Vid hgre frekvenser kommer fel uppst p
grund av att data inte anlnder vid rtt tidpunkt. Detta problem analyserades fr
att se var flaskhalsen fanns. Syntesverktyget anger att det negativa tidsslacket
hrrr frn cmp_vector, det vill sga den vektor som anvnds fr upprkning vid
generering av korrekt pulsbredd. Denna del av kretsen analyserades drfr fr
att underska vad som gr att gra fr att kunna klocka den snabbare. P grund
av att symmetriska pulser r nskvrt och att en tillstndsmaskin anvnds r
pulsbreddsgenereringen i simuleringsmodellen ganska invecklad. I en ideal
simuleringsmilj r detta inget problem, men nr frdrjningar vgs in mste
frenklingar gras. Fr att studera skillnaderna mellan simuleringsmodellen och
SYNTETISERING OCH TEST

-39-
den syntetiserade koden se time_calc_a i appendix II och III. Till att brja med
frenklades pulsbreddsgenereringen fr att se vad som begrnsar. En vektor som
inkrementeras med 1 vid en klockflank syntetiseras som en rknare, en 12
bitarsvektor blir sledes en 12 bitars rknare. Den maximala frekvens som en 12
bits rknare i en SPARTAN II krets klarar r enligt syntetiseringsresultat runt
180 MHz fr speed grade 6 och 159 MHz fr speed grade 5. Detta gr att
hgre klockfrekvens r omjlig vid anvndandet av en sdan krets eftersom
pulsgenereringen bygger p en rknare. P labkortet frn Memec, som tidigare
nmnts sitter en SPARTAN II med speed grade 5, vilket gr att den maximala
frekvensen i detta fall r 159 MHz.

Nr den maximala frekvensen r knd kan sledes den ursprungliga funktionen
fr pulsbreddgenereringen frska att uppns med ml att n den maximala
frekvensen fr kretsen. Slutsatsen kan dras att en s enkel lsning som mjligt r
att fredra om den maximala grnsen ska uppns. Asymmetrisk pulsgenerering
r enklast och krver i princip endast en rknare och en jmfrelse mellan
insignalen och rknarvrdet. Om en 12 bitars rknare anvnds krvs ingen
nollstllning under en PWM-period utan den kan rkna runt. Om nollstllning
innan 4095 uppntts krvs, behvs en extra grind vilket pverkar resultatet
negativt d grinden ger en extra niv logik. Jmfrelsen mellan insignal och
rknarvrdet r dremot ndvndig fr funktionen s det gr inte att undvika en
liten avvikelse frn den maximala frekvensen. 156 MHz har uppntts med den
kompletta konstruktionen.
4.1.4 Pipelining av kombinatoriskt nt
Eftersom simuleringarna har utfrts med ideala transistormodeller utan stig-
eller falltider behvs vissa skyddsmekanismer fr att frhindra kortslutning i
ngot ben av transistorbryggan. Kortslutning intrffar om bde den vre och
undre transistorn r p samtidigt. Infr kommande test med motor och
transistorbrygga behvs drfr logik med mjlighet att stnga av utsignalerna
enligt fljande:
Om global reset intrffar
Ogiltig kommuteringssignal ges
Mjlighet att skapa dead-band delay mellan kommuteringssekvenser om det
anses ndvndigt, se kapitel 2.5.2 fr nrmare beskrivning.
Detta ger upphov till ett kombinatoriskt nt med 3 niver, som ger upphov till
icke nskvrda frdrjningar i kretsen. Dessa frdrjningar gr att den
maximala klockfrekvensen som r mjlig sjunker ytterligare. Fr att erhlla
bttre prestanda infrs pipelining i detta nt, det vill sga en D-vippa infrs
mellan varje niv. Detta ger d en latency p 3 klockperioder vid kommutering
eller anvndande av ngon av ovanstende styrsignaler.
SYNTETISERING OCH TEST

-40-
4.1.5 Place and route
Vid place and route rknas ven frdrjningarna orsakade av ledarna in i
tidsanalysen, detta gr att den slutliga maximala frekvens som konstruktionen
klarar r 125 MHz enligt XILINX place and route verktyg Design manager.
Detta gr att 12 bitars upplsning och 50 kHz PWM-frekvens inte kommer att
uppns. Istllet fr avkall p upplsningen gras. 11 bitars upplsning fr
godtagas fr test med labkortet frn Memec.
4.2 Test av syntetiserad krets
Till test av konstruktionen anvnds det tidigare nmnda labkortet med en
SPARTAN II FPGA tillsammans med en motordrivkrets (L6234 ST-
microelectronics). Drivkretsen styrs med 6 insignaler, 3 enablesignaler och 3
styrsignaler. En nolla som insignal ppnar den undre transistorn i respektive ben
och en etta som insignal ppnar den vre transistorn. De 3 enablesignalerna
aktiverar respektive ben genom att hllas hga. Detta stt att styra transistorerna
skiljer sig frn vad tidigare tnkt, men krver endast sm frndringar i
konstruktionen.

Motorn som anvnts vid testning r en liten 24 volts motor frn Minimotor SA,
vilken har deltaformad statorkonfiguration och 3 hallsensorer fr kommutering.

Utgngspunkten vid testning av konstruktionen r att verifiera simuleringar och
testa olika moder och PWM-frekvenser fr att slutligen kunna dra lmpliga
slutsatser utifrn detta.

Olika PWM-frekvens och PWM-moder har testats och pverkan med olika
fasinduktans. Se tabell 2 fr testprotokoll. Motorn har testats med tv olika
fasinduktanser, dels enbart med den interna induktansen fr varje fas dels med
en extra extern induktans p 100 H. Tre av de fem moderna , h_pwm_l_on,
h_on_l_pwm och h_pwm_l_pwm har testats, d det tv resterande endast r
kombinationer av h_pwm_l_on och h_on_l_pwm.

Tabell 2
frsk

figur
nr.
extern induktans
[H]
PWM-mode f
PWM
[kHz]
1 figur 27 100 h_pwm_l_on 58
2 figur 28 0 h_pwm_l_on 58
3 figur 29 100 h_pwm_l_pwm 58
4 figur 30 0 h_pwm_l_pwm 58
5 figur 31 100 h_pwm_l_on 29
6 figur 32 0 h_pwm_l_on 29
SYNTETISERING OCH TEST

-41-
7 figur 33 100 h_pwm_l_pwm 29
8 figur 34 0 h_pwm_l_pwm 29
9 figur 35 100 h_on_l_pwm 58
10 figur 36 0 h_on_l_pwm 58
11 figur 37 100 h_on_l_pwm 58
12 figur 38 0 h_on_l_pwm 58
13 figur 39 100 h_on_l_pwm 29
14 figur 40 0 h_on_l_pwm 29

En av de tre fasstrmmarna har registrerats med hjlp av en strmprob och
oscilloskop. Figurerna visar ven de tre hallsignalerna fr att se hur strmmarna
pverkas vid kommuteringstillfllena.
4.3 Analys av tester
4.3.1 Fasstrmmarnas rippel
Enligt litteraturdelen ska PWM-moden h_pwm_l_on eller h_on_l_pwm, det vill
sga den undre eller den vre transistorn leder konstant under en PWM-period,
vara att fredra. Enligt mtningarna finns en viss skillnad i strmrippel mellan
de bgge moderna dr h_pwm_l_on uppvisar lgre variationer under de aktiva
perioderna. Dremot verkar h_pwm_l_pwm vara mindre knslig fr strningar
under de inaktiva perioderna fr respektive fas, se figur 26 fr beskrivning av de
olika perioderna. Strningarna orsakas av BEMF och ser olika ut beroende p
hur transistorerna i drivsteget kontrolleras.

Den strm som bildas av mot-EMK och ger de strningar som kan ses d en fas
r inaktiv antas inte pverka i detta fall, se kapitel PWM-generering. Att notera
r dock att fr h_pwm_l_pwm r den strmmen betydligt mindre n fr de andra
moderna. Det som skiljer mellan h_pwm_l_on och h_on_l_pwm i det avseendet
r var dessa strningar uppkommer, se figurer nedan.

Om strmmarna i de aktiva faserna studeras kan viss skillnad kan ses mellan de
tre moderna, dr h_pwm_l_on och h_on_l_pwm uppvisar en aning mindre
strmvariationer jmfrt med h_pwm_l_pwm. Den slutsats som kan dras hr r
att en mode med antingen den vre eller den undre transistorn konstant p, br
anvndas. Om antagandet som gjordes ovan att BEMF strningarna i den
inaktiva fasen inte pverkar, kan antingen h_pwm_l_on eller h_on_l_pwm
anvndas med samma resultat, se figurer nedan.

Enligt teori och simuleringar blir strmvariationerna mindre d hgre PWM-
frekvens anvnds. Det samma gller d hgre fasinduktans anvnds. Sklet till
att just 100 uH anvnts r av den enkla anledningen att spolar med den
induktansen fanns tillgngliga i labbet. Vid simuleringar gjordes tester av hur
SYNTETISERING OCH TEST

-42-
responsen ndrades med olika induktanser. P grund av svrigheter att mta
responsen med en fysisk motor har sdana tester inte gjorts hr.

inaktiv period aktiv period
strning orsakad
av BEMF

Figur 26, beskrivning av olika perioder fr en fasstrm

Figur 27,h_pwm_l_on, extern induktans,
PWM frekvens 58 kHz
Figur 28, h_pwm_l_on, ingen extern
induktans, PWM-frekvens 58 kHz
SYNTETISERING OCH TEST

-43-
Figur 29, h_pwm_l_pwm, extern
induktans, PWM-frekvens 58 kHz
Figur 30, h_pwm_l_pwm, ingen extern
induktans, PWM-frekvens 58 kHz
Figur 31, h_pwm_l_on, extern
induktans, PWM-frekvens 29,4 kHz
Figur 32, h_pwm_l_on, ingen extern
induktans, PWM- frekvens 29,4 kHz

Figur 33, h_pwm_l_pwm, extern
induktans, PWM-frekvens 29,4 kHz
Figur 34, h_pwm_l_pwm, ingen extern
induktans, PWM-frekvens 29,4 kHz
SYNTETISERING OCH TEST

-44-
Figur 35, h_on_l_pwm, extern
induktans, PWM-frekvens 58 kHz
Figur 36, h_on_l_pwm, ingen extern
induktans, PWM-frekvens 58 kHz
4.3.2 Fasstrmmarnas frekvensspektrum
Att underska fasstrmmarnas frekvensspektrum kan vara intressant fr att se
hur PWM-frekvensen och fasinduktanserna pverkar grundfrekvensen och
bildandet av vertoner. Frekvensspektrumet studerades med hjlp av FFT
funktion p oscilloskop. Om den externa induktansen anvnds kan man se att
frsta och andra vertonen undertrycks bra. Det som r intressant hr r att
vertonerna r mer framtrdande d den lgre PWM-frekvensen anvnds. Vid
58 kHz PWM-frekvens gr det knappt att urskilja topparna ven d den extra
induktansen p 100H inte anvnds. Vid 58 kHz PWM-frekvens kan bredare
spridning kring grundfrekvensen urskiljas. Det kan bero p att drivkretsen inte r
anpassad fr hgre frekvens n 50 kHz, vilket resulterar i distorsion d hgre
frekvens anvnds.

Figur 37, PWM-frekvens 58 kHz, extern
induktans
Figur 38, PWM-frekvens 58 kHz, ingen
extern induktans
SYNTETISERING OCH TEST

-45-
Figur 39, PWM-frekvens 29 kHz, extern
induktans
Figur 40, PWM-frekvens 29 kHz, ingen
extern induktans

De slutsatser som kan dras efter det fysiska testet r att teorin och
konstruktionen verkligen fungerar som vntat. Bst resultat med jmnast
moment erhlls om PWM-frekvensen r 50 kHz och en extra induktans anvnds.
4.3.3 Problem
Under uppkoppling och test av FPGA, drivkrets och motor har en del problem
uppsttt som hr redovisas kortfattat.

Den klockkrets som fanns p labkortet har en grundinstllning p halva
oscillatorfrekvensen, det vill sga 30 MHz. Det finns mjlighet att programmera
om kretsen genom att ndra i ett register med hjlp av ett 1-wire protokoll, det
vill sga en gemensam ledning fr skrivning och lsning. Ett antal frsk
gjordes fr att ndra denna grundinstllning fr att erhlla 60 MHz klocka
istllet, men utan framgng. Detta pverkar egentligen inte testningen nmnvrt
d upplsningen inte r av strre vikt vid de genomfrda testerna. Vid en PWM-
frekvens p 58 kHz blir upplsningen 9 bitar och fr 29 kHz PWM-frekvens blir
upplsningen 10-bitar. Det finns mjlighet att byta ut klockkretsen fr att erhlla
en 100 MHz klocka och p s stt f 11 bitars upplsning och 50 kHz PWM-
frekvens, men skillnaden skulle endast vara marginell i detta fall, varfr 30 MHz
klockan anvndes.

FPGA:n och minnet frstrdes vid ett tillflle d en mtprob kortslt en ingng
och en utgng p drivsteget. Denna kortslutning ledde till att
motordrivstrmmen gick rakt in i FPGA:n. Nya kretsar fick bestllas vilket
ledde till oplanerad vntetid p ngra veckor. Isolering mellan ingngarna och
utgngarna sattes dit fr att undvika fler missden.

SYNTETISERING OCH TEST

-46-
Problem med strningar har uppsttt vid tv tillfllen. Vid det frsta tillfllet
saknades gemensam jord mellan de tv korten som utgjorde uppkopplingen,
vilket gjorde att motorn betedde sig konstigt. Det andra strningsproblemet som
orsakat mest besvr var att ibland kom tillstndsmaskinen in i fel tillstnd vid
kommutering. Till att brja med infrdes ett antal d-vippor fr att filtrera
hallsignalerna. Detta gjorde att felen blev mindre frekventa men de uppkom
emellant nd. Efter en del sm ndringar i VHDL-koden blev slutligen
resultatet bra, med en jmn och felfri motorgng. En del av problemen kan
frmodligen hrledas till uppkopplingen som inte r helt perfekt ur
strningssynpunkt.

4.4 Syntetisering av SVM-konstruktionen
D simuleringsmodellen r skriven fr att kunna syntetiseras krvs inga strre
frndringar av koden. Fr att hitta en krets som motsvarar de tidskrav som
krvs syntetiserades konstruktionen fr ett antal olika FPGA:er. Med en
XILINX Virtex-E uppfylls kraven, det vill sga 100 MHz klockfrekvens. En
liten modifiering krvs dock, en pipeline med en d-vippa mste infras p
vardera ingngen p sub_and_shift. Denna pipeline klockas med strobe_ram
signalen frn SVM_controller. Strobe_ram gr hg nr en PWM-period r slut,
det vill sga med 50 kHz frekvens. Det innebr att nya vinkel- och
absolutvrden kan lsas in med 20 s intervall. Med hjlp av detta kan en
maximal teoretiskt motorhastighet berknas fr optimal gng, det vill sga d
vinkelupplsningen p 0,9375 grader utnyttjas till fullo. D vinkelupplsningen
r knd ger detta en hgsta hastighet p cirka 7800 varv/min fr en
tvpolsmotor.
RESULTAT OCH SLUTSATSER

-47-
5 Resultat och
slutsatser
RESULTAT OCH SLUTSATSER

-48-
En slutsats som kan dras avseende blockkommutering r att det r enkelt att
implementera PWM-generering i en FPGA. Begrnsningen ligger i
klockfrekvensen d den avgr upplsningen p de genererade pulserna.

En frga som kvarstr angende upplsningen r hur mycket frsmrad
upplsning frn 16 bitar till 11 bitar pverkar prestandan i ett reglerat system.
Kan 11 bitar vara tillrcklig upplsning, eller behvs snabbare klockad FPGA?

PWM frekvensen br vara 50 kHz och en extra induktans br anslutas till
motorns faser fr att undertrycka vertonerna i strmmarna och minska
momentripplet.

Betrffande SVM-systemet kan slutsatsen dras att det r mjligt att
implementera i en FPGA, men frgan r om prestandan frbttras s pass
mycket att det r motiverat med SVM-styrning. Ett sdant system skulle inte
passa bra d mot-EMK r trapetsformad. Det vill sga
blockkommuteringssystemet fungerar frmodligen bra fr bde sinusformad och
trapetsformad mot-EMK, men SVM-systemet dremot fungerar bara bra fr
sinusformad mot-EMK.






KLLHNVISNINGAR

-49-
6 Kllhnvisningar
KLLHNVISNINGAR

-50-

[1] Gieras, Jacek F, Mitchell Wing, Permanent magnet motor technology,
Marcel Dekker Inc 2002,
ISBN 0-8247-0739-7

[2] Keljik, Jeff, Electric motors and motor controls, Delmar Publishers 1995,
ISBN 0-8273-6174-2

[3] Valentine, Richard, Motor control electronics handbook Mcgraw-Hill
1998, ISBN 0-07-066810-8

[4] Tonelli Mauricio, Battaiotto Pedro and Valla Maria I, FPGA
implementation of an universial space vector modulator, IECON01 27th
annual conf pp 1172-1177

[5] Texas Instruments application noteDigital signal processing solution for
permanent magnet synchronous motor, USA, 1996

[6] Wang, Fei, Sine-triangle versus Space-vector modulation for three-level
PWM voltage-source inverters, IEEE trans on ind app, vol 38, no 2, mar/apr
2002

[7] Kenjo, Tak, Electric motors and their control Oxford University Press
1991, ISBN 0-19-856235-7

[8] Kim Tae-Sung, Ahn, Sung-Chan, Hyun Dong-Seok, A new current
algoritm for torque ripple reduction of BLDC motors, IECON01, annual conf
of IEEE ind electron society, pp 1521-1526

[9] Xiangjun Zhang, Boshi Chen, The different influences of four PWM modes
on the commutation torque ripples in sensorless brushless DC motors control
systems, Shangai university, Shanghai 200072, China

[10] kravspecifikation plattformselektronik, PLFE, SAAB dynamics AB

[11] Panahi Issa, Yu Zhenyu, Arefeen Mohammed, Generate advanced PWM
signals using DSP, electronic design may 1, 1998

[12] Crouch Ryan, Lucas Bill, Berringer Ken, Sensorless brushless DC motor
control: made easy with motorolass 68HC908MR,
www.motorcontrol.com/articles/motslbldc.htm, access 020920

KLLHNVISNINGAR

-51-
[13] Fairchild semiconductor The smart start technique for BLDC motors,
application brief 42020, sep 1996

[14] Flint Tom, High efficiency, low cost, sensorless motor
control,International appliance manufacturing 2001, Analog devices, Inc.

[15] Pillay Pragasen, Krishnan Ramu, Application characteristics of permanent
magnet synchronous and brushless dc motors for servo drives, IEEE
transaction on industry applications, vol. 27, no. 5, sep/oct 1991

[16] Miller T.J.E, Brushless permanent-magnet and reluctance motor drives
Oxford university press, 1989, ISBN 0-19-859369-4

[17] Xiangjun Zhang, Boshi Chen, Influences of PWM mode on the current
generated by BEMF of switch-off phase in control system of BLDC motor
shanghai university, shanghai 200072, China

[18] Pillay Pragasen, Ramu Krishnan, Modeling, simulation and analysis of
permanent-magnet motor drives, part II: The brushless DC motor drive, IEEE
transaction on industry applications, vol 25, no.2, march/april 1989

[19] Texas Instruments application note, DSP solutions for BLDC motors,
litterature number BPRA055, March 1997

[20] Harr Randolph E, Stanculescu Alec G, Applications of VHDL to circuit
design, Kluwer Academic Publishers 1991, ISBN 0-7923-9153-5

[21] Arefeen S Mohammed, Figoli David, Yu Zhenyu, Multiple motor control
using a single DSP, Texas Instruments Inc, 2000

[22] Sanitlua Pichet, Sangchai Worranart, Wiangtong Theerayod, Petchatyporn
Panom, FPGA-based IC design for 3-phase PWM inverter with optimized
space vector modulation schemes, Mahanakorn University of technology,
Bangkok Thailand.

[23] Texas Instruments application note Field oriented control of 3-phase AC-
motors, Literature number BPRA073, Feb 1998

[24] Deng Dan, Chen Su, Jos Gza, FPGA implementetion of PWM pattern
generations, IEEExplore
KLLHNVISNINGAR

-52-


APPENDIX

-53-
7 Appendix
Som appendix terfinns en frkortningslista och
den utarbetade VHDL-koden.
APPENDIX

-54-
7.1 Appendix I - Frkortningslista

BLDC Borstls DC (motor)
PWM Pulse width modulation, puls bredds modulering
EMK elektromotorisk kraft (spnning)
BEMF back electromotoric force
MCM multi chip modul
SVM space vector modulation
PMSM permanentmagnet synkron motor
FWD free wheeling diodes
ROM read only memory
FFT fast fourier transform
APPENDIX

-55-

7.2 Appendix II - VHDL-kod simuleringsmodeller

Fljande listor r samtliga VHDL-filer skapade fr detta examensarbete. De filer
markerade med asterix r bifogade i detta appendix och kan vara intressanta att
studera nrmare i samband med lsning av kapitel 3.
comm_states_a.vhd
comm_state_e.vhd
*time_calc_a.vhd
time_calc_e.vhd
clk_divider_a.vhd
clk_divider_e.vhd
in_buffer_a.vhd
in_buffer_e.vhd
*upper_switch
*lower_switch
*phase_model
*motor_bridge
testbench_motor_bridge_all.vhd toppblock
*motor_functions.pkg
*phase_model.vhd

Filerna fr SVM modellen.

*svm_controller.vhd
ROM_1.vhd
ROM_2.vhd
*ROM_6bit.vhd
*RAM_11bit.vhd
rom_adr.vhd
testbench_svm_generator.vhd toppblock

--=============================================================================
-- Project :Examensarbete
-- Filename :time_calc_a.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- calculates the duration for the output PWM-pulse t1. The input vector in_calc -- determines
the duration. The width is proportional to in_calc. Symmetric or
-- asymmetric pulse can be generated, change with generic mode set to either 0 --- (sym) or 1
(asym).
--
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
APPENDIX

-56-
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

architecture behave of time_calc is
type pwm_states is (pulse_high, pulse_low, sample, idle);
type PWM_modes is (asym, sym);
signal state : pwm_states;
signal cmp_vector : std_logic_vector(n downto 0):=(others=>'0');
signal trunk_in : std_logic_vector(n-res downto 0); --truncated in_calc
signal PWM_per_sig : std_logic_vector(n-1 downto 0):="0001000000000000";
signal r_shift_PWM_per : std_logic_vector(n-1 downto 0); --right shifted
--PWM_per_sig
signal r_shift_trunk_in : std_logic_vector(n-res downto 0); --right
--shifted trunk_in
signal PWM_mode : PWM_modes:=sym;
signal init : std_logic:='0';

begin
trunk_in(n-res)<='0'; --never to be negative
r_shift_PWM_per<=shr(PWM_per_sig,"1");
r_shift_trunk_in<=shr(trunk_in,"1");
--------------------------------------------------------------
--process that generates pulses using states
--------------------------------------------------------------
t1_generation:
process(clk)
begin
if mode=1 then
PWM_mode<=asym;
else
PWM_mode<=sym;
end if;
case PWM_mode is
when asym => --asymmetric
if falling_edge(clk) and trunk_in(1)/='U' then
case state is
when sample=>
if cmp_vector<trunk_in then
state<=pulse_high;
else
state<=pulse_low;
end if;
when pulse_low=>
if cmp_vector>=PWM_per_sig-1 then
state<=sample;
else
state<=pulse_low;
end if;
when pulse_high=>
if cmp_vector>=trunk_in then
state<=pulse_low;
elsif cmp_vector>=PWM_per_sig-1 then
state<=sample;
else
state<=pulse_high;
end if;
when idle=>
state<=sample;
end case;
elsif falling_edge(clk) and trunk_in(1)='U' then --can occur in
--beginning of simulation
state<=idle;
end if;

when sym => --symmetric
if falling_edge(clk) and trunk_in(1)/='U' then

case state is
when sample=>
if cmp_vector<r_shift_PWM_per - r_shift_trunk_in then
state<=pulse_low;
else
state<=pulse_high;
end if;
when pulse_low=>
if cmp_vector>=PWM_per_sig-1 then
APPENDIX

-57-
state<=sample;
elsif cmp_vector>(r_shift_PWM_per - r_shift_trunk_in-1)
and cmp_vector<(r_shift_PWM_per + r_shift_trunk_in) then
state<=pulse_high;
elsif cmp_vector<(r_shift_PWM_per - r_shift_trunk_in) then
state<=pulse_low;
end if;
when pulse_high=>
if cmp_vector>=PWM_per_sig-1 then
state<=sample;
elsif cmp_vector>(r_shift_PWM_per - r_shift_trunk_in) and
cmp_vector<(r_shift_PWM_per + r_shift_trunk_in) then
state<=pulse_high;
elsif cmp_vector>=(r_shift_PWM_per + r_shift_trunk_in) then
state<=pulse_low;
end if;
when idle=>
state<=sample;
end case;
elsif falling_edge(clk) and trunk_in(1)='U' then --can occur in --beginning
of simulation
state<=idle;
end if;
end case;


end process;
--------------------------------------------------------------
--state activation
--------------------------------------------------------------
output:
process(state,clk)
begin
if rising_edge(clk) then
case state is
when idle=>
trunk_in(n-res-1 downto 0)<=(others=>'0');


when sample=>
cmp_vector<=(others=>'0');
trunk_in(n-res-1 downto 0)<=in_calc(n-2 downto res-1);
--depending on resolution, insignal must be truncated
dir<=in_calc(n-1);
when pulse_low=>
t1<='0';
cmp_vector<=cmp_vector+1;
when pulse_high=>
t1<='1';
cmp_vector<=cmp_vector+1;
end case;
end if;
end process;
end;


--=============================================================================
-- Project :Examensarbete
-- Filename :time_calc_e.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- entity for use with the architecture in time_calc_a.vhd
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned;
use ieee.std_logic_arith.all;

entity time_calc is
generic (n : Integer:= 16;
res : integer:=4; --determines resolution, n-res bits, default
--4=12bits for simulation
mode : integer:=0); --1 for asymetric, 0 for symetric pulses
APPENDIX

-58-
port (in_calc : in Std_Logic_vector(n-1 downto 0);
clk : in Std_logic;
t1 : out Std_logic;
dir : out Std_logic);
end time_calc;



--=============================================================================
-- Project :Examensarbete
-- Filename :upper_switch.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- works as a simulation model for a switch placed in the upper part of a leg
-- in a 6-switch transistor bridge
-- analog signals represents current, and std_logic signals represents
-- potential.
-- package summing_bus_res_function contains functions to able current
-- summations and analog_data_structure contains data types for analog
-- signals
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use work.analog_data_structure.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.math_real.all;
USE work.summing_bus_res_function.all;

entity upper_switch is
port (std_d : in std_logic;
analog_d : inout brf_real:=0.0;
gate : in std_logic;
std_s : out std_logic;
analog_s : inout brf_real:=0.0);
end upper_switch;

architecture behave of upper_switch is
begin
process(gate)

begin
if gate='1' then --switch on
std_s<=std_d;
analog_s<=analog_d; --conducting current
elsif gate='0' then switch off
std_s<='Z';
analog_s<=0.0;
end if;
end process;
end;


--=============================================================================
-- Project :Examensarbete
-- Filename :lower_switch.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- works as a simulation model for a switch placed in the lower part of a leg
-- in a 6-switch transistor bridge
-- analog signals represents current, and std_logic signals represents
-- potential.
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use work.analog_data_structure.all;
use ieee.std_logic_arith.all;
APPENDIX

-59-
use ieee.std_logic_unsigned.all;
use IEEE.math_real.all;
use work.summing_bus_res_function.all;

entity lower_switch is
port (std_s : in std_logic;
analog_d : inout brf_real:=0.0;
gate : in std_logic;
std_d : out std_logic;
analog_s : inout brf_real:=0.0);

end lower_switch;

architecture behave of lower_switch is
begin
process(gate)
begin
if gate='1' then switch on
std_d<=std_s;
analog_d<=analog_s; --conducting current
elsif gate='0' then --switch off
std_d<='Z';
analog_d<=0.0;
end if;
end process;
end;


--=============================================================================
-- Project :Examensarbete
-- Filename :phase_model.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- simulation model for one phase in a BLDC motor. Every phase is modeled as an
-- inductor in series with a resistor, L and R. The differential equation for
-- the phase is a function included in the package motor_functions.
-- Inputs are pot_pos which works as the potential, either 1, 0 or Z.
-- emk is the Back EMK for the phase.
-- current_pos is the current trough the phase. Used as instatinations in
-- motor_bridge.vhd together with upper_switch.vhd and lower_switch.vhd
--
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use work.analog_data_structure.all;
use work.motor_functions.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.math_real.all;
use work.summing_bus_res_function.all;

entity phase_model is
generic(d1 : time:=1 ns);
port (pot_pos : in std_logic;
emk : in brf_real;
current_pos : inout brf_real:=0.0;
current_neg : inout brf_real:=0.0);
end phase_model;

architecture behave of phase_model is

signal Vdc : brf_real:=24.0; --supply voltage
signal i_n : brf_real:=0.0; --current at [n]
signal i_n_1 : brf_real:=0.0; --current at [n-1]

signal R : analog_component:=(8.5, res); --phase resistance
signal L : analog_component:=(280.0e-6, ind); --phase inductance
signal M : analog_component:=(0.0, ind); --mutual inductance

begin
-----------------------------------------------------------------------------
--process for description of the phase at different potentials
APPENDIX

-60-
-----------------------------------------------------------------------------
phase:
process(pot_pos, current_pos, current_neg, i_n, i_n_1)
begin
if pot_pos='1' then --upper switch conducting
i_n<=phase_current(i_n_1, Vdc, emk, R, L, M, 1.0) after d1;
i_n_1<=i_n;
current_neg<=i_n;
current_pos<=i_n;
elsif pot_pos='0' then --lower switch conducting
current_neg<=0.0; --own influence on current_neg=0
i_n_1<=-current_neg; --global current_neg
i_n<=phase_current(i_n_1, Vdc, emk, R, L, M, 0.0) after d1;
current_pos<=i_n;
elsif pot_pos='Z' then --neither of the switches in one leg conducting
i_n<=phase_current(i_n_1, Vdc, emk, R, L, M, 0.0) after d1;
i_n_1<=i_n;
current_pos<=i_n;
current_neg<=i_n;
end if;
end process;
end;

--=============================================================================
-- Project :Examensarbete
-- Filename :motor_bridge.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- structural model for simulation of BLDC-motor. Binds together
-- 3 upper and lower switches and 3 phasemodels. Insignal g is for controlling -- the gates,
and com is the generated hall signals
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use work.analog_data_structure.all;
use work.motor_functions.all;
use work.summing_bus_res_function.all;
use IEEE.math_real.all;

entity motor_bridge is
generic(d1 : time:=1 ns);
port(g : in std_logic_vector(1 to 6):="000000";
com : out std_logic_vector(3 downto 1));
end motor_bridge;

architecture struct of motor_bridge is
signal s1, s3, s8, s10, s5, s12, s20 : brf_real:=(0.0);
signal s16, s18, s24 : brf_real:=(0.0);

signal s2, s9, s17 : std_logic:='1';
signal s6, s13, s21 : std_logic:='1';
signal s4, s11 : std_logic;
signal s19 : std_logic;
signal s25, s26, s27, s28, s29, s30 : std_logic;

signal i_a, i_b, i_c : brf_real:=0.0;
signal i_tot : brf_real:=0.0;
signal e_a, e_b, e_c : brf_real:=0.0;
signal wr, wr_p : brf_real:=1.0;
signal Te, Te_p : brf_real:=0.1;
signal K : real_vector(3 downto 1);
signal K_std : std_logic_vector(3 downto 1);

signal B : real:=8.378e-10;
signal J : real:=6.5e-7;
signal Ke : real:=0.0097;
signal e : brf_real;
signal rev : real:=0.0;
signal clk : std_logic:='0';
signal time_cnt : real:=100.0; --default to start up motor
signal cmp_time : real;
signal t_com :time:=1 ns;
APPENDIX

-61-

component lower_switch_comp
port (std_s : in std_logic;
analog_d : inout brf_real;
gate : in std_logic;
std_d : out std_logic;
analog_s : inout brf_real);
end component;

component upper_switch_comp
port (std_d : in std_logic;
analog_d : inout brf_real;
gate : in std_logic;
std_s : out std_logic;
analog_s : inout brf_real);
end component;

component phase_model_comp
port (pot_pos : in std_logic;
emk : in brf_real;
current_pos : inout brf_real;
current_neg : inout brf_real);
end component;

for U1, U3, U5 : upper_switch_comp use entity work.upper_switch;
for U4, U6, U2 : lower_switch_comp use entity work.lower_switch;
for U7, U8, U9 : phase_model_comp use entity work.phase_model;

begin
--upper_switch_comp (std_d, analog_d, gate, std_s, analog_s)
U1: upper_switch_comp PORT MAP(s2, s1, s25, s4, s3);
U3: upper_switch_comp PORT MAP(s9, s8, s26, s11, s10);
U5: upper_switch_comp PORT MAP(s17, s16, s27, s19, s18);

--lower_switch_comp (std_s, analog_d, gate, std_d, analog_s)
U4: lower_switch_comp PORT MAP(s6, s3, s28, s4, s5);
U6: lower_switch_comp PORT MAP(s13, s10, s29, s11, s12);
U2: lower_switch_comp PORT MAP(s21, s18, s30, s19, s20);

U7: phase_model_comp PORT MAP(s4, e_a, s3, s24);
U8: phase_model_comp PORT MAP(s11, e_b, s10, s24);
U9: phase_model_comp PORT MAP(s19, e_c, s18, s24);

---------------------------------------------
--to gnd
---------------------------------------------
s5<=0.0;
s12<=0.0;
s20<=0.0;

s6<='0';
s13<='0';
s21<='0';
---------------------------------------------
--mapping of gate and the phase currents
---------------------------------------------
i_a<=s3;
i_b<=s10;
i_c<=s18;

i_tot<=i_a+i_b+i_c;

s25<=g(1);
s26<=g(3);
s27<=g(5);
s28<=g(4);
s29<=g(6);
s30<=g(2);
---------------------------------------------
--rotor model
---------------------------------------------
wr<=rot_speed(wr_p, J, B, Te_p, 0.0, 0.0) after d1; --0.0=real speed
value=constant speed
wr_p<=wr;

Te<=torque(e_a, e_b, e_c, i_a, i_b, i_c, wr);-- after d1;
Te_p <=Te;
APPENDIX

-62-

K_std<=hall_value(rev) after d1;
com<=K_std;
--------------------------------------------------------------
--back emf for all commutation sequences, constant, for use of
--the other back emf modell just comment this and uncomment the
--trapedzoidal version.
--------------------------------------------------------------
e<=Ke*abs(wr);

with K_std select
e_a<= 0.0 when "001", --e
e when "101",
e when "100",
0.0 when "110", --e
-e when "010",
-e when "011",
e when others;

with K_std select
e_b<= -e when "001",
-e when "101",
0.0 when "100", --e
e when "110",
e when "010",
0.0 when "011", --e
e when others;

with K_std select
e_c<= e when "001",
0.0 when "101", --e
-e when "100",
-e when "110",
0.0 when "010", --e
e when "011",
e when others;
---------------------------------
--back emf, trapedzoidal
---------------------------------
-- with K_std select
-- e_a<=e_a+(e*analog_time_delta_real)/cmp_time after 1 ns when
-- "001",
-- e when "101",
-- e when "100",
-- e_a-(e*analog_time_delta_real)/cmp_time after 1 ns when "110",
-- -e when "010",
-- -e when "011",
-- e_a when others;

-- with K_std select
-- e_b<= -e when "001",
-- -e when "101",
-- e_b+(e*analog_time_delta_real)/cmp_time after 1 ns when "100",
-- e when "110",
-- e when "010",
-- e_b-(e*analog_time_delta_real)/cmp_time after 1 ns when "011",
-- e_b when others;

-- with K_std select
-- e_c<= e when "001",
-- e_c-(e*analog_time_delta_real)/cmp_time after 1 ns when "101",
-- -e when "100",
-- -e when "110",
-- e_c+(e*analog_time_delta_real)/cmp_time after 1 ns when "010",
-- e when "011",
-- e_c when others;

--------------------------------------------------------------
--simulation of rotation, incremented with 30 degrees each time
--------------------------------------------------------------
process(clk)
begin
if clk'event then
cmp_time<=(1.0/abs(wr))*(math_pi/6.0);
time_cnt<=time_cnt+analog_time_delta_real; --increment with
--sampeltime
if time_cnt>= cmp_time and cmp_time> 0.0 then --increase with 30
APPENDIX

-63-
-- degrees
if wr>=0.0 then --0.1
rev<=rev+(math_pi+0.0001)/6.0;
time_cnt<=0.0;
else
rev<=rev-(math_pi+0.0001)/6.0;
time_cnt<=0.0;
end if;
end if;
if rev>=2.0*math_pi and wr>=0.0 then --set to zero after one
--revolution
rev<=0.0;
elsif rev<=0.0 and wr<0.0 then
rev<=2.0*math_pi;
end if;
end if;
end process;

--------------------------------------------------------------
--internal clock for processes
--------------------------------------------------------------
clk<=not clk after d1;
end;

--=============================================================================
-- Project : examensarbete
-- Filename : motor_functions.vhd
-- Designer : Andreas Johansson
-- Version : P1A
-- Date of issue : 2003-02-20
--
-- Description
-- functions for simulation of BLDC motor, to be used with motor_bridge.vhd
--
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use work.analog_data_structure.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.math_real.all;
use work.summing_bus_res_function.all;

PACKAGE motor_functions is

type real_vector is ARRAY (integer range<> ) of real;

--------------------------------------------------------------
--function headers
--------------------------------------------------------------
function phase_current (i_1 : brf_real;
V : brf_real;
e : brf_real;
R : analog_component;
L : analog_component;
M : analog_component;
Switch : brf_real)
return brf_real;

function torque (emk_a : brf_real;
emk_b : brf_real;
emk_c : brf_real;
curr_a : brf_real;
curr_b : brf_real;
curr_c : brf_real;
w : brf_real)
return brf_real;

function rot_speed (w_n_1 : brf_real;
J : brf_real;
B : brf_real;
Te_n_1 : brf_real;
Tl : brf_real;
off : real)
return brf_real;
APPENDIX

-64-

function hall_value (rev : real)
return std_logic_vector;

end motor_functions;

package body motor_functions is

--------------------------------------------------------------
--function for the phase currents
--------------------------------------------------------------
function phase_current (i_1 :brf_real; --current at n-1
V : brf_real;
e : brf_real;
R : analog_component;
L : analog_component;
M : analog_component;
Switch : brf_real)
return brf_real is
variable i_out : brf_real;

begin
i_out:=i_1 + (analog_time_delta_real/(L.val-M.val))*(V*Switch
R.val*i_1 - e);
return i_out;
end phase_current;

--------------------------------------------------------------
--function for generated torque
--------------------------------------------------------------
function torque (emk_a :brf_real;
emk_b : brf_real;
emk_c : brf_real;
curr_a : brf_real;
curr_b : brf_real;
curr_c : brf_real;
w : brf_real)
return brf_real is
variable T_out : brf_real;

begin
T_out:=(emk_a*curr_a + emk_b*curr_b + emk_c*curr_c)/abs(w);
return T_out;
end torque;

--------------------------------------------------------------
--calculation of angular velocity, w (rad/s)
--------------------------------------------------------------
function rot_speed (w_n_1 : brf_real;
J : brf_real;
B : brf_real;
Te_n_1 : brf_real;
Tl : brf_real;
off : real)
return brf_real is
variable w : brf_real;
begin
if off=0.0 then
w:=w_n_1 + (analog_time_delta_real/J)*(Te_n_1 - Tl - B*w_n_1);
else
w:=off; --constant speed if off<>0.0
end if;
return w;
end rot_speed;

--------------------------------------------------------------
--commutation signals determined upon position of rotor
--------------------------------------------------------------
function hall_value (rev : real)
return std_logic_vector is
variable K : std_logic_vector(3 downto 1);

begin
if rev>=0.0 and rev<math_pi/3.0 then
K:="101";
elsif rev>=math_pi/3.0 and rev<(2.0*math_pi)/3.0 then
K:="100";
APPENDIX

-65-
elsif rev>=(2.0*math_pi)/3.0 and rev<(math_pi) then
K:="110";
elsif rev>=(math_pi) and rev<(4.0*math_pi)/3.0 then
K:="010";
elsif rev>=(4.0*math_pi)/3.0 and rev<(5.0*math_pi)/3.0 then
K:="011";
elsif rev>=(5.0*math_pi)/3.0 and rev<=(2.0*math_pi+0.01) then
K:="001";
end if;
return K;
end hall_value;
end motor_functions;

--=============================================================================
-- Project :Examensarbete
-- Filename :phase_model.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- simulation model for one phase in a BLDC motor. Every phase is modeled as an
-- inductor in series with a resistor, L and R. The differential equation for
-- the phase is a function included in the package motor_functions.
-- Inputs are pot_pos which works as the potential, either 1, 0 or Z.
-- emk is the Back EMK for the phase.
-- current_pos is the current trough the phase. Used as instatinations in
-- motor_bridge.vhd together with upper_switch.vhd and lower_switch.vhd
--
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use work.analog_data_structure.all;
use work.motor_functions.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.math_real.all;
use work.summing_bus_res_function.all;

entity phase_model is
generic(d1 : time:=1 ns);
port (pot_pos : in std_logic;
emk : in brf_real;
current_pos : inout brf_real:=0.0;
current_neg : inout brf_real:=0.0);
end phase_model;

architecture behave of phase_model is

signal Vdc : brf_real:=24.0; --supply voltage
signal i_n : brf_real:=0.0; --current at [n]
signal i_n_1 : brf_real:=0.0; --current at [n-1]

signal R : analog_component:=(8.5, res); --phase resistance
signal L : analog_component:=(280.0e-6, ind); --phase inductance
signal M : analog_component:=(0.0, ind); --mutual inductance

begin
-----------------------------------------------------------------------------
--process for description of the phase at different potentials
-----------------------------------------------------------------------------
phase:
process(pot_pos, current_pos, current_neg, i_n, i_n_1)
begin
if pot_pos='1' then --upper switch conducting
i_n<=phase_current(i_n_1, Vdc, emk, R, L, M, 1.0) after d1;
i_n_1<=i_n;
current_neg<=i_n;
current_pos<=i_n;
elsif pot_pos='0' then --lower switch conducting
current_neg<=0.0; --own influence on current_neg=0
i_n_1<=-current_neg; --global current_neg
i_n<=phase_current(i_n_1, Vdc, emk, R, L, M, 0.0) after d1;
current_pos<=i_n;
elsif pot_pos='Z' then --neither of the switches in one leg conducting
APPENDIX

-66-
i_n<=phase_current(i_n_1, Vdc, emk, R, L, M, 0.0) after d1;
i_n_1<=i_n;
current_pos<=i_n;
current_neg<=i_n;
end if;
end process;
end;

--=============================================================================
-- Project :Examensarbete
-- Filename :svm_controller.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- controls the outgoing ROM_6bit with adr_pointer. Strobes RAM_11bit
-- to store new values after a complete sequence. Counter_value is received from
-- RAM_11bit.
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity SVM_controller is
port(clk : in std_logic;
reset : in std_logic;
counter_value : in std_logic_vector(10 downto 0);
adr_pointer : out std_logic_vector(3 downto 0);
strobe_ram : out std_logic);
end SVM_controller;

architecture RTL of SVM_controller is
signal counter_11bit : std_logic_vector(10 downto 0):=(others=>'0');
signal adr_pointer_int : std_logic_vector(3 downto 0):=(others=>'0');

begin
adr_pointer<=adr_pointer_int;
--------------------------------------------------------------
--process that controls the outgoing ROM adresses
--------------------------------------------------------------
adr_control:
process(clk, adr_pointer_int, counter_11bit, reset)
begin
if reset='1' then
counter_11bit<=(others=>'0');
adr_pointer_int<=(others=>'0');
strobe_ram<='1';
elsif rising_edge(clk) then
strobe_ram<='0';
if counter_11bit>=counter_value then --countervalue from RAM_11bit
counter_11bit<=(others=>'0');
if adr_pointer_int>="0110" then --strobe ram after 7 steps
adr_pointer_int<=(others=>'0');
strobe_ram<='1';
else
adr_pointer_int<=adr_pointer_int+'1'; --internal signal, in
--order to read
end if;
else
counter_11bit<=counter_11bit+'1'; --count until
--counter_11bit=counter_value
end if;
end if;
end process;
end;


--=============================================================================
-- Project :Examensarbete
-- Filename :ROM_6bit.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
APPENDIX

-67-
-- 6 ROMs with outsignal sequences to control the 6 switches.
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity ROM_6bit is
port(adr : in std_logic_vector(3 downto 0);
rom_select : in std_logic_vector(2 downto 0);
out_data : out std_logic_vector(5 downto 0));
end ROM_6bit;

architecture RTL of ROM_6bit is
constant ROM_width : integer:=6;
constant ROM_length : integer:=7;
subtype ROM_content is std_logic_vector(ROM_width-1 downto 0);
type ROM_table is array (0 to ROM_length-1) of ROM_content;

constant ROM_0 : ROM_table:=ROM_table' --0-60 degrees
("101010", --000 activated base vectors
"100011", --100
"000111", --110
"010101", --111
"000111", --110
"100011", --100
"101010"); --000

constant ROM_1 : ROM_table:=ROM_table' --60-120 degrees
("010101", --111
"000111", --110
"001110", --010
"101010", --000
"001110", --010
"000111", --110
"101010"); --111

constant ROM_2 : ROM_table:=ROM_table' --120-180 degrees
("010101", --000
"001110", --010
"011100", --011
"101010", --111
"011100", --011
"001110", --010
"101010"); --000

constant ROM_3 : ROM_table:=ROM_table' --180-240 degrees
("010101", --111
"011100", --011
"111000", --001
"101010", --000
"111000", --001
"011100", --011
"010101"); --000

constant ROM_4 : ROM_table:=ROM_table' --240-300 degrees
("101010", --000
"111000", --001
"110001", --101
"010101", --111
"110001", --101
"111000", --001
"101010"); --000

constant ROM_5 : ROM_table:=ROM_table' --300-360 degrees
("010101", --111
"110001", --101
"100011", --100
"101010", --000
"100011", --100
"110001", --101
"010101"); --111
begin
with rom_select select
out_data <=
ROM_0(conv_integer(adr)) when "000",
APPENDIX

-68-
ROM_1(conv_integer(adr)) when "001",
ROM_2(conv_integer(adr)) when "010",
ROM_3(conv_integer(adr)) when "011",
ROM_4(conv_integer(adr)) when "100",
ROM_5(conv_integer(adr)) when "101",
"111111" when others;
end;

--=============================================================================
-- Project :Examensarbete
-- Filename :RAM_11bit.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- RAM, All elements are written on strobe rising_edge.
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================

library IEEE;
use ieee.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity RAM_11bit is
port(adr : in std_logic_vector(3 downto 0);
strobe : in std_logic;
data_0 : in std_logic_vector(10 downto 0);
data_1 : in std_logic_vector(10 downto 0);
data_2 : in std_logic_vector(10 downto 0);
data_3 : in std_logic_vector(10 downto 0);
data_4 : in std_logic_vector(10 downto 0);
data_5 : in std_logic_vector(10 downto 0);
data_6 : in std_logic_vector(10 downto 0);
out_data : out std_logic_vector(10 downto 0));
end RAM_11bit;

architecture RTL of RAM_11bit is
constant RAM_width : integer:=11;
constant RAM_length : integer:=7;
subtype RAM_content is std_logic_vector(RAM_width-1 downto 0);
type RAM_table is array (0 to RAM_length-1) of RAM_content;
signal RAM : RAM_table;
begin

store:
process(strobe)
begin
--store new values on strobe
if rising_edge(strobe) then
RAM(0)<=data_0;
RAM(1)<=data_1;
RAM(2)<=data_2;
RAM(3)<=data_3;
RAM(4)<=data_4;
RAM(5)<=data_5;
RAM(6)<=data_6;
else
end if;
end process;

out_data<=RAM(conv_integer(adr));
end;


7.3 Appendix III - VHDL-kod syntetiserad

Filerna fr den syntetiserade koden r placerade i fljande ordning. Innefattar
ven ngra .vhd filer fr att kontrollera LED segmenten p testkortet och
terfinns p www.memec.com . File markerade med asterix r bifogade i detta
APPENDIX

-69-
appendix och kan vara intressanta att studera fr att se skillnader mellan
simuleringsmodellen och den syntetiserade koden.

comm_states_a.vhd
comm_states_e.vhd
*time_calc_a.vhd
*time_calc_e.vhd
clk_divider_a.vhd
clk_divider_e.vhd
in_buffer_a.vhd
in_buffer_e.vhd
*PWM_block_a.vhd toppblock
*PWM_block_e.vhd

--=============================================================================
-- Project :Examensarbete
-- Filename :time_calc_a.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- calculates the time for the pulse t1 using the clockpulses provided
-- by clk. Simplified alot since the simulation model in order to cope
-- with the high clocking frequency. Only asymmetric pulses.
-- Copyright ****** SAAB Dynamics AB ******

--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

architecture RTL of time_calc is
signal cmp_vector : std_logic_vector(10 downto 0);
signal trunk_in : std_logic_vector(n-res downto 0);
begin
trunk_in(n-res-1 downto 0)<=in_calc(n-2 downto res-1); --acording to resolution the
insignal
--must be truncated
dir<=in_calc(n-1);
t1_generation:
process(clk, trunk_in, cmp_vector)
begin
if reset='1' then
cmp_vector<=(others=>'0');
t1<='0';
elsif rising_edge(clk) then
cmp_vector<=cmp_vector+1;
if trunk_in>cmp_vector then
t1<='1';
else --if cmp_vector>=trunk_in then
t1<='0';
end if;
end if;
end process;
end;

--=============================================================================
-- Project :Examensarbete
-- Filename :time_calc_e.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
APPENDIX

-70-
--
-- Description
-- entity for use with the RTL architecture in time_calc_a.vhd
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned;
use ieee.std_logic_arith.all;

entity time_calc is
generic (n : Integer;-- := 16;
res : integer; --:=5; --determines resolution, n-res bits, default 16-5=11bitar
port (reset : in std_logic;
in_calc : in Std_Logic_vector(n-1 downto 0);
clk : in Std_logic;
t1 : out Std_logic;
dir : out Std_logic);
end time_calc;

--=============================================================================
-- Project :Examensarbete
-- Filename :clk_divider_a.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-12
--
-- Description
-- divides the global clk to desired frequency
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

architecture behave of clk_divider is
signal counter : std_logic_vector(res-1 downto 0);

begin
counter_proc:
--------------------------------------------------------------
--12-bit counter for 12-bit resolution i.e 200MHz operation and
--50KHz PWM-period
--11-bit counter for 11-bit resolution i.e 100MHz operation and
--50KHz PWM-period
--------------------------------------------------------------
process(clk_global, reset)
begin
if reset='1' then
counter<=(others=>'0');
elsif rising_edge(clk_global) then
counter<=counter+'1'; --res-1 bit counter generated from synthesis
end if;
end process counter_proc;
clk_out<=counter(res-1);
end;






--=============================================================================
-- Project :Examensarbete
-- Filename :clk_divider_e.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- entity for use with the architecture in clk_divider_a.vhd
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;
entity clk_divider is
APPENDIX

-71-
generic (res : Integer:= 11);
port (reset : in std_logic;
clk_global : in Std_Logic;
clk_out : out Std_logic);
end clk_divider;

--=============================================================================
-- Project :Examensarbete
-- Filename :in_buffer_a.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- Buffers the reference input signal with the frequency of clk. The number of
-- in ports are defined as a vector vith length n-1
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;

architecture behave of in_buffer is
begin
buf_in_signal:
process(clk)
begin
if rising_edge(clk) then
ref_buf<=ref_in;
end if;
end process buf_in_signal;
end;


--=============================================================================
-- Project :Examensarbete
-- Filename :in_buffer_e.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- entity for use with architecture in in_buffer_a.vhd
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================
library IEEE;
use ieee.std_logic_1164.all;

entity in_buffer is

generic (n : Integer:= 16);
port (ref_in : in Std_Logic_vector(n-1 downto 0);
clk : in Std_logic;
ref_buf : out Std_logic_vector(n-1 downto 0));
end in_buffer;


--=============================================================================
-- Project :Examensarbete
-- Filename :PWM_block_a.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- top level for synthetisation ready version of the blockkomutation design.
-- The led and lcd components are copied from memecs site to control the led
-- segments on the testboard.
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================-

library IEEE;
use ieee.std_logic_1164.all;

architecture structural of PWM_block is
signal s1 : std_logic;
signal s2 : std_logic_vector(n-1 downto 0);
signal s3 : std_logic;
APPENDIX

-72-
signal s4 : std_logic;
signal states_to_lcd_digits : std_logic_vector(6 downto 0);
signal clk_to_lcd_digits : std_logic;
signal lcd_to_lcd_digits : std_logic_vector(6 downto 0);
signal error_led : std_logic;

component clk_divider_comp
generic (res : integer);
port (reset : in std_logic;
clk_global : in Std_Logic;
clk_out : out Std_logic);
end component;

component in_buffer_comp
generic (n : Integer);
port (ref_in : in Std_Logic_vector(n-1 downto 0);
clk : in Std_logic;
ref_buf : out Std_logic_vector(n-1 downto 0));
end component;

component time_calc_comp
generic (n : Integer;

res : integer;
Tper : integer;
mode : integer);

port (reset : in std_logic;
in_calc : in Std_Logic_vector(n-1 downto 0);
clk : in Std_logic;
t1 : out Std_logic;
dir : out Std_logic);
end component;

component comm_states_comp
port (reset : in std_logic;
clk : in std_logic;
t1 : in Std_Logic;
dir_s : in Std_logic;
K : in std_logic_vector(3 downto 1);
s : out Std_logic_vector(1 to 6);
test_sig : out Std_logic;
lcd : out std_logic_vector(6 downto 0);
--force_trig_sim : in std_logic; --away for FPGA TEST!
error_test_sig : out std_logic);
end component;

component lcd_digits_comp
port(clk : in std_logic;
cnt : in std_logic;
lcd_in : in std_logic_vector(6 downto 0);
lcd_seg : out std_logic_vector(6 downto 0);
lcd_com : out std_logic;
lcd_dp : out std_logic);
end component;

component lcd_decoder_comp
port(k_in : in std_logic_vector(3 downto 1);
lcd : out std_logic_vector(6 downto 0));
end component;


component clk_div_lcd_comp
port(clk : in std_logic;
clk_24div : out std_logic);
end component;

component LED_display_emulator_comp
port(led_in : in std_logic_vector(6 downto 0 );
led_out : out std_logic_vector(3 downto 0));
end component;

for U1 : clk_divider_comp use entity work.clk_divider;
for U2 : in_buffer_comp use entity work.in_buffer;
for U3 : time_calc_comp use entity work.time_calc;
for U4 : comm_states_comp use entity work.comm_states;
for U5,U8 : lcd_digits_comp use entity work.lcd_digits;
APPENDIX

-73-
for U6 : lcd_decoder_comp use entity work.lcd_decoder;
for U7 : clk_div_lcd_comp use entity work.clk_div_lcd;
for U9 : LED_display_emulator_comp use entity work.LED_display_emulator;

begin
U1 : clk_divider_comp generic MAP(11)
PORT MAP(reset=>reset, clk_global=>clk_system, clk_out=>s1);
U2 : in_buffer_comp generic MAP(n)
PORT MAP(in_data, s1, s2);
U3 : time_calc_comp generic MAP(n, 5, 4096, 1) --5 changed to 7 for 9bit res [030123]
--changed to 6 for 10bit res, to 5 fosr 11bit
PORT MAP(reset=>reset, in_calc=>s2, clk=>clk_system, t1=>s3, dir=>s4);
U4 : comm_states_comp PORT MAP(reset=>reset, clk=>clk_system, t1=>s3, dir_s=>s4,
K=>K_value, s=>sw, test_sig=>test, lcd=>states_to_lcd_digits,
force_trig_sim=>force_trig_sim, error_test_sig=>error_led);
U5 : lcd_digits_comp PORT MAP(clk=>s1, cnt=>clk_to_lcd_digits,
lcd_in=>lcd_to_lcd_digits, lcd_seg=>lcd_left, lcd_com=>lcd_com_left, lcd_dp=>lcd_dp_left);
U6 : lcd_decoder_comp PORT MAP(k_in=>K_value, lcd=>lcd_to_lcd_digits);
U7 : clk_div_lcd_comp PORT MAP(clk=>clk_system, clk_24div=>clk_to_lcd_digits);
U8 : lcd_digits_comp PORT MAP(clk=>s1, cnt=>clk_to_lcd_digits,
lcd_in=>states_to_lcd_digits, lcd_seg=>lcd_right, lcd_com=>lcd_com_right,
lcd_dp=>lcd_dp_right);
U9 : LED_display_emulator_comp PORT MAP(led_in=>states_to_lcd_digits,
led_out=>led_out_sim);
prg_chk<=error_led;
end;

--=============================================================================
-- Project :Examensarbete
-- Filename :PWM_block_e.vhd
-- Designer :Andreas Johansson
-- Version :0.1
-- Date of issue :2002-09-10
--
-- Description
-- Entity for use with the structural architecture in PWM_block_a.vhd
-- The led and lcd ports acording to memecs site to control the led
-- segments on the testboard.
-- Copyright ****** SAAB Dynamics AB ******
--=============================================================================-

library IEEE;
use ieee.std_logic_1164.all;

entity PWM_block is
generic(n : integer:=16);
port(reset : in std_logic;
in_data : in std_logic_vector(n-1 downto 0);
clk_system : in std_logic;
K_value : in std_logic_vector(3 downto 1);
sw : out std_logic_vector(1 to 6);
test : out std_logic;
lcd_left : out std_logic_vector(6 downto 0);
lcd_com_left : out std_logic;
lcd_dp_left : out std_logic;
lcd_right : out std_logic_vector(6 downto 0);
lcd_com_right : out std_logic;
lcd_dp_right : out std_logic;
prg_chk : out std_logic;
led_out_sim : out std_logic_vector(3 downto 0);
--force_trig_sim : in std_logic); --away for FPGA TEST!!!
end PWM_block;


P svenska

Detta dokument hlls tillgngligt p Internet eller dess framtida ersttare
under en lngre tid frn publiceringsdatum under frutsttning att inga extra-
ordinra omstndigheter uppstr.
Tillgng till dokumentet innebr tillstnd fr var och en att lsa, ladda ner,
skriva ut enstaka kopior fr enskilt bruk och att anvnda det ofrndrat fr
ickekommersiell forskning och fr undervisning. verfring av upphovsrtten
vid en senare tidpunkt kan inte upphva detta tillstnd. All annan anvndning av
dokumentet krver upphovsmannens medgivande. Fr att garantera ktheten,
skerheten och tillgngligheten finns det lsningar av teknisk och administrativ
art.
Upphovsmannens ideella rtt innefattar rtt att bli nmnd som upphovsman i
den omfattning som god sed krver vid anvndning av dokumentet p ovan
beskrivna stt samt skydd mot att dokumentet ndras eller presenteras i sdan
form eller i sdant sammanhang som r krnkande fr upphovsmannens litterra
eller konstnrliga anseende eller egenart.
Fr ytterligare information om Linkping University Electronic Press se
frlagets hemsida http://www.ep.liu.se/


In English

The publishers will keep this document online on the Internet - or its possible
replacement - for a considerable time from the date of publication barring
exceptional circumstances.
The online availability of the document implies a permanent permission for
anyone to read, to download, to print out single copies for your own use and to
use it unchanged for any non-commercial research and educational purpose.
Subsequent transfers of copyright cannot revoke this permission. All other uses
of the document are conditional on the consent of the copyright owner. The
publisher has taken technical and administrative measures to assure authenticity,
security and accessibility.
According to intellectual property law the author has the right to be
mentioned when his/her work is accessed as described above and to be protected
against infringement.
For additional information about the Linkping University Electronic Press
and its procedures for publication and for assurance of document integrity,
please refer to its WWW home page: http://www.ep.liu.se/

Andreas Johansson

You might also like