你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103C8T6+L298N通过PWM控制直流电机转速

[复制链接]
STMCU小助手 发布时间:2022-11-1 15:57
前言3 m0 }) m4 H* K1 f
原来做的差速小车是基于Arduino控制的,感觉有些简单,也有些基础,Arduino方便简单的同时,可操作性感觉也少了很多,所以想将控制器换成STM32,然后将树莓派作为上位机,STM32作为下位机,通过树莓派和STM32进行通讯,实现对差速移动小车的控制,本人也是寒假期间初学STM32,也是奔着应用去的,所以对于STM32编程原理方面可能不太精通,这里偏重于记录应用层面的知识。1 a7 U  P" t9 h6 Q
) O4 d0 J" }7 ~
一、PWM调速原理
7 A* ^9 \# |) a, m  A7 q* l直流电机驱动是最简单的,给电机通上电就能转,根据电机的公式:
* D% m! G; Y1 X: C0 G! v' z' m7 M' s9 g" m0 ]% S! t, h9 ^
K([]3$@[2CC}E]5`K2VUCXQ.png 1 `* }9 V( _% o# {$ U

+ E" X) `! H9 Q- N3 S' a可知:当提高电压时,反电势升高,进而转速升高,电压与转速大致有如图所示的关系+ h4 j7 B; L" e5 G7 }

+ O# w' V$ ]. q$ M1 K+ `& G abb0e5e55fbd41d3bf80a0c3b786c636.png 1 _( C0 B. S' E0 t0 n# M

+ c% y$ `- r- W: o所以我们只要控制给电机通电的电压即可控制电机的转速,但是在实际的控制中,控制直流电机需要通过H桥控制电机的正反转,如图,当T1和T4二极管导通时,有粉色通路;当T2和T3二极管导通时,有蓝色通路,这样我们就可以实现弱电控制强电,通过二极管的通断来控制电机的转向。
7 O: y/ p% F5 R5 ?+ j# \! C$ ]0 t* R( l+ y, O1 c/ i" F# N
但是这样电机通电时电压就是Us,我们如果想自由的控制Us的电压值基本是不能实现的,因为电机是接到单片机的引脚上的,引脚的供电电压值是确定的,我们就要使用控制二极管的通断时间对电机的转速进行控制,即PWM控制。
2 Q8 G) F' Q' Q, G: b9 o$ L) \
. W' l& Q1 c6 w* k6 E图中的D1~D4二极管为续流的作用,因为电机中有绕组,在断电后,电感的电流不能瞬时变为0,所以在断电后电流沿棕色和绿色的通路放点。) T6 h/ Y/ P- |1 O5 f1 F9 b
( E% E( R$ u3 \- v1 X
fdfb9e01ebf44892b29da3b6b44fcb75.png
6 Z( o9 Z! Z2 N/ R- U% Y; g5 {( S9 ~
d82be034a45043beb011032eebbf1569.png ' ~8 w6 F0 d* ^5 s

9 T" U& W: p# C; W5 I) r 在一个周期内,我们通过控制通电的时间就可以调控平均电压,而平均电压的高低直接控制电机的转速,通电时间/周期,就可以得到占空比,我们也就是通过控制电机的占空比来控制电机的转速的。4 h  e2 O5 j$ q: p- l

8 n9 H, h7 T% P8 B 8d1111caaea041fca59258e9c11af1f4.png
" o$ Z+ P# b( S  r2 s# z! t
$ k& U; _8 ]. |+ }, \7 ^ 在实际应用过程中,我们不用自己搭建H桥,而是使用电机驱动板(如:L298N)对直流电机进行驱动,L298N内搭载两个H桥电路,可以实现对两个电机的转向和转速进行控制。6 r4 H5 L' G, s( H- C  M( d
" g9 y, t# c6 Q7 K0 r( t
f9dbeeb361534857a4944e3f8bb5acdc.png
4 V5 ?* V" [. q  v# S
2 A% y: o/ l, Y8 ~' J/ } 这是淘宝商家提供的电机驱动板控制表,将IN1~4接到单片机的引脚,我们就可以通过引脚输出PWM控制信号,对直流电机进行控制。3 {) H6 j5 J6 [6 S+ W5 g8 ]- u
' l! a0 x+ U  `9 J# M
二、STM32编程实现
/ u( u3 }0 J8 l: M3 I在STM32中如果想输出PWM信号,需要借助定时器,通过定时器的捕获/比较通道的PWM输出; R+ X8 Q/ ?9 b: G1 b9 l6 i  F8 x

