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

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

[复制链接]
攻城狮Melo 发布时间:2023-9-21 15:15
PWM控制电机速度的基本原理    PWM(Pulse Width Modulation),也就是脉冲宽度调制。
. D1 \& S1 L+ ~( Q% E
    PWM中有一个比较重要的概念,占空比:是一个脉冲周期内有效电平在整个周期所占的比例。    为了实现IO口上电压的持续性变化,可以调节PWM的占空比。这也能够使外设的功率进行持续性变化,最终控制直流电机转速的快慢。如何调节PWM波形的输出就是重点。3 V* c; a4 |. x- E9 E  \: u

/ D( e  ?3 o8 F) I/ `9 s/ Z 微信图片_20230921151526.png : v4 M9 {& N: v) v
: m7 ]. r1 p0 ^+ Y

; b: [/ j2 _# E8 M' u& p# m: P( }, E0 N8 {

" Q6 p8 b& F; Y1 N$ ^* w& v   上图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5),则改变CCRx的值就能改变输出PWM的占空比。因此,想要控制PWM的输出波形,重要的就是如何设置ARR与CCRx这两个寄存器的值了。3 _: f6 `& \: L7 g" v7 s
/ V+ J; L) d+ O$ p$ O( ]$ l. \
* @+ n7 D3 a: I. r7 p+ Z
STM32定时器中断    ! c. K: Y5 \& A: r) P/ L' z
为了便于理解接下来关于PWM应用的内容,先插一段定时器中断的知识。    产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。
4 r3 s9 D% N" ^7 w" Z
7 J) h3 U5 V* l, J
% I  [- F$ D) t
原理简介      K+ i* e9 X, P# _
使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时很相似(Stm32入门——Systick定时器),即:用psc(预分频系数)设置好定时器时钟后,arr(预装载值)在每个时钟周期内减1,当arr减为0时触发中断然后进入中断处理程序进行中断处理。以下代码为例:
0 I5 }& m. H" n' @; x3 q& s- v" c: k; x' t8 l' @5 _

