一. TB6612驱动' b- w9 ^, k3 h4 C7 u8 K% Z% \
下图就是TB6612模块的详细原理图,这里只对如何使用进行讲解,不讲解其内部原理5 Y# J* W3 x2 u. j- R0 \
* u, o E! c8 n% Z6 @' A
1 M4 N9 I+ d7 R m
" r V+ t; s7 I$ A' I8 N1.可以同时驱动两个电机AB.2.PWMA/PWMB为两个电机提供pwm脉冲。
' Y& k( u& L: g" ?( _9 B) D( L3.AIN1/AIN2,BIN1/BIN2.控制电机的正反转和停止。9 `) t# u2 J- \( N
7 F q% c7 M" N; d8 ?6 g! O
0 d/ c0 i8 ^0 u) k: z
: o& a) s+ B6 r! b5 P9 t3 n. [
4.STBY可以理解为一个使能端口,高电平有效。+ D3 l& a2 ]9 X9 }9 a- d
使用方法为 : STBY高电平,提供pwm脉冲,设置A/BIN控制正反转。
! ]) L" ?" z6 Y$ @( }3 J: _% f, r0 j J; N7 L# C* u- ~: `! Y
二. stm32代码实现: H! D- ]. \+ C, [$ g6 N
1. 产生pwm脉冲) b3 I! {& B1 f) A4 ~6 z
可以通过定时器产生,通过定时器可以产生四路pwm信号,然后通过设置CCR的值来控制占空比以控制速度的大小(和呼吸灯差不多)。( s6 l# L( u9 x, S
, f& Q' |5 Q5 O* _9 B" B- GPIO_InitTypeDef GPIO_initStructure; //输出pwm端口的GPIO初始化7 p* c- J) ~$ W' V' `
- TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure; //设置TIM定时器的相关参数,进行初始化1 x# W$ j# x2 r7 A( n
- TIM_OCInitTypeDef TIM_OCInitStructure; //但是定时器通道信息
复制代码 # `! K0 i& z. F# M9 p! _
2. 初始化其他端口
% ]& c8 l+ @5 T1 D4 d剩下的端口就是普通的GPIO端口了,只需要对其进行初始化就可以了。
7 d F1 [: z- n% e* O然后对TIM->CCR进行赋值就可以控制电机的速度了。7 V6 e( S$ m6 f# f, I& F# m
8 R8 v" Y5 {3 I# A% T( Q: Z
复用,JTAG失能等等这些根据具体的原理图来添加。8 ^9 N# L5 H% X& U5 v
* K4 i& q7 {* i
完整代码
% ]6 X3 F. r) L5 j$ y7 a
) a# h4 s+ P$ Z* k7 C8 {- void pwm_init(void)
8 X- ~4 R7 M- ]1 j - {
+ r! j! X; |" Q, R, n* J# ]+ C, r - GPIO_InitTypeDef GPIO_initStructure;4 s0 w3 C: K* a' X3 R
- TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;- T7 f! ?2 n: U! o3 n
- TIM_OCInitTypeDef TIM_OCInitStructure;7 i) T7 H% t2 m4 ?
-
5 D6 S3 O/ g9 A! L( Y/ q* R0 D/ m - 4 N' y, y+ w% b2 d) S2 P4 S2 L/ [
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
& Y/ U* ^5 E/ [9 v0 P - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);; {/ d: ^/ u1 z7 D* {' A! V) Z+ l) ?
-
8 f8 |2 _8 C* E3 u - 0 H/ ]* N% F" @3 {5 ^5 n
- GPIO_initStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
4 u! g& n6 y- O - GPIO_initStructure.GPIO_Mode = GPIO_Mode_AF_PP;
( {5 w( \, j, O - GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;& o" n7 l! ~3 A- K" @
- , [8 J% ]7 ~( O8 s- q2 U: I
- GPIO_Init(GPIOA,&GPIO_initStructure);# F; r; ?& Q+ P5 I! A4 N9 m
- 5 l$ S* h0 X1 Y, k: I
-
, i J4 _' q% E* d1 Q* b9 W - TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
( [" G: \- m# ]+ N8 {; h5 W+ _! l - TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;' @% P# m8 |! L" S+ n3 k+ e' s {
- TIM_TimeBase_InitStructure.TIM_Period = 7200-1;
/ i- A. _* w) S4 d" M% O; i8 W* |2 }8 m/ H - TIM_TimeBase_InitStructure.TIM_Prescaler = 0;
- l6 N" ]5 U4 \' `4 R; f4 [ - % u2 z7 H! M' u# d
- TIM_TimeBaseInit(TIM2,&TIM_TimeBase_InitStructure);4 F9 E7 n7 k3 ~) e8 Y, y
- " e3 t5 w+ Q6 V j/ I/ w7 d
-
! y4 s0 u# Y, c- F% y+ {+ L0 B. N+ g - TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;9 V% F/ x9 k1 @$ z# K4 n h# F
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
' x k$ G) m7 t8 i$ G - TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;5 _ \( o$ ~0 Z9 i# @4 b& {8 B
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
& {* g( N0 {% P. I" g4 \ - TIM_OCInitStructure.TIM_Pulse = 0;
" O0 ^; i& |; C+ v -
. v7 a) H/ T; L$ E1 r9 u, I - TIM_OC1Init(TIM2,&TIM_OCInitStructure);$ c4 ^8 R# R5 P7 C7 Q' T* T
- TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
" N, W7 f3 Y' x( t, x - & a, g0 y& S! p: G3 x
- TIM_OC2Init(TIM2,&TIM_OCInitStructure);" w3 }* D7 N; b5 [) y
- TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
4 ?6 u; I( [" V2 A B - : O! B* r1 b H* w& f& l. i! }! N
- TIM_ARRPreloadConfig(TIM2,ENABLE);
1 i1 ^+ g) c, _' u+ B, ^% K, ] - TIM_Cmd(TIM2,ENABLE);" y( q6 B8 d9 f( t C1 U1 \: J
- 2 o0 E4 X8 j/ w% Z) d9 r) P+ G
- ) b* d3 @1 ]0 w2 N6 B: @+ d
- TIM2->CCR1 = 0;; P* F1 i( c W9 L- ~1 g
- TIM2->CCR2 = 0;8 U/ s: w1 m" e2 [+ y4 ~# M0 E
-
/ H, ~1 Z1 f4 P3 s - }+ |1 |9 r! J4 Y! z+ Y: H0 ]7 B
4 t, Y* D- m+ t1 Y$ V- 1 m1 Q7 V' Y) S4 n5 Z
- 4 a- B4 g% y. G1 B6 R3 i
- void driver_pin_init(void), h" b5 o8 s) N: j
- {
! l! f2 ~3 ^) D: ]7 [( X, p - GPIO_InitTypeDef GPIO_initStructure;
2 |" k4 O* [0 q5 h2 Q: d -
! {% Q9 W5 j' J$ ]1 K# T/ U - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);% w0 C9 r$ \" G9 x) E! i
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
; |9 F$ Z! [- T/ w - GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
# q0 j" i$ M( e) D. R$ x - 4 a2 D+ f2 k# F2 V" @1 j8 F8 Y
- GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;9 f. {+ t9 J8 q. l3 P
- GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;3 A4 \7 z" [5 s
- GPIO_initStructure.GPIO_Pin = AIN1_pin | AIN2_pin;
! b. i( C2 p3 g( x' i! W% v9 } -
7 h9 b s1 Y/ l* ? - GPIO_Init(GPIOA,&GPIO_initStructure);5 x n0 L4 ^1 w( ~& E
- - A3 M- h5 @9 X9 V, z/ D+ w
-
0 c1 Y% `5 g1 } v# i - GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;$ i4 q7 w3 o, s, f
- GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;, X8 D4 ~4 A3 [: e/ Q
- GPIO_initStructure.GPIO_Pin = BIN1_pin | BIN2_pin;
: L+ Z, v3 T8 I0 c: t - ; ^7 F* b' ^& M7 t
- GPIO_Init(GPIOB,&GPIO_initStructure);" \5 W% ^' P( K" g9 j
-
$ i1 b; G7 G% J v/ `& `5 O- ? -
6 f$ {% p8 S$ e! T. P V' d% q - GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ |- p+ `5 g3 Z - GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
" _+ y7 [" H9 b7 O - GPIO_initStructure.GPIO_Pin = STBY_pin;: r+ H7 R# h4 N, v' f
- 3 x, F5 I, a+ ~: w: F1 _
- GPIO_Init(STBY_port,&GPIO_initStructure);9 F2 Z h$ [& L
- - Q2 t4 U: t# E H! M
- 0 I* @5 ~* |7 U9 Q. D5 b" z
- STBY_HIGH;
& \8 [! [; l4 P# w3 S -
' W. k, }0 V0 @& T - AIN1_HIGH;' }2 G7 H1 U. [ L# T& i
- AIN2_Low;
- G) j0 I* a0 u# ?! v. i - 9 D; c7 b6 ]% h% }. w# m
-
8 m: M7 ~% F+ J4 ~ - BIN1_HIGH;
' _' f! l0 t+ s( R) Z: u, h. r - BIN2_Low;. q, d0 }" Y3 c# r1 l
-
9 H* ~4 D, U) J# Z- q& J - }
* g O& w* A L2 y' u; Z
复制代码 # L" ], c" b: E, a/ S
3 ~- a8 } C6 C
/ O* _4 J# ]( i3 `
. m8 d) L! d* E$ Y6 {' W9 c- V2 U; r ~, E: r8 O
|