STM32 PMSM FOC Shanghai, March,2008
FOC Plan Clark Parke Circle limitation 3 / : Hall Mar 08 1
PMSM BLDC AC PMSM BLDC BLDC PMSM BLDC Mar 08 2
PMSM: La < Lb < Lc a)sm-pmsm: Ld=Lq. b) & c)ipm-sm: (Ld<Lq). b) ; c) Mar 08 3
(FOC): Id Iq ( ) Mar 08 4
(1/3) ω f ax, f bx, f cx 120 a,b,c f qx, f dx, f 0x d,q Mar 08 5
(2/3) f qdox f = f f qx dx 0x = 2 3 coθ inθ 1 2 co θ in θ 1 2 2π 3 2π 3 2π co θ + 3 2π in θ + 3 1 2 f f f ax bx cx θ = t ω ( t ) dt + θ (0) 0 3 PMSM Clarke: ω=0, θ(0)=0 θ=0; Park: ω=ω r, θ(0)=θ r (0) θ=θ r ; Park: ω=-ω r, θ(0)= θ r (0) θ=-θ r ; Mar 08 6
(3/3) Clarke i a,i b,i c : i i α β = i a i = a + 2i b 3 I Park i α,i β : i i q d = i = i α a coθ i r r inθ + i β β inθ coθ r r Park v q,v d : V v v α β = v q = v coθ + v q r r d inθ + v inθ d r coθ r Mar 08 7
Mar 08 8 SM-PMSM FOC 1/3 SM-PMSM dt d r i v abc abc abc λ + = m r r r abc m l m m m m l m m m m l abc i L L L L L L L L L L L L Φ + + + + + = π θ π θ θ λ 3 2 in 3 2 in in 2 1 2 1 2 1 2 1 2 1 2 1 a b c θ r N S q d Φ m
Mar 08 9 SM-PMSM FOC 2/3 d,q d + Φ = = m d d q q L i L i λ λ + = + + = q r d d d d r q q q dt d r i v dt d r i v ω λ λ ω λ λ ( ) ( ) r d q q m q d d q q d e i i L i i i L p i i p T Φ + = = 2 3 2 3 λ λ ( ) q m e i p T Φ = 2 3 i q =I ; i d =0
SM-PMSM FOC 3/3 FOC SM-PMSM i q i d * * = 0 e -jθr Synchronou Frame CR-PWM i abc i q e jθr 3 ( ) i d 2 p Φ mi q T e + - T L Rotor poition feedback i required! ω r 1 J T e = 2 3 p θ r el ( Φ i ) m q θ r el p FOC : Mar 08 10
FOC AC Main ~ 3 phae inverter PMSM Motor ~ i q * i d * + + - - PID PID v q v d PARK & circle limitation v αβ v abc SVPWM θ rel i q i d PARK i αβ CLARKE i abc θ rel Mar 08 11
FOC AC Main ~ 3 phae inverter PMSM Motor ~ v abc i q * + - i d * + - PID PID v q v d PARK & circle limitation v αβ SVPWM θ rel i q i d PARK i αβ CLARKE i abc - + ω r * ω r θ rel Mar 08 12
circle limitation v q v d SVPWM S16_MAX PWM V r V r * * V q V * q V q = * ( MMI S16_MAX) r V V d V q * V d V * d V d = * ( MMI S16_MAX) r V r1 r2 r 1 = S16_MAX r = MMI S16_MAX 2 MMI S16_MAX Look up table : r * V 2 Mar 08 13
1/3 i d i q T e = 2 3 p ( Φ i ) m q ( 4 AC-DC,..) Mar 08 14
2/3 (FOC ) i q ( PID ) i d ( MC_PMSM_Motor_param.h ) ; R, ; L, ; Ke, ; p, ; In, (< ); MMI ( PWM ). Mar 08 15
3/3 ( ) ω 3 > ω 2 > ω 1 >ω ω i q A ( ) ω 2 i d ω 4 ω 1 ω 3 id Mar 08 16
FOC_CalcFluxTorqueRef (MC_FOC_DRIVE.c) Feature i executed with TB period Read Target Speed i i qtemp higher than i qat? YES NO Chooe i d ref, i qat (MC_PMSM_Motorparam.h) i qref = i qtemp i qref = i qat Read Meaured Speed PID peed regulator End i qtemp Mar 08 17
FOC_Model (MC_FOC_DRIVE.c) FOC Feature i executed after Current Converion (SAMPLING FREQ) v q * = PI regulator (i q, i qref ) (i a, i b ) = Get Phae Current v d * = PI regulator (i d, i dref ) (v q, v d ) = CircleLimitation (v q *, v d *) (i α, i β ) = Clarke (i a, i b ) (v α, v β ) = RevPark (v q, v d ) (i q, i d ) = Park (i α, i β ) SV_PWM (v α, v β ) End Mar 08 18
FOC Plan Clark Parke Circle limitation 3 / : Hall Mar 08 19
3 Gate Driver OpAmp + Offet + - OpAmp + Offet + - OpAmp + Offet + - ADC OpAmp + Offet 3.3V 500mV R Shunt Mar 08 20
TIM1 CH4 Mar 08 21
SVPWM hunt T Noie hunt T Rie T Noie T Rie STM32 ADC/TIM1 PWM SVPWM Mar 08 22
duty cycle SVPWM 100% 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% 0 60 120 180 240 300 360 Phae A Phae B Phae C 100% 90% 80% 70% 60% 50% SVPWM duty cycle duty cycle C duty cycle A duty cycle B duty cycle 40% 30% 20% 10% 0% Phae A Phae B Phae C Mar 08 23
1/4 Duty A > D T +T N, Duty A >DT+T N Low ide phae A DT Duty A Counter overflow HP: T S << DT+T N High ide phae A DT Low ide phae B High ide phae B DT T N DT T S Current feedback phae B Sampling tart Current feedback phae C T S Sampling end Mar 08 24
2/4 (DT+T N +T S )/2 < Duty A < D T +T N & Duty A-B <DT+ T R +T S A T N µ Low ide phae A Duty A-B Duty A DT Counter overflow High ide phae A DT Low ide phae B High ide phae B DT T N T S DT Current feedback phae B T S Sampling tart Current feedback phae C Sampling end < T S Mar 08 25
3/4 Duty A <(DT+T N +T S )/2 & Duty A-B >DT+T R +T S A T S µ Low ide phae A Duty A-B DT High ide phae A DT Low ide phae B High ide phae B DT T R DT Current feedback phae B Current feedback phae C T S T S Sampling tart Sampling end < T S Mar 08 26
4/4 Duty A <(DT+T N +T S )/2 & Duty A-B <DT+T R +T S MMI PWM Low ide phae A Duty A-B DT High ide phae A DT Low ide phae B High ide phae B DT T R DT Current feedback phae B Current feedback phae C < T S Mar 08 27
TIM1 PWM1, 2,3 ADC ADC PMW4 PWM4 PWM 1 PWM 1 PWM 2 PWM 2 PWM 3 ADC Start PWM 3 ADC Start PWM 4 PWM 4 Mar 08 28
PWM freq Dead Time Rep_rate MC_Control_Param.h / PWM 3 MC_pwm_3hunt_prm.h MC_pwm_ic_prm.h tm32f10x_vpwm_3hunt.c tm32f10x_vpwm_3hunt.h tm32f10x_vpwm_ic.c tm32f10x_vpwm_ic.h STM32F10x_MCconf.h STM32F10x_MCconf.h MC_Control_Param.h PWM ( MMI- ), (n) REP_RATE MC_pwm_3hunt_prm.h T, T Noie T Rie n Mar 08 29
1/2 STM32F10x_MCconf.h /* Current ening by ICS (Iolated current enor) */ //#define ICS_SENSORS /* Current ening by Three Shunt reitor */ #define THREE_SHUNT MC_Control_Param.h /**** Power device witching frequency ****/ #define PWM_FREQ ((u16) 12500) // in Hz /**** Deadtime Value ****/ #define DEADTIME_NS ((u16) 800) //in nec; range i [0...3500] /**** Uncomment the Max modulation index ****/ /**** correponding to the elected PWM frequency ****/ //#define MAX_MODULATION_100_PER_CENT // up to 11.4 khz PWM frequency //#define MAX_MODULATION_99_PER_CENT // up to 11.8 khz //#define MAX_MODULATION_98_PER_CENT // up to 12.2 khz #define MAX_MODULATION_97_PER_CENT // up to 12.9 khz... /**** ADC IRQ-HANDLER frequency, related to PWM ****/ #define REP_RATE (1) Mar 08 30
2/2 MC_pwm_3hunt_prm.h #define SAMPLING_TIME_NS (u16)(700) //0.7uec #define TNOISE_NS (u16)(2550) //2.55uec #define TRISE_NS (u16)(2550) //2.55uec Mar 08 31
3 ADC tm32f10x_it.c ADC_IRQHandler FOC_Model tm32f10x_vpwm_3hunt.c MC_FOC_Drive.c FOC_Model GET_PHASE_CURRENTS CALC_SVPWM SVPWM_3ShuntGetPhaeCurrentValue SVPWM_3ShuntCalcDutyCycle ADC ADC_IRQ FOC CALC_SVPWM(SVPWM_3ShuntCalcDutyCycle) alpa/beta, FOC_Model GET_PHASE_CURRENTS(SVPWM_3ShuntGetPhaeCurrentValue) duty cycle PWM OC4 FOC_Model FOC Mar 08 32
U(Update) ADC ADC DT/2+T N /2 + 3T S /2 (DT+T N -T S )/2 U ADC U Ov U DT/2+T N /2+3T S /2 2.7µ (DT+T N -T S )/2 1.3µ U Mar 08 33
REP_RATE PWM U FOC duty cycle REP_RATE duty cycle U U U U REP_RATE = 1 REP_RATE = 3 FOC duty cycle Mar 08 34
PWM frequency Max Duty Cycle Max Modulation Index REP_RAT E Up to 11.4kHz 12.2kHz 12.9kHz 13.7kHz 14.4kHz 15.2kHz 16kHz 16.7kHz 100% 99% 98.5% 98% 98% 97% 96.5% 96.5% 100% 98% 97% 96% 96% 94% 93% 93% 1 1 1 1 1 1 1 3 MB459 T N =T R =2,55 µ T S =0,7 µ DT=0,8µ 17.5kHz 95.5% 91% 3 Mar 08 35
( ) Conditioning + - Conditioning + - ADC Conditioning Network XXXmV 3.3V offet ICS ICS Mar 08 36
Counter Compare 1 compare 2 Low ide 1 Low ide 2 Phae current Average current ADC Sampling Mar 08 37
( A B ) Tnoie Trie U ADC duty cycle 100% Mar 08 38
PWM freq Dead Time Rep_rate MC_Control_Param.h Current reading / PWM generation block 3 hunt ICS MC_pwm_3hunt_prm.h MC_pwm_ic_prm.h tm32f10x_vpwm_3hunt.c tm32f10x_vpwm_3hunt.h tm32f10x_vpwm_ic.c tm32f10x_vpwm_ic.h Current feedback type STM32F10x_MCconf.h STM32F10x_MCconf.h MC_Control_Param.h PWM ( MMI- ), (n) REP_RATE Mar 08 39
STM32F10x_MCconf.h /* Current ening by ICS (Iolated current enor) */ #define ICS_SENSORS /* Current ening by Three Shunt reitor */ //#define THREE_SHUNT MC_Control_Param.h /**** Power device witching frequency ****/ #define PWM_FREQ ((u16) 14400) // in Hz /**** Deadtime Value ****/ #define DEADTIME_NS ((u16) 800) //in nec; range i [0...3500] /**** Uncomment the Max modulation index ****/ /**** correponding to the elected PWM frequency ****/ #define MAX_MODULATION_100_PER_CENT // up to 11.4 khz PWM frequency //#define MAX_MODULATION_99_PER_CENT // up to 11.8 khz //#define MAX_MODULATION_98_PER_CENT // up to 12.2 khz //#define MAX_MODULATION_97_PER_CENT // up to 12.9 khz... /**** ADC IRQ-HANDLER frequency, related to PWM ****/ #define REP_RATE (3) Mar 08 40
ICS ADC tm32f10x_it.c ADC_IRQHandler FOC_Model tm32f10x_vpwm_ic.c MC_FOC_Drive.c FOC_Model GET_PHASE_CURRENTS CALC_SVPWM SVPWM_IcGetPhaeCurrentValue SVPWM_IcCalcDutyCycle ADC ADC_IRQ. FOC_Model ADC U GET_PHASE_CURRENTS(SVPWM_IcGetPhaeCurrentValue FOC_Model FOC ) alpa/beta, FOC CALC_SVPWM(SVPWM_IcCalcDutyCycle) FOC duty cycle Mar 08 41
FOC Plan Clark Parke Circle limitation 3 / : Hall Mar 08 42
/ Park / FOC ( ) / : 3 Hall (60 or 120 ) Mar 08 43
: F 0.1Hz PID ( ) Digit Per PWM (F dpp ) PWM (16) F 0.1Hz F dpp F dpp = F 0.1Hz 65536 10 F PWM ( Hz) Mar 08 44
Hall Hall Hall Hall 120 60 State5 State1 State3 State2 State6 State4 State1 State3 State7 State6 State4 State0 Mar 08 45
STM32 Hall STM32 Hall 0 (clear-on-capture) Mar 08 46
1/2 Hall ( ) Mar 08 47
2/2 ( ) Mar 08 48
Hall Bemf C Bemf A Bemf B -120 0 120-120 H1 H2 H3 FOC F dpp Mar 08 49
tm32f10x_hall.c TIMx_IRQHandler Capture event Update (OVF) event Read preent tate OVF_Counter++ Extract pinning direction Synchronize angle OVF_Counter > HALL_MAX_OV ERFLOWS? There were overflow? Ye Ye Time out = TRUE Captured value i too low? Store capture, precaler, direction Ye Store capture, precaler, direction Precaler-- Re-compute capture Store capture, precaler, direction Precaler++ End Mar 08 50
H1 H2 H3 120 60 0 A Bemf C Bemf A Bemf B -90 0 90 Mar 08 51
Hall MB459 1/2 A (J5-2) A +120 B (J5-3) C (J5-1) Mar 08 52
Hall MB459 2/2 Hall ( ) A ( ) H1 H2 H3 A H1 120 60 Mar 08 53
MC_hall_prm.h tm32f10x_mcconf.h HALL_SENSORS VIEW_HALL_FEEDBACK TIMERx_HANDLES_HALL: HALL HALL_SENSORS_PLACEMENT: 120 60 (DEGREES_120 DEGREES_60) HALL_PHASE_SHIFT: (degree) 0 TIMERx CC1 (STM32 MC-KIT H1 ) HALL_MAX_SPEED_FDBK_RPM: (rpm) HALL_MAX_SPEED: HALL_MAX_SPEED_FDBK_RPM HALL_GetSpeed ( 0.1Hz) HALL_MAX_PSEUDO_SPEED: HALL_MAX_SPEED_FDBK_RPM HALL_GetRotorFreq ( dpp) HALL_MIN_SPEED_FDBK_RPM: (rpm) HALL_MAX_RATIO: ( ) HALL_MAX_OVERFLOWS: Speed feedback HALL_SPEED_FIFO_SIZE: FIFO FIFO Mar 08 54
+/- 90 STM32 MCU Mar 08 55
STM32 TI1 TI2 (4x) ARR (4*PULSE_PER_REVOLUTION)-1 Mar 08 56
MCU (Id) Ia Ib Ic θ I B I C I A θ -90 0 90 Mar 08 57
I_ALIGNMENT T_ALIGNMENT Id (i.e. Ia with θ=90 ) I_ALIGNMENT T_ALIGNMENT I (digit) = I(A) Rhunt A 3.3 V 65536 A V = 2.57 on MB459B Mar 08 58
Hall PID_SPEED_SAMPLING_TIME ARR PID_SPEED_SAMPLING_TIME SyTick ( ) 30u 2m 1.5% Mar 08 59
FOC El angle = 65536 Timer counter 4 ENCODER _ PPR* POLE _ PAIRS _ NUM ENC_Get_Electrical_Angle() Mar 08 60
MB459 ( ) J5 2-3-1 A B C J8 H1-H2 W17 W18 >0 OK ( TI1 TI2) < 0 ( TI1 TI2) tm32f10x_encoder.c 164 TIM_ICPolarity_Riing, TIM_ICPolarity_Riing); TIM_ICPolarity_Riing, TIM_ICPolarity_Falling); Mar 08 61
MC_encoder_param.h tm32f10x_mcconf.h ENCODER VIEW_ENCODER_FEEDBACK TIMERx_HANDLES_ENCODER: ENCODER_PPR: MINIMUM_MECHANICAL_SPEED_RPM: (rpm) 1 MAXIMUM_MECHANICAL_SPEED_RPM: (rpm) 1 MAXIMUM_ERROR_NUMBER: Speed feedback SPEED_BUFFER_SIZE: FIFO FIFO T_ALIGNMENT ( m) ALIGNMENT_ANGLE ( ) I_ALIGNMENT, Id (digit) Mar 08 62