* y# _; C9 v# m4 j# S/ }/ n 微信图片_20230921151520.png 5 t+ j1 z. h# v; X3 M8 o: i
7 ^; n! z# ?5 ]* V' K+ E+ w" R
% x( v8 m2 Z) B( U; @2 h" F, ^" D7 K
    解释一下上面这行代码,由于定时器3(TIM3)是挂在APB1上的外设,所以要打开APB1,这里的预分频器值psc是来设置TIM3的时钟频率的,如果系统时钟(SYSTICK)频率为72MHz、psc为7199,则TIM3的时钟频率就为:
* k! s3 s: q' ?
6 C* O" O6 d+ P1 n5 ^* y

/ s0 w5 v; b1 d$ ]4 m# v. v8 e 微信图片_20230921151516.png
' x* e, t- Q; M$ z! C( O- E+ _9 n5 }  t& p+ S' s) w) ?( V
# c+ j( s, u8 P9 _3 `
    10KHz是什 么意思呢?就是一秒钟会产生10K个周期,那么一个周期的时间长度就是1/10KHz,如果你想将定时器中断的时间间隔设置为0.5秒,那么你将arr设置为5000即可,因为arr每减1就需要一个周期的时间,减5000次就经过了5000*(1/10KHz)=0.5秒。
- L- w3 j9 V% F' `5 `1 @8 Q+ ~6 Z! [. \" `5 }8 Z; L8 c% l$ g! ]

* Y9 y) y4 i& y( ?$ }5 \ 微信图片_20230921151511.png
; G& _: P4 S5 ~; e( n
  T! t4 @" U. T1 P6 X8 W0 Z

1 k. s7 r& j2 b+ R8 o' D    再解释下上面这一行,设置允许更新中断,即arr减到0以后可以触发更新中断,还有其他类型的中断。
9 Z& ]( b6 z$ l' P: D+ [4 `/ O! i+ O" K; q+ P' D, I7 n

& W: g) E4 f% ~ 微信图片_20230921151506.png ! Z* w+ n4 x( S$ ^

1 ^- e* P/ |/ v2 j5 q9 C

' ~( ^' ~2 M6 L5 H9 d. |6 {- h    看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序1正在使用CPU,这时如果程序2要求使用CPU,并且程序2的抢占优先级高,则CPU被程序2抢占;若两者抢占优先级相同,则就算程序2的响应优先级高于程序1,CPU也不能被抢占;若程序1正在使用CPU,程序2和程序3的抢占优先级等于或低于程序1,且程序2的响应优先级高于程序三,则待CPU空出后,程序2先运行,程序3最后运行。TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的,这是因为寄存器提供了四位来设置优先级,组2代表的是前两位给抢占优先级,后两位给响应优先级。  J3 K% y0 O6 Z% ^4 u

0 S; L" W2 Y( d, Z5 APWM模式、有效电平   : X0 l7 _$ w7 E! j- f% K- @+ S
前面介绍完中断,再说一下PWM工作原理。    假设上图中ARR大于CCRx时输出为高电平,ARR小于CCRx时输出为低电平,但在实际运用中可能并非如此,有可能是相反的情况——ARR大于CCRx时输出为低电平,ARR小于CCRx时输出为高电平,至于到底是哪种情况,还要看PWM是哪种模式、有效电平又设置的是何种极性了。
  • 模式1:ARR小于CCRx时输出为“有效”电平,ARR大于CCRx时输出为“无效”电平。0 v( k/ G# H/ B7 J0 q2 D+ D( N
  • 模式2:ARR小于CCRx时输出为“无效”电平,ARR大于CCRx时输出为“有效”电平。, m, ^" g6 _/ p$ Z' x
    这里说的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。
7 S0 F: H5 D$ U* ?7 j3 {( T( V+ H% A& n5 n

3 m. t+ S. e; w4 Y* ~8 ~% Q 微信图片_20230921151503.png # N2 ^7 j4 b: ~' k7 b8 q

) e. D" |# C3 ?4 K: y1 g

5 h5 g1 y( r0 Y' ^3 g2 }6 G+ Q    上一小节讲过关于定时器参数的设置。使用定时器1的通道1来输出一路PWM波,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。
  C- x# [: _% X# k

0 J/ G4 s* `" f% M+ X+ j
/ c6 w# v5 G% b8 O, V
微信图片_20230921151459.png
$ z+ r1 b/ F: c0 V* A' K6 c  @
$ ~( U, p7 b3 x' A# t' W  L
7 o- R3 D. J% o) y
    下文具体分析上面的代码。+ k' b( g/ f, R) `4 m
    前面4-6行是用来配置GPIO口的。- W/ T. o  g! o) t4 v9 |' [% M

2 [+ u4 B! \  F. n8 c# u) N

' _* {! q( \+ \/ l3 a- J 微信图片_20230921151456.png 1 ~+ A% a+ r& m
( X- g8 q+ J4 a; b9 Q5 R

( g8 V! \0 t' O0 p$ i    这两行就是我上门提到的设置定时器的频率和重装载值。
% r" ]8 W+ K! D, Q: g
/ u: o  b5 @! f: z5 ]; T  D

& a3 c  B0 A; E4 y, n 微信图片_20230921151452.png
1 R! a  l8 k! O3 L" F! A' Y! C* }+ l# F1 j' [
  N; F/ z) Q3 e2 n
    这三行是用来设置PWM输出模式和设置通道的,通道是什么呢?简单地讲就是输出PWM波的GPIO口,代码一开始不是设置了PA8这个GPIO口嘛,这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。
$ B8 s3 v& i* _0 z; }2 v# v

! }2 }6 u2 L) ?# f  z9 C% a. s
( U" w  ^. q* D4 e1 P, Z
微信图片_20230921151449.png
& Q- Y% V0 j+ R- n  m' R0 d
' N3 o6 @( G0 Q6 `2 y  x, ~, y. f# p
* f* k( o6 h0 U# _
    这行代码是用来设置“有效电平”极性的,根据手册,当TIM1->CCER[1]这位置1时,有效电平为低电平,置0时有效电平为高电平,而默认情况下置0。; _, x. G9 c6 H! S' }6 h
8 h& E/ s! k0 f% O0 t
7 u+ t0 G7 j* }- O) h% g- M
微信图片_20230921151446.png
# i$ p' a5 e9 ]. `% r! q% ~
8 H  h5 V4 d2 {  m% O
7 F% J, G4 j4 r4 w) o7 C7 V
    这行代码只要对高级定时器进行设置,普通定时器无需设置。
, `) p" o* l3 G" y9 A' M* x
; b$ x/ e6 J" x+ N- g8 u) D

2 u  ^. Y( T+ g" h1 f) S; r+ R 微信图片_20230921151442.png
# `& `. C3 I4 o; F6 _2 ^
0 q# H0 u6 [& d& z3 N4 ]) V

4 N# z5 I! R# g6 g" _- C& ]    这行代码是用来使能ARPE,ARPE是什么呢,就是当它被置1时,你自己设置的CCRx会立即生效,如果它被置为0,那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了),而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。4 P/ g* ^. {9 U/ d  @; L
  l6 Q- }& ]& t
上面的代码里没有对CCRx进行设置,这是因为CCRx常常是一个变化的值,你可以在主函数中用一个for循环+if判断语句对它进行++或–的操作,从而达到连续改变CCRx值得目的,例如:
6 N% a# e9 ?- Z6 ~) ]$ \" X$ h. U4 M) C' P
1 q" H3 T! u% A% p9 ]6 Y- E
微信图片_20230921151438.png 9 H' x4 |1 p( p( |* ~8 ], E: o( Z
8 W; y6 A* g2 F- V. O! D
, t% j' W9 z# M+ l! F
    PWM波的周期是由定时器时钟频率和预装载值两者决定的,预装载值就是ARR。   5 A" A' k' T8 s
( n9 M/ U$ Y6 c/ i. W

: i8 d& V3 @2 q8 Q 预装载值PSC设置为899,那么,当定时器的当前值val从0增加到899时,一共经过了900个时钟周期,这900个时钟周期会产生一个PWM波形,也就是说900个定时器时钟周期才相当于一个PWM周期,那么PWM的频率就为72MHz/900=80KHz,周期为1/80KHz。1 T  p+ V" G2 [; w- \. _% t% I

7 D. o# W3 l) u+ D0 v$ Y. r
. s3 N/ X4 Q* o; O% Y0 U* ]" G9 @
收藏 评论0 发布时间:2023-9-21 15:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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