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

基于STM32通过PWM控制电机速度经验分享

[复制链接]
攻城狮Melo 发布时间:2023-9-21 15:15
PWM控制电机速度的基本原理    PWM(Pulse Width Modulation),也就是脉冲宽度调制。
% |+ M8 v, g& H$ X& n
    PWM中有一个比较重要的概念,占空比:是一个脉冲周期内有效电平在整个周期所占的比例。    为了实现IO口上电压的持续性变化,可以调节PWM的占空比。这也能够使外设的功率进行持续性变化,最终控制直流电机转速的快慢。如何调节PWM波形的输出就是重点。
% W) s6 K: }, }$ S$ d

8 q% Y, V& C- n2 F, [ 微信图片_20230921151526.png 6 w- x4 ~9 _* N) u7 `

; X, C& o  S2 h# x

' j6 h. s9 p" }2 {
% i, }4 {( x: D& P2 F
  C/ e* [  W% h0 T  ]( F
   上图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5),则改变CCRx的值就能改变输出PWM的占空比。因此,想要控制PWM的输出波形,重要的就是如何设置ARR与CCRx这两个寄存器的值了。
- K1 {/ j: H  k( d) d/ `$ {& P" e" C, t  W' @' B0 q% A( u3 N

- g$ }  A. L: R0 |! `STM32定时器中断   
* p% S6 X$ c4 k/ m# g& ~为了便于理解接下来关于PWM应用的内容,先插一段定时器中断的知识。    产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。% T0 [, J. r/ ^$ d2 Y9 u; N

0 w, q7 F3 t6 ?; |3 n4 L

# q1 l. l) l4 I原理简介    # v5 p+ R: ?" X2 }, w, o2 F; N& q
使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时很相似(Stm32入门——Systick定时器),即:用psc(预分频系数)设置好定时器时钟后,arr(预装载值)在每个时钟周期内减1,当arr减为0时触发中断然后进入中断处理程序进行中断处理。以下代码为例:; V8 f5 G8 A  f6 d' Q9 I

# O2 o/ H& F0 R! A( N
! s: S6 M7 s" |- u3 e- v9 c9 M( \- C
微信图片_20230921151520.png 6 m; ~; A8 X( Y$ F% z
$ r& k- N" @& i* `

" \! F& m% c  H' w    解释一下上面这行代码,由于定时器3(TIM3)是挂在APB1上的外设,所以要打开APB1,这里的预分频器值psc是来设置TIM3的时钟频率的,如果系统时钟(SYSTICK)频率为72MHz、psc为7199,则TIM3的时钟频率就为:6 N' b" Q8 G6 v! q  [- X) ?) r) l
, ~4 W3 |, Y9 w, c9 f$ H2 k+ i, O
3 v% [- {! F. x8 @( N
微信图片_20230921151516.png / J  }$ A- ]& B
3 r' R' G8 Y% S7 w% f4 p
' m& E" j) S" y  l
    10KHz是什 么意思呢?就是一秒钟会产生10K个周期,那么一个周期的时间长度就是1/10KHz,如果你想将定时器中断的时间间隔设置为0.5秒,那么你将arr设置为5000即可,因为arr每减1就需要一个周期的时间,减5000次就经过了5000*(1/10KHz)=0.5秒。
- O. G7 N2 j' r& \  n" y" W2 G5 P9 I, l/ j/ y" H
) H5 D1 `$ z/ U/ K5 a8 j/ M8 N% k
微信图片_20230921151511.png
. {$ b9 I, |8 a$ U
9 n( p6 p* A; K: ]  J0 |
( J- F* o% R7 H9 Q
    再解释下上面这一行,设置允许更新中断,即arr减到0以后可以触发更新中断,还有其他类型的中断。; D+ C3 g* d1 o- r4 T4 Y; e

% q& `2 l. c3 K: I: q% `* N" U5 u
6 c7 v$ V! o9 L% b* Y) K; V7 R: A
微信图片_20230921151506.png 3 I7 J6 n' f7 ~
: }$ Q7 h: U: `( t# g
- }7 K) v* J3 s5 Q+ X  Y7 T: a' j
    看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序1正在使用CPU,这时如果程序2要求使用CPU,并且程序2的抢占优先级高,则CPU被程序2抢占;若两者抢占优先级相同,则就算程序2的响应优先级高于程序1,CPU也不能被抢占;若程序1正在使用CPU,程序2和程序3的抢占优先级等于或低于程序1,且程序2的响应优先级高于程序三,则待CPU空出后,程序2先运行,程序3最后运行。TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的,这是因为寄存器提供了四位来设置优先级,组2代表的是前两位给抢占优先级,后两位给响应优先级。% A/ G- f! X$ z- L7 Y

