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

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

[复制链接]
攻城狮Melo 发布时间:2023-9-21 15:15
PWM控制电机速度的基本原理    PWM(Pulse Width Modulation),也就是脉冲宽度调制。
: U/ x$ [. n" H# V; k
    PWM中有一个比较重要的概念,占空比:是一个脉冲周期内有效电平在整个周期所占的比例。    为了实现IO口上电压的持续性变化,可以调节PWM的占空比。这也能够使外设的功率进行持续性变化,最终控制直流电机转速的快慢。如何调节PWM波形的输出就是重点。
+ i' F5 a2 o/ O' k* R) V

0 F4 Z- X* _2 c& |# J3 E 微信图片_20230921151526.png 8 y" C- d4 x/ H5 m8 o: M/ {! }

. `7 W- i  }: x- m5 l

% E5 h* \- V* m, v: ?9 H
8 e9 }" J' h4 J: T, P

8 K" ^4 J4 l9 M+ a8 h& s5 |   上图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5),则改变CCRx的值就能改变输出PWM的占空比。因此,想要控制PWM的输出波形,重要的就是如何设置ARR与CCRx这两个寄存器的值了。* P% r/ N+ `% b

7 D5 s" X: _5 I& c
& g4 R# A1 N# d6 V* ?4 B
STM32定时器中断   
3 B  ?; j. h2 `, W为了便于理解接下来关于PWM应用的内容,先插一段定时器中断的知识。    产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。6 o+ y7 s* |0 U4 I$ F: l' L
) w# X( `6 ~2 x: A3 w/ J3 a

' _2 Z3 M* O) e0 r* C2 U, W原理简介   
/ w0 O/ h1 v. @% Y3 Q9 _* q6 v- N: D使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时很相似(Stm32入门——Systick定时器),即:用psc(预分频系数)设置好定时器时钟后,arr(预装载值)在每个时钟周期内减1,当arr减为0时触发中断然后进入中断处理程序进行中断处理。以下代码为例:# W: E6 `% P8 u; V9 R" x

: q$ L# H0 ]: W8 G( J7 W
1 ?+ \2 D7 J$ \7 }5 _# o
微信图片_20230921151520.png
) V, Z# Z. S9 o7 ]% |% D/ C
. N7 X' u; b# {5 q  M3 `$ i

4 k3 U1 U: D7 H    解释一下上面这行代码,由于定时器3(TIM3)是挂在APB1上的外设,所以要打开APB1,这里的预分频器值psc是来设置TIM3的时钟频率的,如果系统时钟(SYSTICK)频率为72MHz、psc为7199,则TIM3的时钟频率就为:
* g- S/ E( A6 @7 A4 m' A
0 f& ~! Y% m7 u# d2 R
* v+ g: ^4 j+ N. F/ p4 j' _
微信图片_20230921151516.png 0 U' f; K& L* L
! r- d+ G7 a* t; G

# u  I" ?+ a* d) c& h) v    10KHz是什 么意思呢?就是一秒钟会产生10K个周期,那么一个周期的时间长度就是1/10KHz,如果你想将定时器中断的时间间隔设置为0.5秒,那么你将arr设置为5000即可,因为arr每减1就需要一个周期的时间,减5000次就经过了5000*(1/10KHz)=0.5秒。
" R: o8 G0 C" i: ~3 S! N% A
6 n! p7 [- O: m9 B) B
$ B% @& z; R2 I; x  Z+ [$ w
微信图片_20230921151511.png
# D: v" x, Y' j; C
, X# m! K; _+ L5 P# `3 W

# U' b1 b4 a! o6 o    再解释下上面这一行,设置允许更新中断,即arr减到0以后可以触发更新中断,还有其他类型的中断。
. Q- ]/ e: b+ s5 W; t' }8 v- T3 Q9 ]; R2 C7 Y9 u
9 E( b" n' `! ^9 \; a
微信图片_20230921151506.png
5 \( [9 y; G' g/ G" J2 f+ i
- v6 ~1 W( M. |

/ w0 \. ?% m) a7 C    看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序1正在使用CPU,这时如果程序2要求使用CPU,并且程序2的抢占优先级高,则CPU被程序2抢占;若两者抢占优先级相同,则就算程序2的响应优先级高于程序1,CPU也不能被抢占;若程序1正在使用CPU,程序2和程序3的抢占优先级等于或低于程序1,且程序2的响应优先级高于程序三,则待CPU空出后,程序2先运行,程序3最后运行。TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的,这是因为寄存器提供了四位来设置优先级,组2代表的是前两位给抢占优先级,后两位给响应优先级。
+ @# U; T3 k+ }; o
) r+ r) R5 Q0 M5 X) i" ~PWM模式、有效电平   ! \# w0 t0 r3 ^
前面介绍完中断,再说一下PWM工作原理。    假设上图中ARR大于CCRx时输出为高电平,ARR小于CCRx时输出为低电平,但在实际运用中可能并非如此,有可能是相反的情况——ARR大于CCRx时输出为低电平,ARR小于CCRx时输出为高电平,至于到底是哪种情况,还要看PWM是哪种模式、有效电平又设置的是何种极性了。
  • 模式1:ARR小于CCRx时输出为“有效”电平,ARR大于CCRx时输出为“无效”电平。
    # d0 \( n/ o9 a4 w# S
  • 模式2:ARR小于CCRx时输出为“无效”电平,ARR大于CCRx时输出为“有效”电平。- O" ~8 U" ]3 ?5 R$ Z; \  w/ v- a
    这里说的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。+ S% V6 \- I- \# Q  R+ ]3 L

