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

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

[复制链接]
私奔 发布时间:2009-1-4 14:19
     这个是STM32的PWM输出模式,STM32的TIM1模块是增强型的定时器模块,天生就是为电机控制而生,可以产生3组6路PWM,同时每组2路PWM为互补,并可以带有死区,可以用来驱动H桥。
9 `% y7 p- Y- h2 s1 z4 N/ z  下面的代码,是利用TIM1模块的1、2通道产生一共4路PWM的代码例子,类似代码也可以参考ST的固件库中相应example
+ ~# J9 Q. w. x) U* F8 Q4 @C语言: TIM1模块产生PWM,带死区
- F0 a5 l  P. f% q: y     //Step1.开启TIM和相应端口时钟6 i* p, n- S- @7 a! o
//启动GPIO
+ `, o2 d; R' [7 [* Q  P* V8 FRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
  w: C9 a& g( F                       RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
6 F% Q- `% H/ J" f                       ENABLE);
) `- }3 |$ A* [//启动AFIO
) E, p3 g( o6 Y# P. |: g4 g$ lRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);: r$ I2 B. M% [* K: _) y! g
//启动TIM11 k2 n& F7 x& ?- m+ Q
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);; E% x0 R1 g1 Z" v

# d& z# ~6 w, L% f3 u& U//Step2. GPIO做相应设置,为AF输出" J+ W, K. ?8 l
//PA.8/9口设置为TIM1的OC1输出口
( I% v6 h- s0 d0 M" P& lGPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;9 k, u. t8 s7 R& f
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
# v) f: x' `9 D* L  p# W* Q/ c9 \9 bGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;( p1 D2 @/ V" t- b& b. L
GPIO_Init(GPIOA, &GPIO_InitStructure);
1 u* S* @# C1 s- K' N2 C" s0 n' \, ?  Q% i! I) T, U
//PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口
: v/ j) D0 m# l. \; jGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
3 m  K7 U! S2 F* rGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
! D9 ^% l' y- rGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
( k. C; Q3 w1 i' n( j, QGPIO_Init(GPIOB, &GPIO_InitStructure);# K- t- C( G; |
! Z7 @: I( q3 N% G# R2 L
//Step3. TIM模块初始化0 K) p7 ~8 @( _# T) B
void TIM_Configuration(void)1 {) ~$ O- \/ ]/ v0 o/ e
{) i" {& c( D4 t# B
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
# ^0 b: n% H0 U% b0 ^! T    TIM_OCInitTypeDef TIM_OCInitStructure;3 \! K. H5 I$ Y; m
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
. p8 y8 P8 q# O+ w! K: x3 x
" h1 B; ]$ W9 u) N- N    //TIM1基本计数器设置(设置PWM频率)
% x! H, j, P, ]" n; w2 w8 u, G6 i    //频率=TIM1_CLK/(ARR+1)" Z$ L) I# ]$ \4 f6 J3 X
    TIM_BaseInitStructure.TIM_Period = 1000-1;( y( |; r% ~! }4 m% Y
    TIM_BaseInitStructure.TIM_Prescaler = 72-1;
' O% s; q( I$ @" D# k3 W/ Z" E0 G    TIM_BaseInitStructure.TIM_ClockDivision = 0;2 ]2 a9 [6 H" E! z' T
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
' q" J  Q: k% x; C+ d+ _    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
" B: n7 j0 r' ~7 P, i7 b  H    TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
+ R- M" P" R$ t! o6 @1 P    //启用ARR的影子寄存器(直到产生更新事件才更改设置)
2 Q7 i  z0 Z$ I3 _5 }+ g6 e    TIM_ARRPreloadConfig(TIM1, ENABLE);5 r4 T4 k( u6 z, O1 e
5 l5 F) q! I3 M; i  E+ N! ~$ o# }
2 K! [" w0 @1 c) k& S
    //TIM1_OC1模块设置(设置1通道占空比)
; \% q2 |$ G" j* U# E    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
6 h3 C" \+ j% R5 }+ g6 ^" [4 {    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
9 Z% A: [) ~1 ^4 l1 X, f    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
) |' k4 G) c+ ~2 e9 ~9 ]( q6 `    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
0 h. r7 g/ N8 ?0 p8 R' B2 Q. j2 Z    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;* B7 @( k6 f) ]) y, g0 m$ t/ ]  T
    TIM_OCInitStructure.TIM_Pulse = 120;
, I' R) |) d: d- z% ^7 ?    TIM_OC1Init(TIM1, &TIM_OCInitStructure);5 V3 [  U& \4 S$ R
    //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)6 z7 o+ H0 X- d+ N
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
+ Z$ g" l  O) q5 B; N
9 R& @; ?4 o! X) g: z    //TIM2_OC2模块设置(设置2通道占空比); ]9 M/ `9 H5 z" V9 B7 m. |3 a
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;2 d* |- \* B3 K; P
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;! E" b0 @7 j. P2 y5 S& c* w
    TIM_OCInitStructure.TIM_Pulse = 680;. {1 h% |; i5 `
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);
6 v4 w% \( O2 p4 S$ I5 {6 n/ v* i% o    //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)0 K# y) J9 x0 F
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);5 S, C/ X& g8 e
    * Z8 R1 d3 x' x8 ?
    //死区设置" C8 n! j/ \" r# b+ A
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;) T3 \$ V! k" q: Q3 o+ X' k1 F8 q
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
; n. q1 X$ h; y3 a& }, v" K1 \. O* K    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
9 F3 `# I5 `* t- k% ~    TIM_BDTRInitStructure.TIM_DeadTime = 0x90;  //这里调整死区大小0-0xff- C2 e. r# }& e
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
! n8 `# {+ J9 G    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
- \, n* E1 |% Q2 h    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;' y( B* Y* Z& E" n: |
    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);4 e) z+ U. V" r
   
4 T/ I, `6 p8 x+ A    //TIM1开启
$ a; M) Q. j+ e/ S, p    TIM_Cmd(TIM1, ENABLE);& x8 G- r/ e) f& L
    //TIM1_OC通道输出PWM(一定要加)/ ^8 v9 G  r) U* |' b! j
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
" o) |3 ?. b- G1 \" [1 T! k% h/ w$ T  ?8 Z! [
}
* I+ I" t/ S8 \8 ^; u2 m3 U: _

& J0 Y* x; m8 L   & t+ d2 ]0 D& j& E, P( C
  其实,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写的 东西 都是 原创 啊 3 a( H2 c* U8 k6 B$ B' e" P& ~
那 我 不早是 发明家了 。。。。
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 手机版