STMCU小助手
发布时间:2022-4-17 21:54
|
01、PWM介绍( R8 g" H2 P3 [( R PWM定义:脉冲宽度调制(PulseWidthModulation,PWM)简称脉宽调制。通俗讲,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。9 Y: V9 n% E" Q6 y M I" t + {: l5 {8 Z: C* Z& P 占空比定义:占空比就是高电平所占整个周期的时间,如下图所示:
第一个PWM波,周期为10ms,高电平的时间为4ms,所以占空比为40%,同理第二个PWM波为60%,第三个为80%。& Q- S8 F+ G$ g3 n PWM的频率: PWM的频率的整个周期的倒数,所以说上图PWM的周期为1/0.01,也就是100HZ。改变PWM的频率是通过改变整个的周期实现的。所以通过改变高低电平总共的时间、改变高电平占总周期的比例就可以实现任意频率、任意占空比的PWM波。7 m. Q7 P: J$ j. h2 K 6 s" g! k* \+ Q PWM的用途和优点:电机调速、功率调制、PID调节、通信等等,配置简单、抗干扰能力强,从处理器到被控系统信号都是数字形式的,无需进行数模转换。并且让信号保持为数字形式可将噪声影响降到最小,噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响,这是PWM用于通信的主要原因。 . G& s( ~) X$ r2 r$ M 02、STM32的管脚复用 STM32没有专门的PWM引脚,所以使用IO口的复用模式。首先确认PWM功能的输出管脚,使用定时器9。从下面的框图中得知,timer9只有两个输出通道,所以timer9只能输出两路PWM。 & \. }, k) P' N; m
在STM32F207数据手册中的Alternatefunction mapping图片中,timer9的两个通道分别可以复用为PA2,PA3,PE5和PE6。 7 c2 d7 O* q4 w
: N" H- Q$ n7 f9 d; i& O 03、STM32输出PWM原理 下图中的①部分,在《STM32基础定时器详解》讲解过了,关于影子寄存器,也在《STM32影子寄存器》中讲述,下文不再赘述了。本文将重点在②部分,捕获/对比通道讲解,其中STM32的PWM就是利用对比通道实现的。 2 N4 w3 H+ c$ \6 K) N
Pulse Width Modulation mode allows you to generate a signal with afrequency determined by the value of the TIMx_ARR register and a dutycycle determined by the value of the TIMx_CCRx register。 节选自STM32F207 Reference manual手册5 {( m L5 `% v- c2 G( K$ a ( q4 E3 d: V; { 脉冲宽度调制模式可以生成一个信号,该信号频率由TIMx_ARR 寄存器值决定,其占空比则由TIMx_CCRx 寄存器值决定。, `! M6 d% L% C3 Z3 m( L2 C; Z: f% P 从下图可以看出,当CCR寄存器和CNT计数器数值一样时,会产生动作(改变通道对应的GPIO电平)。由于CNT溢出时,重载值由TIMx_ARR寄存器值决定的。所以说TIMx_ARR寄存器值决定周期,而TIMx_CCRx寄存器值决定CNT溢出时,经过多久会产生动作(改变通道对应的GPIO电平),也就是决定了占空比。 - c/ M7 h! ^6 g. ]" j* ~
以向上计数为例,重载值为ARR,比较值为CRRx' _6 b% d8 t& F* z' M * e: ?$ P( ]0 W$ r6 a# W8 M0 V5 c
上图可以看出:3 B: `$ H9 ? f$ L' X$ z 2 b2 h. O4 J) u. [ 1.0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平。 2.t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平。 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程至此一个PWM周期完成。 上图更加形象的说明了 1.信号频率由 TIMx_ARR 寄存器值决定。2 Q% m% y( F. K% ^2 F6 ~) }9 ^ 2.占空比则由 TIMx_CCRx 寄存器值决定。8 Z& l' ^. ~ l3 ~" M STM32输出PWM的过程:7 |( L7 U5 D: |; q 1、首先配置GPIO,配置定时器,具体参考一下代码。定时器配置参考《STM32基础定时器详解》。5 s3 c- |% G2 o3 I2 }# d & z3 _+ w; X, a' l, g% q* j 2、捕获/比较通道使能比较通道。( R5 U6 `9 B0 q9 R0 s
8 h' d/ v$ ^' B/ q. g+ E7 X( } 上图看到,①寄存器名字为:Capture/Compare1register。可以选择从②处输入捕获,也可以选择从从③中输出,也就是我们需要的PWM输出功能。选择捕获通道,还是选择比较通道,在框图中没有找到具体的说明,但在TIMx_CCMR1寄存器CC1S[1:0]控制位使能。 $ f$ P" x$ m, ~( g3 }5 ?- u% F
+ S j( T. L1 F7 p8 [/ r 3、使能完输出,就要配置PWM输出了
0 i& H3 h$ V* S5 i ①TIMx_CCMR1寄存器的OC1M[2:0]位,设置输出模式控制器 * X: e8 I i; s+ V 110:PWM模式1,111:PWM模式2。 ②计数器值TIMx_CNT与通道1捕获比较寄存器CCR1进行比较,通过比较结果输出有效电平和无效电平。 OC1REF=0 无效电平,OC1REF=1无效电平。) R5 |. o& ^. T# m8 P* K% ~2 L8 r ③通过输出模式控制器产生的信号。TIMx_CCER寄存器的CC1P位,设置输入/捕获通道1输出极性。 0:高电平有效,1:低电平有效。 ④TIMx_CCER:CC1E位控制输出使能电路,信号由此输出到对应引脚。 0:关闭,1:打开。 # S6 ?7 K# I: F* ^* V/ U( @ 首先对PWM模式1和PWM模式2进行介绍: 模式1 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。$ f6 h' b! I' r. v! J 模式2 4 [: d; `1 a" k 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。# k4 Y6 {& F; E% D; w TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。- k4 S3 o5 ~+ G( E" N$ g' U ; h+ q: Q1 K! |* _& J2 d PWM输出高低电平由TIMx_CCMR1:OC1M位和TIMx_CCER:CC1P位共同决定。- { G& a8 [4 R9 H8 L 总结下来:' S' G/ v1 c0 y8 O9 t 模式1: 3 h" L# i3 q; y ?! O CNT<CCR为有效电平//(OC1REF =1) $ W( t1 r" s! C4 \0 \ CNT>CCR为无效电平//(OC1REF =0)+ f4 N. T0 W& `( l: s- d) ]# P; V 模式2:$ b, n' T& H: Y3 |, T CNT<CCR为无效电平//(OC1REF =0)' m) E$ v& M/ c: U" T 5 ?( _2 V1 l( O# I% m# R1 A CNT>CCR为有效电平//(OC1REF =1)6 b. r% a C/ C6 H' d" P CC1P:' e( z- g$ `- f7 u# a3 Z 0:高电平有效 1:低电平有效2 l1 \' m) _' M* `$ F 04、STM32输出PWM配置. ]/ `# X; g/ z6 h+ x+ G. o* u( t 分析了原理,那么下面就分析STM32生成PWM的过程。 1、首先要将GPIO设置为复用输出3 \9 W/ k! y2 u$ z, y- q! [" u # h. Q m2 j: h# x! D0 l
2、配置定时器向上计数,配置定时器频率 + w r$ g3 v! ?8 K
3、配置PWM输出; @/ D, L5 A" R; [+ B 上面分析过程较为麻烦,ST提供了标准外设库,我们只需要配置TIM_OCInitTypeDef结构体即可。 ' V8 c( ~, V$ v6 K1 u% ^! H
其中TIM_Pulse可以在初始化时设置,设置完毕后,也可以通过以下接口再次更新。
4、使能定时器4 j( y. k0 L" j* q' k 6 Q3 [+ M7 K1 s9 R& {7 i! j6 J
使用timer9输出PWM的波形- b& E7 b7 F" Z e0 H
2 p0 t3 C: q( D% v ! m/ }% a" k' H) f* _ 6 A" q) x- @* E; s' s) a/ h$ S |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版