一. TB6612驱动9 w* `. n% k: l! Q
下图就是TB6612模块的详细原理图,这里只对如何使用进行讲解,不讲解其内部原理
4 E7 D) B2 U7 q( Q* x9 @
E @1 H' n6 H, K6 D
3 L' L$ Q) c/ Q' I! S7 j+ J
6 G7 ^2 Q+ b- [1 P3 s
1.可以同时驱动两个电机AB.2.PWMA/PWMB为两个电机提供pwm脉冲。
3 D0 e/ }3 O3 P! |6 Z3.AIN1/AIN2,BIN1/BIN2.控制电机的正反转和停止。% _1 E: E: q+ i1 r+ V
+ L* ^' R& Q8 B; V N1 T
# y; B" z8 Q8 B6 F
1 f5 F. u {& s) B5 J
4.STBY可以理解为一个使能端口,高电平有效。. A1 g. L. ~7 z) Z: F) `
使用方法为 : STBY高电平,提供pwm脉冲,设置A/BIN控制正反转。
3 n0 x) R \6 X7 J9 `- ~& S2 C; K( o. M" m6 d7 Q
二. stm32代码实现% L$ y9 a* Z( v/ n2 k1 Z0 _
1. 产生pwm脉冲
, F0 G, r* U! `可以通过定时器产生,通过定时器可以产生四路pwm信号,然后通过设置CCR的值来控制占空比以控制速度的大小(和呼吸灯差不多)。7 i4 C7 P% L: h$ v- `0 L
, N% u' z$ d# e( h9 B9 e
- GPIO_InitTypeDef GPIO_initStructure; //输出pwm端口的GPIO初始化3 \1 U6 t& M; l. L
- TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure; //设置TIM定时器的相关参数,进行初始化9 U3 `7 Z2 u, q- G% G5 ^& e
- TIM_OCInitTypeDef TIM_OCInitStructure; //但是定时器通道信息
复制代码
& e$ o2 S# H1 M0 {" X* S* i' C! ~2. 初始化其他端口( p: z- T6 r; _& w3 r; n- m
剩下的端口就是普通的GPIO端口了,只需要对其进行初始化就可以了。
* z9 i! @3 D; p) ^然后对TIM->CCR进行赋值就可以控制电机的速度了。
( F7 Y# D& ?- O$ A/ s) U
6 X, W3 D( y$ I( t: v复用,JTAG失能等等这些根据具体的原理图来添加。8 i* X9 ]/ Z9 L/ p, n& g ?: o
5 J9 ]6 [4 `, n3 ^/ a完整代码
5 h( R9 u4 u5 _6 C8 Z, v7 }% H( D0 s5 @4 U* _4 A) C7 [
- void pwm_init(void)% W, z% j6 a* P
- {! s- ]' p/ i1 N9 f8 v: h
- GPIO_InitTypeDef GPIO_initStructure;
$ B% X i7 Z7 Q" m% @' J3 y1 ]% d - TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
) ?7 r3 v; L5 ]: k. e - TIM_OCInitTypeDef TIM_OCInitStructure;
# ~. ?/ f3 ]2 h6 W# ] - / I/ a+ @2 s1 N' K- l
-
5 t3 E5 }: a0 s% o& q2 [ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);$ J4 y$ v& L( f
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
( G% ^+ k/ _1 @+ G, |' u - * q9 l; }* M* k& f" g
- + e5 D/ d* }3 v# ^% \* D* U1 H- U
- GPIO_initStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
1 l2 ~* c. }6 w - GPIO_initStructure.GPIO_Mode = GPIO_Mode_AF_PP;& x, c+ p- { F
- GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
/ ~% e9 T* H: V& x, ?) a' t - n$ t, q6 }1 C& {+ b) _/ \: |3 l
- GPIO_Init(GPIOA,&GPIO_initStructure);
. d+ C w1 \1 P -
+ s- D& Q' I( X; \) R# ~ -
- } J6 T; X+ j0 h) h5 g8 v - TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
+ C* J$ R. \4 q - TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;( J! V9 H# r$ Q
- TIM_TimeBase_InitStructure.TIM_Period = 7200-1;
$ {" D; S' w# u$ n4 G" {' _, t - TIM_TimeBase_InitStructure.TIM_Prescaler = 0; P9 s- Z2 C7 S2 e8 x
-
9 R6 g5 P: n9 P - TIM_TimeBaseInit(TIM2,&TIM_TimeBase_InitStructure);
& U, w% f" I% X, h: t -
) }$ ^6 o4 n1 }) Q$ ^* Q -
; j+ b% s6 Q3 ^- B2 e+ i" a - TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; D* O. b2 s( G3 F* e
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
9 k& V: b( h- j* N9 h/ E: v$ ~* R - TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;4 e" s6 U6 F/ d
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;9 i4 r% c6 b' F d' P- w3 O8 b
- TIM_OCInitStructure.TIM_Pulse = 0;
1 U2 _' b0 P* D1 K G1 |. Z -
$ @5 j; C0 Q1 K2 P+ J - TIM_OC1Init(TIM2,&TIM_OCInitStructure);, a' Y5 h: h# N- Z% }( O
- TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);: G& S* g" F& |7 H
-
% F( | g* C# r* ?! N - TIM_OC2Init(TIM2,&TIM_OCInitStructure);* F3 ^" L* p4 y( X/ e& b
- TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);6 A) i. f z* W3 r( h
-
$ M$ M" @. k( C. i% [% q2 O - TIM_ARRPreloadConfig(TIM2,ENABLE);
9 r9 c/ i1 `2 [( |5 L4 l" e# W - TIM_Cmd(TIM2,ENABLE);. j& a. A+ m' w0 o+ M, q0 F' E& a. ^
-
) A# m% T5 x4 e; l -
( O* d6 Q1 m; s6 A% }6 b$ i! T - TIM2->CCR1 = 0;+ l; `! c0 W1 N, T6 X5 X l
- TIM2->CCR2 = 0;
9 e$ g, J( ]/ W* A+ c2 ~# f) ]( Y: T -
( i* {. W5 q! W9 X1 ] - }/ m' z3 x8 d$ P& [ H) O; G
8 J- x+ E1 z# w* k4 R2 ?) y- P- + V4 ?5 [1 v; {/ L! d
- 8 d Q: o$ {0 ]$ G1 b* s
- void driver_pin_init(void)
* m5 r2 D% S8 p* u7 O2 X- q - {' t, I8 l7 S# y/ J" {" g p
- GPIO_InitTypeDef GPIO_initStructure;
) p, G, i8 t4 T% b' _$ k; v1 t - , U% l4 L% l0 q( M, Y! k
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);/ p6 u( A; t5 H! v$ h9 j* K
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);$ {+ y7 l" T$ @/ t4 e: x! k
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);! g! R8 L1 e& j+ [0 N
-
- P/ P" P1 ]0 O - GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;
: @# A: f2 t, l! P4 Z - GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
6 v, W3 w0 r. O: l - GPIO_initStructure.GPIO_Pin = AIN1_pin | AIN2_pin;; d1 {/ c8 \' m2 @0 I
-
9 b. k+ r2 p4 N4 Q- T2 P - GPIO_Init(GPIOA,&GPIO_initStructure);
! `& ?2 Q9 S+ X5 r% k% w6 ~+ d5 A - 8 R( ?0 G4 D1 R1 ~1 r" C$ U, Y' r
- 5 ^) `% ]: x/ Z$ {% D; X. x
- GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;4 h+ L% h- [) j4 a. G( D! _
- GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
! c& c8 `7 n: Z: e6 x - GPIO_initStructure.GPIO_Pin = BIN1_pin | BIN2_pin;
+ i( u+ }9 m3 G0 M$ L4 { -
8 f( s) e) G# d+ f% y" _ - GPIO_Init(GPIOB,&GPIO_initStructure);- [" Q/ i9 K4 Y) R3 ~+ P/ i& h1 z# q' D
- $ o- y: }8 ^7 [/ Z& ]# L3 B: t! o
-
! [1 {0 b, ?0 v' ~' n/ ~ - GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;
! {2 P: |- _! S: }- k5 F+ F - GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;( y2 d3 S" u% ?8 F0 M& g! ^
- GPIO_initStructure.GPIO_Pin = STBY_pin;
) i) P7 g/ n3 |1 [& v! c& w' K - 4 p2 a; R$ P& x4 n9 X
- GPIO_Init(STBY_port,&GPIO_initStructure);. R1 ^2 W, n" K. ]( x1 H! k9 J* s
- ; K- c, k7 C* v0 [3 o% o' q/ x5 \
-
( D2 j6 E _4 @& C# I& U - STBY_HIGH;! [: Z, F( F. \2 u8 a/ _9 r; G
-
: o9 @0 y* _; q# [4 c, w6 O) E! L - AIN1_HIGH;
8 ^7 } ^; D% `* E8 w - AIN2_Low;
' W3 T ~/ ?3 W6 A9 v- V -
5 S) W6 y6 a" J$ d4 ?" p2 J$ } -
$ W, y/ l, w) T8 k - BIN1_HIGH;
# p$ W8 V+ f4 W( x6 c2 w - BIN2_Low;2 [3 A* ]3 g R
-
; @6 S* p/ }6 T& d! D" A - }- r9 K0 b. g9 U/ k$ d. }
复制代码 9 m; y/ k& U& a# e
$ {9 S, p2 Z; F& g! L
, r4 x; p _ z9 H$ ?! w0 t" d7 j- ]+ `- V# r
l' M$ Q9 A5 F2 q3 ^
|