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

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

[复制链接]
私奔 发布时间:2009-1-4 14:19
     这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。: g: m7 j: G. ^  f4 M; L- T, t
  下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子,类似代码也可以参考ST的固件库中相应example
7 Y3 k- d6 K; u2 y  Z" I8 ~C语言: TIM1模块产生PWM,带死区
9 d9 K; w  Y6 y     //Step1.开启TIM和相应端口时钟- R8 u( |8 R: \
//启动GPIO
: n7 s8 q! u; |! BRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
8 p7 V3 X$ A& Y: u5 q                       RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\& Y6 ~7 Y1 M  X; }0 \7 ]
                       ENABLE);
" u$ R( w2 o7 l5 K& Z$ g//启动AFIO
8 j) ^9 _$ K- {- y1 m6 bRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
3 ?0 ^5 C: a! T7 X( d% L6 j//启动TIM1$ Q  b5 e1 \1 m) p. @% R+ N
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);5 }, p$ Q% M) L; \& }

2 S; {" g3 z6 K) z, g, r* Z//Step2. GPIO做相应设置,为AF输出
+ k( _2 k8 K  m0 z! N" s! I//PA.8/9口设置为TIM1的OC1输出口8 b- `0 q$ v) i! _4 L6 V; }- ~
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
3 g# M7 D- z7 FGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- E7 O2 H+ Q9 K0 @. l, o+ bGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;* B% Q, n' `; \: c; @
GPIO_Init(GPIOA, &GPIO_InitStructure);* L! I. l, W! c2 j& I, u! F2 U
6 N6 O1 D. |0 i( V* z
//PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口& b' w  B+ c% B! I) D; p$ C+ E- |
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;& a# H0 a1 `1 S- w
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;4 H" d* L. E7 p
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
1 A' K* ?" W; a& Y) l' \( E4 \) q# _GPIO_Init(GPIOB, &GPIO_InitStructure);
0 S0 D9 R9 I- {9 M# e2 K4 g9 c' p0 z
//Step3. TIM模块初始化( F- a0 S( z- T: }! m$ n8 h/ C
void TIM_Configuration(void)
) r- e. J! T  U{
1 k4 [8 w( Z: w/ _( P. U    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;4 {+ O1 J' x" ?& P% h
    TIM_OCInitTypeDef TIM_OCInitStructure;; @( R1 v4 _. Q
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
# ]! w( c, [0 u. s) h7 q5 \) N& V1 |/ L) }9 |6 ~/ A
    //TIM1基本计数器设置(设置PWM频率)( u# O# e' L0 n1 z9 t; f+ O- H
    //频率=TIM1_CLK/(ARR+1)1 H3 ]; z! O- Y) R* B6 a
    TIM_BaseInitStructure.TIM_Period = 1000-1;' d; w5 x+ I- s6 ]2 l8 ]
    TIM_BaseInitStructure.TIM_Prescaler = 72-1;) g2 |" J& t# G; }# ]$ ]
    TIM_BaseInitStructure.TIM_ClockDivision = 0;! |. S8 K" I+ z
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
4 H' k2 i2 L0 E# D: Z/ Z    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;0 T9 V. [: J$ @& ]0 ?6 Z' V
    TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);% [( s% @, c+ n/ d8 p$ C! X
    //启用ARR的影子寄存器(直到产生更新事件才更改设置)0 p# z) L4 v* y7 J$ T" H. a
    TIM_ARRPreloadConfig(TIM1, ENABLE);
4 O* T. v) k; l, M$ E( `( y9 i  R6 @1 \9 @

. t) a. F8 Q  [. P    //TIM1_OC1模块设置(设置1通道占空比)9 h) |# R1 y" m. w* d
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;" n) ^; n) I( H3 }) a
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
" S8 \' U1 n) U4 m/ W$ D  y    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;) \( ^4 ]7 x0 p* [4 ?6 I) ^% V4 B$ @( q
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
' i/ x) X$ y6 b/ K    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
5 N( S# P9 V7 ?7 T3 w: L    TIM_OCInitStructure.TIM_Pulse = 120;/ k: J) q) C2 }6 `% o( G
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
; ~: N. F4 c5 p, a2 Q    //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)) Y9 }7 `9 d, B7 z8 n; M( A
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);- y0 C# k6 ~) H/ `4 |' T% `& P

  E  Z$ O' \: t6 x& B! o6 a    //TIM2_OC2模块设置(设置2通道占空比)
+ T/ K- P$ i; \1 {/ i/ \& z& F    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
, m! n6 W* F' ~- L1 F    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
' I. X9 W- k+ s) S0 B    TIM_OCInitStructure.TIM_Pulse = 680;
. Q! q4 |/ N1 s& w6 H7 x    TIM_OC2Init(TIM1, &TIM_OCInitStructure);
4 w( b5 f+ h. M8 [7 l4 }    //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)( T6 ^! E( X  A+ p: e* b
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
+ m$ X0 M: `2 t) X    9 J4 j: p+ U  U8 h& g
    //死区设置6 ?8 w& b( W( {. E
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
$ o3 K; }9 m$ D; c8 a% V    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;4 \7 d) a, Y5 n$ d
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
0 D1 Q; V8 @3 _9 [    TIM_BDTRInitStructure.TIM_DeadTime = 0x90;  //这里调整死区大小0-0xff4 _! A. ~$ z5 B+ W) q
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;! Q7 Y' I% D$ m: Z; d
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  R- L0 [+ I! _+ f: x2 U% ]    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
0 K/ J/ W, H3 T    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);9 w+ \5 G" ?. k) D: a( B9 |( P
    " E1 O1 L) e2 u5 g( v8 Z
    //TIM1开启# T9 J: y; g1 w2 X/ |
    TIM_Cmd(TIM1, ENABLE);
( t3 h! y/ O+ D8 m$ [    //TIM1_OC通道输出PWM(一定要加)$ _, S  f( I* X1 k! K5 e. k( X: P
    TIM_CtrlPWMOutputs(TIM1, ENABLE);1 F" @$ m$ P6 }7 O& s

$ H" {" N/ l3 R" ]. {9 x0 W}: e, }# l: V5 m3 Z4 k8 [; r) p
& |; t0 p; D1 \8 f, f/ B! K4 A% p
   
* [, E" K0 P/ w! ^7 p  其实,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 z$ g: S' K! V% S8 J
那 我 不早是 发明家了 。。。。
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版