一、STM32F103驱动无刷直流电机基本思路7 W) v- t7 p$ D
无刷电机控制是基于6步换相法如下图所示:
6 ] _! a! M$ i$ K9 b0 P0 w, ~# f# |
4 |! b/ V) f9 r/ c& ~0 q2 w
$ c5 `" ]& j+ p$ Q7 Q0 I
' C3 T! n$ A. D二、STM32F103驱动无刷直流电机方法介绍
6 U$ f2 k% X9 c" A/ e通常我们用的方法是使用高级定时器3通道互补输出去驱动mos管,用通用定时器连接霍尔传感器去触发中断,在中断中换相,基本原理如下图所示:8 N' l* a' {7 U4 L
/ V! m% u' H0 E/ ]9 v) D: f* u% X& K3 `8 \/ J) V
三、驱动代码编写+ n! Z9 u1 L% H8 ~2 p* [* K3 a
+ }( M* }1 l; _0 m# e. _; L d! O
- /**********************************************************************! |- l( C, c3 l5 V2 W2 C
- * Description : None
: o0 `& v9 t! E! M1 H* z - * Input : None0 D. M, b' B0 r0 v' g9 z
- * Output : None
8 E( i4 d% G' g- j - * Return : None
# X7 i! Y2 {; r+ w' ?; U+ t) s: t - * Attention : None
% z* r1 ~5 ]' [3 t* @- ]" U. C- I+ X - **********************************************************************/6 b8 K( h4 r$ t5 } f( t, Q& d; P
- void BLDC_GPIOConfig(void)8 V' g- s9 F6 {* \" N" D
- {
4 `! F- C( o8 D% m - GPIO_InitTypeDef GPIO_InitStructure;+ P; s! v* H9 |- O" F$ X; E
-
$ q( L8 k0 N! L - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //TIM1输出% C/ g) t. B( D5 v8 V. j' Y- H5 q
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
3 C# `6 g' c" o - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;8 U* \6 Y! M& }0 W# z: ?
- GPIO_Init(GPIOA, &GPIO_InitStructure);
* T) l( f& `1 ~; J3 t4 [& C: E -
3 V& L1 F8 y4 u+ P - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//TIM1输出' ]- j) n- x/ K3 I6 f
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
# A+ \8 q$ c6 r; i8 ` - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;' x# P" N- W6 R' u1 z
- GPIO_Init(GPIOB, &GPIO_InitStructure);# U9 C3 L! p2 a8 o7 P
! ]6 h5 f" l) U4 j0 l. t- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //TIM3的霍尔输入6 M* k# c/ q2 C/ v& E
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; O2 T7 W- Z% _9 e
- GPIO_Init(GPIOA, &GPIO_InitStructure);
$ G: ~: @, X! y6 D
1 `( A. H# C/ ]6 Z0 ]- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM3的霍尔输入
: j+ s) {% ` Y - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
6 y [7 M: \; [$ X7 C6 C - GPIO_Init(GPIOB, &GPIO_InitStructure);
/ c2 G, x8 d# P& } - }
2 s5 a- x4 e8 U) J3 j% B0 k% o$ c' p9 v - /********************************************************************** e3 L5 R; |8 o6 |( Q, U2 t
- * Description : None
) J$ D5 [$ q8 T6 f: ^) ] - * Input : None' r# w% r9 C1 y* O4 c; u+ }
- * Output : None
1 N7 d& F/ e' d+ \. b2 I7 R0 M( d - * Return : None
- t( E Z' d* J! W4 l - * Attention : None$ E( f- a/ O" a
- **********************************************************************/4 _, Q7 t3 y2 e' S- B4 V* H
- void BLDC_TIM1Config(void)1 X. A5 b' P& ^. z' Y
- {
6 h o- B! |0 P9 O6 S7 h% U - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //基本结构体变量定义8 |5 z0 ?! p3 }; v
- TIM_OCInitTypeDef TIM_OCInitStructure; //输出结构体变量定义7 ]9 y# ?! m1 t5 R4 k! _* p
- TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //死区刹车结构体变量定义9 ~$ a7 n4 Y3 P' H8 O# n
- 4 h1 v( s2 }' e' a" `2 h1 y
- TIM_DeInit(TIM1);
! _! c( n) x1 Y" Z2 S0 W. J - " M9 M* c7 _6 t+ h# f$ P/ d5 j
- TIM_TimeBaseStructure.TIM_Prescaler = 2; //TIM基本初始化3 C$ p0 T0 @0 S- Y& z, G
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2;//中央对齐计数模式
& @- O1 E/ ^' c* Q6 g0 b - TIM_TimeBaseStructure.TIM_Period = 1499; //PWM 16K
5 X8 e% Z3 m2 M) R" K9 b" B - TIM_TimeBaseStructure.TIM_ClockDivision = 0;
2 u+ n$ C) Z8 v/ h4 l0 X4 N4 J5 {8 ^ - TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;3 w( E& N+ T4 g- [; m
5 i. G3 o" i8 r0 ]: S( H0 @- TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
# [2 W" Q& r: F6 {( g - ) c/ h) s! T; v
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //TIM输出通道初始化% n. h3 s( ~( Z! x
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; ' ? G# D: R4 B: l. ^/ ^
- TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; , q- U6 l; V" y" e$ P7 r1 P
- TIM_OCInitStructure.TIM_Pulse =1200;
7 E& ^6 ]! D5 h4 _ - TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; $ x, i9 D$ ]( V- B0 |4 R
- TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; # _" ^) }6 p" j7 r3 x0 {# S
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;$ @( x9 F& Z1 V3 a% }
- TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
5 K. y5 ^$ p/ U# ~$ L
: K) ?0 ]# s$ e9 p1 m3 m* [- TIM_OC1Init(TIM1,&TIM_OCInitStructure); . T: y/ z# v$ V+ N3 J9 s- {
- V& ~ D" ^3 Z3 V
- TIM_OCInitStructure.TIM_Pulse =1200;8 r8 [7 j* ?& K, r0 I- D% K5 h
- TIM_OC2Init(TIM1,&TIM_OCInitStructure);, A& F4 y; E9 @7 J2 G2 u
- # t- s: s6 b( [6 y$ J
- TIM_OCInitStructure.TIM_Pulse =1200;
* P0 t. B* d/ {# k) f8 ?# \ - TIM_OC3Init(TIM1,&TIM_OCInitStructure);- d) b7 m# N& R( x
- 4 s: W( R& J) U/ l3 M' S# v
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //TIM输出通道4初始化,用来触发AD注入采样
: ^. r. T, u+ L$ A - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; 8 e. [* d! d8 ]# d! r! d! u
- TIM_OCInitStructure.TIM_Pulse =1495; " X- j& _# Y; ~* E& k
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; * @' s# i; Q6 l( [+ ]$ _
- 3 t# Y0 e& e) e8 p" r
- TIM_OC4Init(TIM1,&TIM_OCInitStructure); $ N( W% h. K V9 w& m7 t
1 O/ Y4 `0 C$ \3 d/ `0 a) s2 Y i- TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; //死区刹车初始化2 B' \; y: E& W+ O7 Q7 h
- TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;# b& \/ K W6 J; l% a5 w
- TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
2 V" o2 z; {! o1 O - TIM_BDTRInitStructure.TIM_DeadTime = 100;
( N3 x9 i, [7 X& s0 \ - TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //如打开,开机无输出且状态紊乱????9 _* W7 t# {7 }7 x( S0 S
- TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;& U) p/ F5 @; B5 v4 S# s; ` H- |
- TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
# q) B s8 r: a) X# {6 B - % q) b h0 d9 q' {& E2 @1 k
- TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
0 k+ l# _0 _( V2 N2 m - ) s, n0 `+ Y5 Q2 l
- TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //使能捕获比较寄存器预装载(通道1)) @6 n- |8 y6 o) ?
- * r1 Z: Q6 R O- u2 T& O
- TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable); //使能捕获比较寄存器预装载(通道2)4 \8 Z' j0 K* F2 H- r% H
- ; i7 y2 ], ^- B4 _, h! i4 q3 _) s
- TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable); //使能捕获比较寄存器预装载(通道3)2 p4 i, `, _3 F F9 w$ B3 a( {
- % k& g: S2 z4 M. L
- TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2); //输入触发源选择TIM3 / S# N4 ]9 K1 A7 J& Q
- # y3 b; T, u& V" D$ j" U8 j, I
- //TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);//从模式选择 触发
( {5 ?/ V0 G; w% d6 W0 N0 { - ; Y1 q, x S! K. l% [$ ?
- TIM_CtrlPWMOutputs(TIM1,ENABLE);
# ^4 d1 N y# ^) p - 3 M" I; g+ | m2 q9 D/ U5 h C7 c
- TIM_Cmd(TIM1,ENABLE);
% b! I& P* a, p2 s5 a - }
% q) v# e8 f1 p1 v7 K* n - /**********************************************************************
' H3 s1 W: W( m' X+ N. _ - * Description : None; M1 i h- [& y+ S! t( V9 V9 b
- * Input : None, B7 [% \/ J- f4 T: Q w0 V
- * Output : None
- S3 X2 f1 ]0 j& P! I5 `. L0 Z - * Return : None* {; t _* I% J. b, W+ f. `
- * Attention : None; m, I* d. }* y3 }
- **********************************************************************/
" J a5 n7 ?9 A. T0 [1 u - void BLDC_TIM3Config(void)
: b( _: {5 Z% L0 T9 _7 R - {
8 Y* d6 W0 k8 u) i0 X6 _ - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //基本结构体变量定义
, z+ ]& u% A& q6 F- n. i - TIM_ICInitTypeDef TIM_ICInitStructure; //定义结构体变量
: o& j/ t4 d- p4 [2 V$ ^5 H - TIM_OCInitTypeDef TIM_OCInitStructure; //输出结构体变量定义$ ^/ z$ N$ H: J0 i; e
" |& n' G) ^- q/ J8 F) H6 y: w2 m- TIM_DeInit(TIM3);" p, {& J7 F+ F; G! K6 P
- 1 J0 A. P; Y* O* U, c
- TIM_TimeBaseStructure.TIM_Prescaler = 71; //TIM基本初始化0 N3 R4 G0 u1 m3 |$ o8 y! f
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
# T$ r) o; t" O8 v - TIM_TimeBaseStructure.TIM_Period =65535;
! F. Z6 ^+ }+ w6 v) R - TIM_TimeBaseStructure.TIM_ClockDivision = 0;* ?) ^9 u2 M% v; X. E2 R9 D
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;3 a; X6 Q1 r( M4 G$ ?1 H7 k
! g: M9 P. u" G* y3 E1 A- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); 1 k" j; J: G& s' |8 f6 x$ z; E
H( O# }! ^& \' x, a' N R) D- TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择通道14 q6 ]# A% L8 y" S1 u8 N5 a* X' v
- TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
# g7 S, q: v7 ^2 K - TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC; //配置通道为输入,并映射到哪里5 J; m6 t* l0 R1 F' {/ \# K" p4 K1 m" j
- TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入捕获预分频值. @! y- p# k+ K5 d( G
- TIM_ICInitStructure.TIM_ICFilter = 10; //输入滤波器带宽设置: w# T( `9 \ O/ P
$ B6 h" U; ^. G2 @" u5 Y- TIM_ICInit(TIM3, &TIM_ICInitStructure); //输入通道配置
& Y# i; X/ Q1 v& r
2 e9 o, H4 R/ A1 ?- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //TIM输出通道初始化 c" ?% f# s- [& R" L3 T
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; $ \; r5 v& F' y% q* N/ i
- TIM_OCInitStructure.TIM_Pulse =1023; , t: y/ q7 Q+ e$ J' p( o
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; . S* ?* y$ H* ^9 f6 P1 L/ Y
- 3 _0 d. F$ \( T- S6 ]
- TIM_OC2Init(TIM3,&TIM_OCInitStructure);# i0 j' s5 f- Z
; M* C& K- t' H6 R, E4 ]- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //TIM输出通道初始化* e8 t( O c7 H$ v4 H
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; 2 [) K7 A: W/ m
- TIM_OCInitStructure.TIM_Pulse =65535; * {5 Y0 s2 m3 h7 \6 `1 U
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
W6 p) g/ |5 Y7 b) m - + M2 q: [& T/ F7 m$ m" ]# ^
- TIM_OC4Init(TIM3,&TIM_OCInitStructure);
5 _ t, w l' j( b2 C, X$ L - 8 z, N; U% Q) Q+ {% x3 V5 \* e
- TIM_SelectHallSensor(TIM3,ENABLE); //使能TIMx的霍尔传感器接口
: o* y1 n! j& `1 B' y. _% N
8 t [$ I5 \! p- TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED); //输入触发源选择 3 A7 K$ @1 t) U* C$ \0 l, k
- / K2 j" L4 f8 M* \! r, m% i
- TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); //从模式选择- E* z& ]- O$ V/ d
4 f T0 s8 D& G# H; `- TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主从模式选择
( O6 G# f: ?! {. k% e - 5 G0 S5 ^7 X/ m/ `+ i' G
- TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref); //选择输出触发模式(TRGO端)
5 m4 w) C% q; P# A% ?" k |4 q
( \1 G# w* `8 W0 I m; d5 X- TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE); //开定时器中断
5 W4 z8 Z' _6 o+ ? - //TIM_Cmd(TIM3,ENABLE);4 X) L- ^( s/ F9 T3 v7 v$ _/ b
- }
$ |3 R' ]* W2 W$ _0 V - /**********************************************************************
- q$ |9 ` D% J9 V$ T4 x+ D! O f - * Description : None
* _ d- w* q! @0 ?& w) K& l( P - * Input : None4 z- W- n; X" |3 }2 T7 K
- * Output : None
! {6 E1 _4 k d. q - * Return : None$ F2 B. S7 N5 S% A. S
- * Attention : None7 Z! h% S& q+ J4 O, L8 H: f, E
- **********************************************************************/3 y0 q+ }8 S' W* B3 L
- void huanxiang(void)
+ C& R! ~" s6 w8 C - {/ |( | n* o/ ~% d* g7 r- x. h
- u8 irq_zhuanzi;
3 Z% ~( i0 S c3 u1 d M' K5 Y - 7 |% [' T, E+ O* q; q) A @8 a
- irq_zhuanzi=(u8)((GPIOA->IDR&0x000000c0)>>6); //读转子位置$ p7 K# w! _; w5 D |8 t4 J2 i
- irq_zhuanzi|=(u8)((GPIOB->IDR&0x00000001)<<2);
) }4 H0 d* f, o" Z% }# [ n7 S4 a - if(zheng_fan==RESET)
7 U0 T0 {+ l: I8 O, z - { //正转3 W- O2 C2 I# L# r6 ^; T p3 Y" l9 D
- switch(irq_zhuanzi) //根据转子位置,决定CCER输出相位和转子字偏移量! H' S1 J7 |& B4 f
- {- W! j6 @2 T0 [ F! u0 E1 x& w5 |! u
- /* case 0x01:{ % r+ r2 e7 Y& h1 r! M& K/ m! C( |( g
- TIM1->CCER=0x3081; //1,4
3 u$ b! M; N7 w' n6 |8 E8 i - };break;
: L0 F# p$ ]& O, w" m0 j - case 0x03:{5 J& C& @! Q% w% Q/ R
- TIM1->CCER=0x3180; //4,5
5 [6 k* V" E P5 Y- ^( v - };break;
/ x+ Y+ q4 |7 {* I - case 0x02:{% O# G b9 ~1 h# F4 Q
- TIM1->CCER=0x3108; //2,5. w, L) _( A3 c6 p* }0 l9 n! |; w) R
- };break;8 T1 ]4 b6 L8 [
- case 0x06:{
, p* r9 V* u* ^ U - TIM1->CCER=0x3018; //2,3 1 d, n; _/ Y+ Q) P* p
- };break;" q V9 k, Z' k$ _% q9 l( L
- case 0x04:{
% Q3 x! ~8 M% R: E+ H) ] - TIM1->CCER=0x3810; //3,6
/ R! T- p$ F/ G, f - };break;, t: s3 m* Q1 \, f
- case 0x05:{
. O* o6 I X+ L: J$ _ -
' e& h" S! Z" z; ?, e) h6 P - TIM1->CCER=0x3801; //1,6 ; W+ a& m) y0 `' P W, E
- };break;' ?9 u/ ~8 T4 X8 H I
- default:break; */
" I) P+ a2 i- X4 q: Q8 ^ - case 0x05:{ - x l1 i1 E- B: \ c2 k8 R
- TIM1->CCER=0x3081; //1,4" V4 P6 ?3 _' k' O" c
- };break;: G3 m% M0 E1 d9 Y( E: S
- case 0x04:{
# f- r m0 }! v# }) z: A9 q - TIM1->CCER=0x3180; //4,5
6 V) l, C9 h/ F( f - };break;
. X2 R( N- n2 v: A) \$ |0 \- u2 } - case 0x06:{
( V5 L# z; V$ L( S% J2 s, @ - TIM1->CCER=0x3108; //2,5
; S1 k; j2 O* {- i# t - };break;! }! s. K# S |4 X4 Y# o- k
- case 0x02:{& A' t2 j* K5 ]' u$ g6 E A
- TIM1->CCER=0x3018; //2,3 2 n! D4 H" U$ f0 X! Z6 H
- };break;% W# P1 J( X7 y3 t5 W
- case 0x03:{1 D! n' P6 w- i% M6 p4 p# k
- TIM1->CCER=0x3810; //3,6
1 ?2 A6 V; w* O' Z" S: z2 t - };break;6 ] w/ I9 G u) ]; b* Y" G
- case 0x01:{. E# \6 g: P. K# d
-
! z) D4 z+ z% v& V. \" w - TIM1->CCER=0x3801; //1,6 # I9 @2 f9 ]0 A4 R. U
- };break;
( G I' ]' ~; i2 A' C$ S# V6 h% G - default:break;& J; x0 S$ L$ N" t, L& H
- }
% [2 ~) v) S( {1 L& U8 x. E - }7 x1 D* f! W& m9 E; d1 A# R# V8 v/ R
- else
/ R U4 }- o1 C. M9 ~" ` W. O - { //反转! H. b6 D7 s h
- switch(irq_zhuanzi) //根据转子位置,决定CCER输出相位和转子字偏移量0 r) Y* [: d, Y
- {
: ]( b6 M* O# e; z - case 0x01:{
! ~7 w( w) n8 e - TIM1->CCER=0x3810;8 \ {2 Z. v4 S: }4 ]' ?2 Y
- };break;0 E( l& N; ~+ `* K
- case 0x05:{) |0 u' ?0 n# s6 A9 a; E" Y m7 K* `3 }
- TIM1->CCER=0x3018; ' k1 l# p- V) l; k4 M L
- };break; # x L* A3 o3 K2 t5 z1 U, n2 S8 h
- case 0x04:{6 z- J. k2 ?0 Z
- TIM1->CCER=0x3108;
- E. J! y/ `8 q' k5 u, n, ] - };break;3 r4 d+ R: T& N
- case 0x06:{
- g/ P: H8 ]- G1 \2 N0 l - TIM1->CCER=0x3180;
' i% ?# y. f7 c - };break;4 m: W5 p4 p, ]* C' S3 y& N" ~, p
- case 0x02:{
. v% C0 L6 B( T9 W4 ~9 F6 d4 {! \ - TIM1->CCER=0x3081;
2 q4 P4 h, K5 a1 }" f - };break; o) a/ H, T" G& \! C
- case 0x03:{
; `& m6 ]8 M7 { - TIM1->CCER=0x3801;
: J7 c% _7 f) y1 u5 ^ - };break;
; F9 i3 s& R& ]# o - default:break;& }: p4 W- I0 g0 b0 p9 d
- }: {, h8 u' w6 ~
- }
2 P5 y* t. W' _8 R0 Z - }. X3 s1 b$ r+ m( W
- /**************启动******************/
9 D( S6 u5 S: z1 a7 R0 a" L G# W - void BLDC_Start(void)& j' L0 x8 w y) R
- {8 [0 ?" W& c( r0 X5 n
- TIM1->SMCR|=0x0006; //开TIM1的输入触发 . \- x0 i, D2 X1 i+ e6 }7 g
- TIM1->DIER=0x0040; //开TIM1的触发中断. G1 T% p3 T/ Y( } W+ V; V; c
- huanxiang(); //调用换向函数,启动
5 x. D+ } i! w$ l2 v* C0 s& z - TIM3->CR1|=0x0001; //开TIM36 m/ X$ D B" _: t
- TIM3->DIER|=0x0050; //开TIM3中断
6 S% v" f- m4 _0 y0 i# A' _ - }5 C6 v5 H S7 F
- void BLDC_Stop(void)
+ ]$ N: D7 y! z4 d( b - {3 C1 b5 r7 \+ f* ~1 W6 w
- TIM1->SMCR&=0xfff8; //关闭TIM1的输入触发5 G0 V, ?: Y: H8 o% C
- TIM1->CCER=0; //关闭TIM1的六路输出& R: I+ \5 l# _
- Delay_us(40); //延时(加死区)
: D' r* s5 H3 @ - TIM1->CCER=0x0ccc; //打开三路下管,进行能耗制动
* D. i; O2 [$ G# v# ^9 j, Q* T - while(stalling_count<1); //等待电机停止(TIM3连续溢出10次,即认为电机已停转) ) }. Q! J! T( Z+ W3 y
- TIM1->CCER=0; //关闭TIM1的六路输出,关刹车
! U: m* {/ [, ~ - TIM3->CR1&=0xfffe; //关闭TIM3 : R) G- ?6 z' U# `: ]% ~
- TIM3->CNT=0; //清TIM3的计数器
" O; y0 s; G: p' o G' e2 _" r - TIM3->DIER&=0xffaf; //关TIM3中断1 Q, S1 v9 Q5 F% C* f
- }
$ z8 w9 ~8 E( ?7 Y - /**) Y/ W2 R- ]8 C9 z: V6 |: B I9 r, J7 |5 j
- * @brief This function handles PPP interrupt request.
( k+ [6 }( ^( e0 b+ P, } - * @param None" K/ f0 `) Y) |" b7 z% g4 g3 X
- * @retval : None* J- ]! e; H0 W+ S7 ^# W
- */7 [ A u2 [; B6 q& c; _
- void TIM1_TRG_COM_IRQHandler(void), F. S) F6 @% a
- {
9 ~- M2 A( M, |9 h; h - TIM1->SR&=0; //清中断标志
( z) k0 w' X& z; n# j$ E
- q, q6 [" W/ {. s$ S3 j- huanxiang(); //调用换向函数
, w: e; @4 a2 ~: d9 L& R0 a - }
复制代码
# O+ s5 V# n1 ?0 d+ |! M4 B, ?" C& n0 a1 W6 w4 R% b) k' i
|