|
STM32F103实现小车的转动 首先,我们要明白:电机转动的实质其实是对PWM波的控制输出;
! L0 q! q2 o8 E6 c. I( 库函数直接调用封装好的函数 TIM_SetCompare1()或者用CCR调节占空比)# s" t: }2 W( @" Y; @0 V
, ?' \0 V: G) k2 F; p
; d) G% T- E2 b2 ^% g# BPWM波输出的原理图如下:
6 j2 \. B' ]6 p, G8 \其次,我用到了L298N型号的电机驱动,于是我通过淘宝的拍立淘或者是百度进行了电机的初步了解8 w8 |- {6 T) H* Y8 j4 z3 z
下面我从网上找到了一个L298N电机驱动实物图,进行详细的描述:(通过此图可以进行实物连接)
( k! X4 U6 W, `注:千万小心,不要把引脚接反了,会少了芯片。
5 t/ ]9 V* R" v0 _( v然后,进行代码的编写,可以引用正点原子的例程代码,在此基础上进行代码的编写。' ~2 e9 ~7 c& O' H
我小车是直接控制两个电机,四个电机分成两组。让其中一侧电机的状态相同,另一个状态相同,,没有分别单独控制。
' L1 f; ]+ D$ y8 J1 _+ |0 k1 K通过下图可以参考:IN1 IN2 IN3 IN4
- `6 Q$ r' u& Z% f: y' `1 0 1 0 实现电机的正转 小车前进) E' J7 h0 y: \0 \$ v; r2 U. b
0 1 0 1 实现电机的反转 小车后退
1 n3 `- `$ n, K6 K# T% t4 I) ^- m1 0 0 1 小车右转
7 [ M2 R( i1 J- t! j* g0 1 1 0 小车左转
* m0 e6 e4 ]0 y: F
( X7 [" [$ s& f( ^0 q8 \* P: }2 Q# T+ w& Q& o- V
但所有的前提是要先学会时钟实验和GPIO的初始化,这个时候就要补上上次STM32学习的内容了。% _& w. c& R8 d5 c" e# Q! M8 _3 O- Y
先进行STM32时钟和GPIO的学习
[/ I+ m x1 R) j附上电机初始化代码# f6 v2 A/ n* D+ ~
- void Motor_Init(void)
" R& @$ _2 L6 X4 u5 F - {
& t2 T" @ ^# r; x5 }- E - GPIO_InitTypeDef GPIO_InitStruct;) q1 |. O5 ]+ a; w# p
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOA和GPIOB7 e/ a8 u9 P! t& p. v m! T j1 \
-
; R0 c/ O O' n, }6 n4 D( a1 B - GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出$ e3 m; h4 L/ d3 t& G( ]
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 |GPIO_Pin_7 ;7 h4 E# ` L6 \9 g5 \3 K
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;$ D, ?- X! D7 O% U; u7 c) _
- GPIO_Init(GPIOA,&GPIO_InitStruct); 9 N0 w5 K0 {2 q! c/ x
- GPIO_ResetBits(GPIOA,GPIO_Pin_6 |GPIO_Pin_7); //引脚先输出高电平$ R8 L/ |5 W- ?5 K) R
- . g- q1 b, S4 F, S5 r
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; 2 ?, X" D( @, N
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 |GPIO_Pin_1 ;
- f) j4 {/ q4 y$ h - GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;# _+ ~5 i6 c) H i6 Y! M" C
- GPIO_Init(GPIOB,&GPIO_InitStruct);
# v2 ~# w0 q" E& X/ M; N - GPIO_ResetBits(GPIOB,GPIO_Pin_0 |GPIO_Pin_1); //引脚输出高电平
# Z5 ?1 q6 m- W4 c0 H) @
复制代码 之后,还需要自己写函数实现小车的前进,后退,左转和右转
J$ Q6 e4 Q3 K+ j: O) R B8 p: j7 \- _" A! G8 p
; m r {& {# R7 ^& g' I需要注意的是PWM时钟输出的arr和psc的关系:
7 I9 [# N* [+ x* _& h+ f7 ~7 o系统时钟设置为72MHz;
1 d2 K6 A* a5 O! p* bPWMFre=Sys/(arr+1)(psc+1)5 \7 F" x5 ?0 i- k7 d
TIM1_PWM_Init(999,71);//分频。PWM频率=72000/(999+1)*(71+1)=1Khz" h- _; }* k" ?% e t/ {
周期为:1/1khz;
6 x6 A' `8 c( Y y1 I, O" f
: V3 k& t% S6 y4 i" e
* j- _- D6 ^- y% ~/ l5 U5 o
, J6 {1 }, b0 E
( U3 j( d. B1 b( C0 K8 s+ P4 T$ ?5 |* [
- r! E% c, C- q( u9 \$ G l7 I, O
3 \# L- F! x: T) D8 A/ T |