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

STM32笔记(二)TIM模块产生PWM

[复制链接]
私奔 发布时间:2009-1-4 14:19
     这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。$ J! h) A; {$ @) N. F
  下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子,类似代码也可以参考ST的固件库中相应example
* W, ?4 N" U( o' L! KC语言: TIM1模块产生PWM,带死区/ i+ _0 G6 F& q0 ^* P! E
     //Step1.开启TIM和相应端口时钟
6 q) c5 @8 D: w//启动GPIO
' `3 b$ s5 I2 h3 B9 VRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \" |. [) a6 h: N6 |2 Z$ W( k
                       RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
) q) K& |9 ]" R9 `, j  x9 u                       ENABLE);; T& F: p! T( z  Y7 v5 ~7 \
//启动AFIO8 I" V: _' h5 t9 n( A
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
2 H" D% a# L8 K) O4 y% I: @6 V//启动TIM17 g  {) n9 @8 p2 _  n- d
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);3 L& M7 ?9 \: k- o7 O& M
9 ]% i- B& @  B0 d& k# M: M
//Step2. GPIO做相应设置,为AF输出
6 H: v) G8 u1 q( `- ]$ W//PA.8/9口设置为TIM1的OC1输出口
: B- F  a% k1 D2 k' ?# RGPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;. U& _+ y5 H* }" M! V/ v5 D* [
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  U# s: @" }" q4 r$ [  r3 B
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: S8 h. Y, t& B/ }# m0 F+ q
GPIO_Init(GPIOA, &GPIO_InitStructure);8 T( z& G$ z+ ~! r
* m5 w- a9 w  N5 }" c& S4 T
//PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口
$ X1 Z3 r  {4 s# C" pGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;6 U. i( b; L! c' z* V5 a* Y( u
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/ Z4 c7 s8 p$ m% D6 i
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
) F$ [: Q" K. b, _( `  n2 GGPIO_Init(GPIOB, &GPIO_InitStructure);: S; R/ f7 H7 F1 }" P* G! B
6 l' {/ A) @" l' G1 j9 r5 ~
//Step3. TIM模块初始化
5 c4 J: F5 Y( z* b5 h0 l& {% wvoid TIM_Configuration(void)
; R( _! W: {$ x& [% \/ I{
! a: W( V6 d( h: I3 h    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;9 D1 T/ I) X$ @. V; Q; g' o9 p
    TIM_OCInitTypeDef TIM_OCInitStructure;
$ g  Q5 Q# Z, A  y6 V    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
/ Q& O, w( Y5 ?1 C
" j6 E3 `2 t8 ^1 V  Q/ r% V    //TIM1基本计数器设置(设置PWM频率)
) c7 Q/ F  m& v1 n' U) W    //频率=TIM1_CLK/(ARR+1)
6 M1 e( o6 @1 D    TIM_BaseInitStructure.TIM_Period = 1000-1;$ ?* E. F% y; S9 A: f( ?7 Z2 Y
    TIM_BaseInitStructure.TIM_Prescaler = 72-1;
7 m) o, i4 J+ u. b& }4 k4 U2 h$ W    TIM_BaseInitStructure.TIM_ClockDivision = 0;
3 L2 R0 ?& r6 L8 k( C/ H3 Q. y3 B# f1 b    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  e& P" r% u6 m" b' x
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
  o3 Z. ^# s% w' d; \5 {# j    TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
8 X& g4 N5 x4 ~9 Z# v% h    //启用ARR的影子寄存器(直到产生更新事件才更改设置)
$ b# H: }: [: c0 a' A! J4 P  v    TIM_ARRPreloadConfig(TIM1, ENABLE);: |+ K5 Y0 E( ~" \; ^. B9 x8 J, _
8 k3 G7 _: E# i9 a6 N* |: I
! {: @5 _3 c# {& K: e0 {, @
    //TIM1_OC1模块设置(设置1通道占空比)6 S# Q4 q& A5 [1 b) w
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;1 @0 S. W! F$ m4 z. t
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;6 K8 g5 X8 W1 L5 e/ f* G
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
- ]3 C# r* K% H  c: N    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
. K6 B2 N0 P3 t/ c    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;9 N6 S+ J1 O, F6 ^' a0 M6 q) K! i
    TIM_OCInitStructure.TIM_Pulse = 120;
, I% x& b, ~% r. L0 q% P/ F$ M0 Z, Y    TIM_OC1Init(TIM1, &TIM_OCInitStructure);- k9 H: u5 n9 A, M0 P
    //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
2 r+ i7 \( ]" M5 v* Z  a    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);; @9 j& b+ N6 f7 a6 c3 p. H) e
$ h/ s1 ]# p( M8 b% D9 ^5 H
    //TIM2_OC2模块设置(设置2通道占空比)5 u6 i$ Q! Z2 |# v6 h  S3 F$ V* A
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
# F5 K2 N- O" C    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
- H; Q- j: N( C2 D! t    TIM_OCInitStructure.TIM_Pulse = 680;
3 ?; Q: L2 V$ h* o    TIM_OC2Init(TIM1, &TIM_OCInitStructure);
$ f7 f- Z( E3 E    //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)
( w& c: j0 P6 e/ D' X* Z3 D) Q/ Q3 }3 X    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
, q' d$ }/ A* r   
7 @. v6 W- [- F; A+ k* m: g" {    //死区设置
& ~9 P" ]  i- {6 B* W. ^7 P    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;' q% O+ l, g$ Z6 r. p' ~5 l4 ]
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;6 j2 p2 a8 l: b- q% e3 W
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;. z; C" X! ?' h1 g
    TIM_BDTRInitStructure.TIM_DeadTime = 0x90;  //这里调整死区大小0-0xff8 l  Z2 p& J' ]% k5 P
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;/ ]' Y/ S" I2 @* C# m
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;8 U& [8 l1 W- v) B$ {, B) U
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
: ]  Q1 D0 j" J, q    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
$ r0 q0 C/ ~0 z5 C; X4 s    ( G5 u1 m5 o& m
    //TIM1开启% }9 q: C% J) P& c) ?4 H' r
    TIM_Cmd(TIM1, ENABLE);
0 _9 D; t0 S  q4 v% \+ k6 t    //TIM1_OC通道输出PWM(一定要加)
& P* L0 t! c2 ~( D    TIM_CtrlPWMOutputs(TIM1, ENABLE);
5 ?# [" [9 j) P( u" V
; e& I0 e9 _; P  Z. M}
2 _9 K/ g" U" c( [

0 z" {; I, R' V; p: Z   % P- P2 [; @: M2 _$ r
  其实,PWM模块还可以有很多花样可以玩,比方在异常时(如CPU时钟有问题),可以紧急关闭输出,以免发生电路烧毁等严重事故。
收藏 1 评论7 发布时间:2009-1-4 14:19

举报

7个回答
chentingzt 回答时间:2009-2-18 15:05:37

RE:STM32笔记(二)TIM模块产生PWM

多谢大虾,好东西啊!
e_boys 回答时间:2009-8-12 13:45:36

RE:STM32笔记(二)TIM模块产生PWM

在吗???我试着用这你这个配置怎么没PWM输出呢??
e_boys 回答时间:2009-8-12 13:47:07

RE:STM32笔记(二)TIM模块产生PWM

大虾,帮帮忙呀!
PPWD 回答时间:2009-8-22 21:22:27

RE:STM32笔记(二)TIM模块产生PWM

为什么 随便 照着DATASHEET写的 东西 都是 原创 啊
0 }' s3 y( F- ^: N! B) ]" _那 我 不早是 发明家了 。。。。
tlw2007 回答时间:2011-4-17 21:59:47

RE:STM32笔记(二)TIM模块产生PWM

STM32定时器真的有点难学,强烈建议意法半导体公司出本好的手册讲解下。
WHWNG 回答时间:2014-2-16 12:30:49

回复:STM32笔记(二)TIM模块产生PWM

 多谢分享!
qimeiya 回答时间:2015-5-13 16:16:15
多谢分享!

所属标签

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