& _5 B% {, N3 Q4 T5 y2 ]0 P" K8 ^8 qPWM模式、有效电平   
9 V: {8 L9 [6 l# m6 d前面介绍完中断,再说一下PWM工作原理。    假设上图中ARR大于CCRx时输出为高电平,ARR小于CCRx时输出为低电平,但在实际运用中可能并非如此,有可能是相反的情况——ARR大于CCRx时输出为低电平,ARR小于CCRx时输出为高电平,至于到底是哪种情况,还要看PWM是哪种模式、有效电平又设置的是何种极性了。
  • 模式1:ARR小于CCRx时输出为“有效”电平,ARR大于CCRx时输出为“无效”电平。
    , x, n/ b+ v% q: J) y
  • 模式2:ARR小于CCRx时输出为“无效”电平,ARR大于CCRx时输出为“有效”电平。& g& W/ ?. w0 c* ~1 C
    这里说的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。
9 z: k& m! ~' d2 Q7 H2 j7 w$ b' a$ L6 p
+ ]  U+ T$ ]# p% J- |# Z
微信图片_20230921151503.png   }  E2 V6 W9 Z9 J: J
/ w4 P$ ]9 I( V. t" t1 b3 I( k

" C' J/ {' O* l1 P7 ?/ M" G& M    上一小节讲过关于定时器参数的设置。使用定时器1的通道1来输出一路PWM波,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。! a0 A+ O2 @/ D2 T/ n" r, F( ~% M
" e& N! ~9 k  s  [7 d" d3 h% z* E

+ q0 Q6 X; L; h; n 微信图片_20230921151459.png : b5 A  ]1 N& s: u, M$ G/ f
* k  n' Y& ?9 E# X5 I% o
/ D. t- T  l/ \! w8 R0 s8 E! {5 {
    下文具体分析上面的代码。8 a5 `+ w  U/ S* D+ {) y3 q
    前面4-6行是用来配置GPIO口的。' {& O) t6 s/ C2 m
7 X) e7 ~% ]  }/ X* J9 n% ~
8 y8 y4 o3 _9 }/ W  v1 z( V
微信图片_20230921151456.png / Y: m; G# W, J+ H7 w, l$ Y/ @! x) Y: T
( s' j2 y$ y3 S1 B
1 @1 k( M+ K0 y5 w6 f3 A( v5 T5 |8 l
    这两行就是我上门提到的设置定时器的频率和重装载值。
: Z1 p9 l. x$ H/ S% u7 I' A; }# l
" T! C$ L7 `/ x

0 m& T6 X  `, p- j. b 微信图片_20230921151452.png
6 W7 B$ ^8 w5 H# S1 T, {, m. Y4 A6 i  ^: m5 A) F% [# j* W7 }" p; w
5 p( L, v6 i: H, M$ h3 d5 \; J1 x# x. H- U
    这三行是用来设置PWM输出模式和设置通道的,通道是什么呢?简单地讲就是输出PWM波的GPIO口,代码一开始不是设置了PA8这个GPIO口嘛,这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。
% @! a: s+ E  ?2 N0 m1 Z

' R) Z- d0 E2 K7 _* ^6 ^+ o

! |9 M( x+ X2 }! h0 \4 D+ C- V- L 微信图片_20230921151449.png 5 z' j+ M) o/ ^! D
: S- d  J# U! G& B( b! E
2 g8 ^( @" c2 N9 J# I* L" ]8 m
    这行代码是用来设置“有效电平”极性的,根据手册,当TIM1->CCER[1]这位置1时,有效电平为低电平,置0时有效电平为高电平,而默认情况下置0。7 I' n9 R: P5 k; x' ]3 j6 C5 H
1 `* }/ S: f  L3 k  V
# j1 o5 I2 Q+ D  A
微信图片_20230921151446.png
. [$ F% w4 I2 I$ y0 {  o. Y. E; p( l7 D' @
0 S2 o& g: }' j
    这行代码只要对高级定时器进行设置,普通定时器无需设置。
5 R; A) f$ o, C

* G. j7 p+ A. g4 J

+ T0 n1 M) ^) K  _2 K' T+ r& Q- ? 微信图片_20230921151442.png 5 Z2 ?5 e' D- T8 l
. W. V; g0 a9 l& W0 B

$ V" w5 p* [8 w" Y1 I    这行代码是用来使能ARPE,ARPE是什么呢,就是当它被置1时,你自己设置的CCRx会立即生效,如果它被置为0,那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了),而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。8 N: S% W1 ]/ y/ e9 l

) M" G3 ?" l' U8 ~) E
上面的代码里没有对CCRx进行设置,这是因为CCRx常常是一个变化的值,你可以在主函数中用一个for循环+if判断语句对它进行++或–的操作,从而达到连续改变CCRx值得目的,例如:
, m6 D2 F2 O& R( }7 Y) ]
* R5 K2 _( M( @+ b" }$ @. p( n# J' N
6 c( ^. Z  n2 C
微信图片_20230921151438.png 9 J- Y0 I3 _/ \4 a$ |8 O4 D
0 y' r6 @+ H/ d

) R* m# v# i0 Z/ l5 G% R    PWM波的周期是由定时器时钟频率和预装载值两者决定的,预装载值就是ARR。   3 T1 t6 A9 f. U+ L- k; x' m. r

' h; O0 W0 u+ r: O0 M( r
0 s' ]+ g1 d9 C. a9 T
预装载值PSC设置为899,那么,当定时器的当前值val从0增加到899时,一共经过了900个时钟周期,这900个时钟周期会产生一个PWM波形,也就是说900个定时器时钟周期才相当于一个PWM周期,那么PWM的频率就为72MHz/900=80KHz,周期为1/80KHz。
9 t+ k; G3 l/ c. R9 Q$ k5 Q1 Z# k' }& P4 I' a9 {3 x
" ~% p, _9 K6 d5 J) F1 `% s" M
赞 收藏 评论0 发布时间:2023-9-21 15:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版