* v# v& U  S# G! N8 G* g/ L

% K+ l, E5 A! v+ L8 U/ _3 _* D, n 微信图片_20230921151503.png 8 ~* l' t! c: Z" V/ Y
7 m3 i) a  w1 d" P; o. d

/ T0 \% m, K  N7 i% L0 W" V    上一小节讲过关于定时器参数的设置。使用定时器1的通道1来输出一路PWM波,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。# L; X3 R5 k. U, u2 p/ }) Q8 x

8 s0 `7 [4 h; J0 l
. X; j% n% s% c! e5 X
微信图片_20230921151459.png
( ~1 A) Q5 }4 E0 @$ r& k
# o& Z9 {/ Z- Q& O4 _$ s$ H

1 ^5 \: o, J+ ?    下文具体分析上面的代码。( R) b! d  o& Q5 O( y; T" F# t
    前面4-6行是用来配置GPIO口的。3 T4 A2 F9 g* b" _  l
+ V, W8 j2 d1 @& V, a

2 T3 e* q0 T5 ], m+ h 微信图片_20230921151456.png
# z$ V/ W" F' b5 a5 i; g* }5 G) l! }- @9 B0 ?
& t1 s& ~& o& }: [
    这两行就是我上门提到的设置定时器的频率和重装载值。4 l: M  q6 ^# r6 p" ?8 s

3 c$ i8 }6 h% Z# S

0 n& s1 F' s4 C" j# b 微信图片_20230921151452.png + W$ h4 S8 p: k* s
8 j( C; }) G/ T9 y& S, \
4 o" }$ b5 }5 v  @
    这三行是用来设置PWM输出模式和设置通道的,通道是什么呢?简单地讲就是输出PWM波的GPIO口,代码一开始不是设置了PA8这个GPIO口嘛,这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。
3 m1 W1 l2 O; k
* P, y% @: O" c8 s) p2 {

$ _# S  W% k8 j) ~ 微信图片_20230921151449.png 0 B# b6 ?, H$ q  V# u3 O

" `- G$ C" S) {) \, m5 ]
3 a! L+ S8 L8 T, D# `
    这行代码是用来设置“有效电平”极性的,根据手册,当TIM1->CCER[1]这位置1时,有效电平为低电平,置0时有效电平为高电平,而默认情况下置0。
( ?. L+ S8 G6 V

7 _/ y! w% H) Z6 N9 }0 k3 p% R0 X

2 K# y  V8 W4 D7 q# i% K 微信图片_20230921151446.png
- p4 j6 t/ }+ S$ F7 k6 r" ~- h/ h6 \0 W: v- }( \

* E+ v4 P2 q, {    这行代码只要对高级定时器进行设置,普通定时器无需设置。' m: n/ e2 \3 R9 N" @' E4 N6 e3 c

5 g; ~$ G& C5 n$ F" e' G" b9 ?- F

0 M5 {" _7 f5 N! H 微信图片_20230921151442.png   F* x* t5 _. u: h! G
, [( p& z; v' Q! ^3 M/ E

" k$ H3 y3 i8 f& L$ j& S, {/ A    这行代码是用来使能ARPE,ARPE是什么呢,就是当它被置1时,你自己设置的CCRx会立即生效,如果它被置为0,那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了),而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。
3 r, ?# S0 ]) _+ x; D  @& q8 ^4 x- d, T4 j. F  R6 z
上面的代码里没有对CCRx进行设置,这是因为CCRx常常是一个变化的值,你可以在主函数中用一个for循环+if判断语句对它进行++或–的操作,从而达到连续改变CCRx值得目的,例如:$ J6 B* E5 ^/ b

# z/ ^  ?2 d# y$ B5 D$ A. ~

- K% }1 A  w" W" Z 微信图片_20230921151438.png , ~* D7 n8 m: n) M- P1 X
: B/ p6 h. W" \$ z+ ~. O5 _9 O4 O2 z
. p7 |( u/ e, A0 n2 [6 }
    PWM波的周期是由定时器时钟频率和预装载值两者决定的,预装载值就是ARR。   " A5 B8 i: P; @7 I- m7 a+ b: ]

+ H; L% X% O  S; m3 ~8 V. `- f
, g, {: L: T6 E) F
预装载值PSC设置为899,那么,当定时器的当前值val从0增加到899时,一共经过了900个时钟周期,这900个时钟周期会产生一个PWM波形,也就是说900个定时器时钟周期才相当于一个PWM周期,那么PWM的频率就为72MHz/900=80KHz,周期为1/80KHz。
( A9 z  ]( S, k; t5 D& p
/ O' I$ D! X! i2 D" I$ b. [# S1 O* G& r# d1 [; j, J5 ?8 L
赞 收藏 评论0 发布时间:2023-9-21 15:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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