一. TB6612驱动! A3 K+ q) M" ~4 @% @7 M( D' A
下图就是TB6612模块的详细原理图,这里只对如何使用进行讲解,不讲解其内部原理
" w( h p3 X) R$ s2 ]' e8 J! M! G# x& ^. K4 }$ @* ^1 M" |
1 e8 C5 R; ]; E* z
, N! Z' @- c5 F r) ^0 m T9 U1.可以同时驱动两个电机AB.2.PWMA/PWMB为两个电机提供pwm脉冲。
6 Y' T1 n( _0 w f5 m3.AIN1/AIN2,BIN1/BIN2.控制电机的正反转和停止。8 L" m+ P$ c, E' K3 Y
" }/ c3 Q, M2 @( N
6 s( D; [9 D" p
6 Z7 u6 e, \& k) D8 f7 H7 A& j8 B4.STBY可以理解为一个使能端口,高电平有效。
# U/ Q2 r3 J) U d. _使用方法为 : STBY高电平,提供pwm脉冲,设置A/BIN控制正反转。
3 w( K- Q. x8 U q0 g; ~( H/ u/ K3 t! U8 E5 w
二. stm32代码实现
( p/ _8 U. ?& U. d1. 产生pwm脉冲
: b% m2 g( o% w可以通过定时器产生,通过定时器可以产生四路pwm信号,然后通过设置CCR的值来控制占空比以控制速度的大小(和呼吸灯差不多)。. G3 |. ^2 \: ~
- e6 M+ U; f8 e* [: D; {& i1 K- GPIO_InitTypeDef GPIO_initStructure; //输出pwm端口的GPIO初始化& } E; O' F- G0 G
- TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure; //设置TIM定时器的相关参数,进行初始化, b. X D" N* @8 z+ K9 S
- TIM_OCInitTypeDef TIM_OCInitStructure; //但是定时器通道信息
复制代码
7 p, i& r4 Z7 l1 _* d" d1 S2. 初始化其他端口$ F3 O7 K7 z6 C6 J% V
剩下的端口就是普通的GPIO端口了,只需要对其进行初始化就可以了。
" {: t% Q0 X" C* Z2 W' S然后对TIM->CCR进行赋值就可以控制电机的速度了。
( {4 L5 ^# l) V5 F# X9 R
" Y% N$ t, S; L7 b, F5 \: f复用,JTAG失能等等这些根据具体的原理图来添加。
4 v9 s5 A( L( B* M* I. c4 k9 o0 K" N) p3 o& K
完整代码
% \+ N4 ^& V4 u, w% U, `* L1 v% ]& I2 L$ f6 S
- void pwm_init(void)
( g. p1 q# l- b' M - { @1 m8 @3 [. Z" N* E1 c
- GPIO_InitTypeDef GPIO_initStructure;4 L1 ?: G7 L" ?
- TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
7 t# k M' A# c# o9 @: |8 a7 } - TIM_OCInitTypeDef TIM_OCInitStructure;
1 o; m; t# |8 B' j/ j7 y, f - $ f/ E0 J6 V7 Q6 V# `+ ]+ G
-
1 w" g# r; p' o$ j! G - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);" ], H# R* J3 }3 e# r! g9 o- U# ^0 R) f
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
+ d) |' [) Z7 p$ @* r - : u/ \3 p) G7 o% k6 j2 K1 j
- 2 ~& v8 C6 m' {% o! C
- GPIO_initStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
+ q1 C1 Y6 Y% u5 z - GPIO_initStructure.GPIO_Mode = GPIO_Mode_AF_PP;2 U2 G; s0 j, r. \. |
- GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
9 ~* T r& i3 o2 k - 2 ~8 t2 Z4 O* r) t
- GPIO_Init(GPIOA,&GPIO_initStructure);" e, D# d4 S7 I* V r4 I0 v
-
) S1 j* n9 M2 C) S9 u8 G -
# w) f2 u) ]9 ` t2 m$ N/ m1 t - TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
; l* I- {& i0 J- ~) d/ q! D - TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
# D& k4 f. I8 ?4 g, M3 j, V - TIM_TimeBase_InitStructure.TIM_Period = 7200-1;! W2 `- l$ u' P# G9 m
- TIM_TimeBase_InitStructure.TIM_Prescaler = 0;9 ~+ s8 m+ N: j
-
U0 Q5 r# F; a% [ - TIM_TimeBaseInit(TIM2,&TIM_TimeBase_InitStructure);
; |( P: e9 e( J0 S% Z6 w; W& J -
i s5 F8 y7 F8 r7 A! [3 w2 J - ; i; V, \1 c: }! H5 ]/ \3 x _5 p
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;! c0 P; r! ]. X) D: b0 U5 ~2 g5 @
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;8 s2 |; s8 u: z& v/ a
- TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
1 r2 Y! B F% `* v - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
8 _# b# r2 x5 v- w1 B - TIM_OCInitStructure.TIM_Pulse = 0;
2 [' ?3 S1 `! W! I: a. I8 M* B - ! Y) c! y; D. G
- TIM_OC1Init(TIM2,&TIM_OCInitStructure);1 C, ?5 E1 p' {" H
- TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);/ H! \7 J( N1 z5 n1 Q6 W
-
" F" T9 d6 E R6 ~$ r - TIM_OC2Init(TIM2,&TIM_OCInitStructure);
4 |& ~# N0 a! u - TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
7 l4 k' W& j7 d0 ]2 [* n6 m6 H -
% F P4 ^1 n' M! ? - TIM_ARRPreloadConfig(TIM2,ENABLE);
! p6 p: e' R# q - TIM_Cmd(TIM2,ENABLE);- r' e/ Z! C) p, [5 l3 l' ^
-
# X& H0 y6 ]& A4 e. [ - 1 |& G$ k6 X5 l! h
- TIM2->CCR1 = 0;
& X( t! R3 s6 B - TIM2->CCR2 = 0;
T2 U: W4 `% T* Q, g! E - ! a- T. z4 u) p. P# ~, F0 Z
- }$ w( Y) R" C/ @) b
- % z- {) o1 u* v" L, X% U' Q4 K
- 2 l& f8 G/ C4 z" I* x8 C, @/ C
# x) T% o- s! t" N4 [. N- void driver_pin_init(void). W& |0 ^6 k% w0 L1 c# {8 p( B! I
- {
2 f+ `1 l9 h6 A8 r - GPIO_InitTypeDef GPIO_initStructure;4 {+ H( u0 m7 p, |/ T' F
- $ w' }7 l6 h R9 ]
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);" G* v9 b+ h2 A
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);; Q. ]/ a6 O9 _4 v; S% o+ S/ o
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);. }, E9 H8 O, c/ N* D
-
# h# Q6 `3 y* d. _- K" v: N8 w - GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;8 ~2 I5 j# d2 M! \
- GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;. e7 L1 ?2 v: Z
- GPIO_initStructure.GPIO_Pin = AIN1_pin | AIN2_pin;4 g1 q& c- n, q' |# c4 Y, C1 S
-
' b/ ]3 C. d( R4 l - GPIO_Init(GPIOA,&GPIO_initStructure);
# {% ]& o" T, f& \) M1 p' C - ' ~' g( a- l/ N/ F
-
, E7 C, k7 J# ?6 `' ] - GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;8 J( }9 K4 `" Q- z/ I J8 r% e3 B
- GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
0 u# N4 M/ W% { - GPIO_initStructure.GPIO_Pin = BIN1_pin | BIN2_pin;( i9 \ a- j* K$ J5 h7 k* g' p
- 1 R6 ?3 K8 ^+ N5 d! P2 N& M* d
- GPIO_Init(GPIOB,&GPIO_initStructure);
7 G) R* }) B* z' @6 Y& y* s - ! i) L, N# e9 E& M
-
8 l! k1 Z6 A# v4 H% Z: _ - GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;
7 A; M- C5 M& | - GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
/ M2 z" {3 c, H( r0 G$ e$ I8 @ - GPIO_initStructure.GPIO_Pin = STBY_pin;
% |8 y: X5 r6 }" Y* A -
& |8 o \7 B# O0 d! {! |% L0 i - GPIO_Init(STBY_port,&GPIO_initStructure);
! L( n) B9 ^+ Q- x - / g1 ]# J% e5 E9 j" C4 C
-
( C u8 A( R6 Q - STBY_HIGH;
4 o, Y3 l+ D/ P t9 z2 o, N - " n1 \- D" L+ ~3 l1 o
- AIN1_HIGH;
* d% y7 g2 N: @: e( R - AIN2_Low;
$ e3 ]9 \- k% M" Q' G -
9 ?/ c0 K" ?0 X3 {; _ - 1 j: X+ J# c( M6 U. N
- BIN1_HIGH;
7 T- o7 t1 d3 k4 F6 k# b, w - BIN2_Low;6 N3 m2 x* C5 H$ ]: I
- G, Q$ X3 M" o/ v6 i! r
- }
( h' G- Z& P% Z |9 |7 B% p6 c
复制代码 9 U" |! B D1 w' k$ ~3 V0 a
8 L: Y! w6 [& o C
' Q( ?8 Q# u9 c) J
3 k5 p2 y6 f; G. [4 \" E
! d3 \' t/ H9 Z% e |