" {2 J$ m% |  m  C2 X( g$ a fe3401a0430c448a93df615bb13ce127.png ) @4 ^& P$ }( N2 d) E+ t! L

, A! e% X, J( T2 Z% a! n. ]; O* P 当我们对定时器设置了预装载值arr和比较值ccr后,可以通过配置PWM模式,使定时器CNT计数值超过ccr后产生有效信号,并通过配置相应寄存器设置有效信号是1还是0,而配置PWM的输出方式,具体原理信息可以参考原子哥的视频,也可以参考中文参考手册的14.4.7内容。
+ k0 X9 K' b- r6 [0 r
2 r2 D& |. _' X( L8 \' P 78a1f1c52ee2438996f36a9ab63b49a6.png ; L; o1 P! Z" D* x
2 C6 G+ O3 l5 a
在程序中,我们使用库函数进行配置,配置步骤如下:3 a* o7 m6 ^' W* D- Y- x! i1 ^
1.使能定时器和相关外设引脚时钟 :RCC_APBxPeriphClockCmd()
' D1 ^& R& I6 u: W+ m1 Y, o9 `2.配置IO口为复用输出模式(查手册8.1.11)配置成相应的模式(复用推挽输出)  y: u9 @/ [! C; V% j. l1 `/ b
3.初始化定时器:TIM_TimeBaseInit()1 Y  @: i- b% w% n6 l: q
4.初始化TIM2 Channe1234 PWM模式:TIM_OCxInit()2 n5 [  u2 {& u9 F5 k
5.使能OCx通道的预装载寄存器:TIM_OC1PreloadConfig()% [' D) |* j5 T
6.使能时钟:TIM_Cmd()  Y% f! j4 W8 n1 p* H4 f) |' c
7.在主函数中配置占空比进行调速:TIM_SetCompare1()
4 ?: n8 }. Q1 p
  1. #include "sys.h"
    , h; G( ]7 u' U8 n1 E

  2. & E$ d8 g5 N) _* d! k- ]; {6 f
  3. /********************
    + |  B( e8 V& r8 ]) H
  4. 功能:通用时钟2用来产生通道1234四路PWM信号
    / |5 Q6 E: p# Q1 R! G
  5. 函数:TIM2_PWM_Init(u16 arr,u16 psc)) O8 ?0 X5 _3 m( z6 }
  6. 作者:K.Fire& n/ _7 v+ l6 G$ u
  7. 日期:2022.01.30
    $ e( r% g) n/ t7 \8 l
  8. 引脚:PA0 PA1 PA2 PA3) z2 e) s& j2 P* S
  9. 参数:arr:自动重装值 psc:时钟预分频数  y; R( J4 a3 H! L
  10. *****************// y1 }3 N+ P* B% ~+ h

  11. * I9 ^/ b6 T) ]' j
  12. void TIM2_PWM_Init(u16 arr,u16 psc)  Y/ O; j( U1 `# n8 {9 D1 p: j
  13. {  
    + Q9 I- V6 G2 h0 ?: y' N5 @, h
  14.         GPIO_InitTypeDef GPIO_InitStructure;
    7 {  \: x+ t3 \- I  Y0 r$ c
  15.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    " W2 F+ S$ P0 D6 p: j
  16.         TIM_OCInitTypeDef  TIM_OCInitStructure;6 m0 {! ^$ }+ j3 K- r: d
  17.         
    2 D+ j2 U' u3 b: s9 g5 N" b
  18.         //使能GPIOA外设模块时钟  " c$ [) w  l( {1 g6 H  H$ a
  19.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   + P2 h8 z+ ?6 K, _
  20. % O$ h4 c2 l1 m
  21.         //设置引脚为复用输出功能,输出TIM2 CH1的PWM脉冲波形        GPIOA.0
    4 L* \( d3 n0 v" w7 ^7 i' v  j
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM2_CH1
    . t: H* g- X5 y$ F- ^1 K) A5 s
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    ' a7 v; A1 i* p
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    8 V2 i% L1 u# s- c1 I$ W
  25.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO& g! l. t8 A2 p* U: E' P
  26.         
    + H' q( q% K' |. i; K+ E0 }
  27.         //设置引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形        GPIOA.1
    % R; d" j7 d5 K1 o
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM2_CH2; ?  l4 \( \" n+ ]5 R' a
  29.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
    # X+ @5 a7 N9 I* G
  30.         7 U* l3 {# z0 G: f  s$ n9 W7 A
  31.     //设置引脚为复用输出功能,输出TIM2 CH3的PWM脉冲波形        GPIOA.2
    9 Z' s2 x! r8 Q2 K. }% F
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM2_CH39 T4 y7 T, \- Z: D( p2 W
  33.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
    , U, C6 ^  O& y3 F  x* `& k' K, A
  34.         5 R6 H! g! x- ^8 {8 _7 O* J$ S9 U* |
  35.         //设置引脚为复用输出功能,输出TIM2 CH4的PWM脉冲波形        GPIOA.32 V" m. l# y0 x- X0 |. W5 b$ W  L7 D7 X
  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM2_CH45 ^1 r# M! S4 F( l# N
  37.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
    $ F" P$ i8 g$ r( {' u7 \

  38. 6 V! j+ W' A0 S7 S! ^7 Y! ^
  39.         //使能定时器2时钟
    , h4 M+ r' j9 u. w" N
  40.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        
    8 I' q+ a% f3 V; S4 A) W% u
  41.     //初始化TIM2: k7 M! D( g( L. F9 g* {0 `) W
  42.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    ) H6 p/ P# r. Q2 Y2 }! t
  43.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 7 l5 C( ~/ ~8 n/ Q
  44.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    # b" e* x4 l5 W% q" l7 {8 e
  45.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式5 T4 O/ s0 E& j4 R2 q0 t; T
  46.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位3 d% d% ^# L" O' Q
  47.         
    ( S# ]1 M% _0 [1 }' F* T+ z6 G
  48.         //初始化TIM2 Channe1234 PWM模式         
    # }! Q' s) D. U
  49.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
    5 o: W  [  b2 S3 [. V* P) r, V: j
  50.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    + _% J9 n, B2 c7 K* D4 Z% R; T& u
  51.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高- S2 k) x, h' G0 M
  52.         
    6 [( A$ k& _' U2 f
  53.         TIM_OC1Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC1* @/ a6 T& l, H, r( m2 I
  54.         TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC2
    & ~$ C* R; X4 K4 |2 A! X
  55.         TIM_OC3Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC3
    8 @1 S7 ]; K$ Q
  56.         TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC4
    : F$ c; D3 x. N5 U
  57. 8 t6 M; E2 f6 v6 j
  58.         TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR1上的预装载寄存器6 z; I1 {( x9 m  a; h
  59.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2上的预装载寄存器1 [! N2 ]4 q$ ^8 ]6 ?. N6 t% e4 ]
  60.         TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR3上的预装载寄存器* |$ z. i, u! b( \) ^
  61.         TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR4上的预装载寄存器* G* d: J/ s! e( @6 l
  62. . W0 a) w5 Y- c: J  N, i
  63.         TIM_Cmd(TIM2, ENABLE);  //使能TIM2
    6 W: ~$ _- P7 k9 P8 R' A
  64.         
    ; n; {/ m5 N0 q, ^9 K; @) B; m1 e! K
  65. }
复制代码

8 K) ?( @( Q. }  j+ e- n- H! h总结6 o- Q" J+ T; y# i
原理部分我讲的不清晰,我也是看原子哥的视频学的,大家可以通过传送门去B站看原子哥的视频,先更新PWM调速,因为这一部分我测试成功了,等我编码器来了在对编码器和蓝牙进行测试。
. l" |1 `2 z1 R0 {————————————————, k. I7 A, A7 j# V* k: z/ D
版权声明:K.Fire浑身是肝
8 t5 w; y2 v' B+ ?. O3 l
- {2 _% J. z$ N- A% x: X3 c. {; y" [1 X* q
收藏 评论0 发布时间:2022-11-1 15:57

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版