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

STM32CubeMX配置定时器实现1KHz的PWM输出

[复制链接]
STMCU-管管 发布时间:2020-10-16 15:13
STM32CubeMX配置定时器实现1KHz的PWM输出
: z. T2 a9 a3 q% s* h. {
0 k0 D% B; Y, d; c+ w# ]
一、STM32CubeMX2 r/ f! J  o" N! o7 @$ X
STM32CubeMX是ST公司推出的自动创建工程及初始化代码的工具,适用于旗下所有STM32系列产品。此软件需要安装JAVA运行环境。8 V* a/ p/ t; [4 t: g! e/ N
4 v, a; n1 r  e1 {0 E

4 z5 \+ w5 |9 s. f) V9 |# S" D4 f二、TIM定时器5 v, G0 r  ~: M% W. v4 W" a
从参考手册可知STM32的定时器除了基本定时器(TIM6、TIM7)外,其他的都可以产生PWM输出,我们以TIM2定时器的CHANNEL2为例,输出1Khz的方波。
+ l; S. X3 ], A+ P9 K% C5 Z
11.png
& x2 Q) O3 q* f- L6 x) _. k
3 ^3 @  _# b+ M5 J: p' U% n1 H. L. j6 w& E
从定时器图框中可以看出主要相关部分是计数器时钟的选择、时基单元以及PWM输出。
: T$ d( x' H" |8 w6 @( k
12.png 2 i( m) e6 I0 A6 h
在PWM输出模式下,当CNT(计数器当前值)小于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出低电平;当CNT(计数器当前值)大于等于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出高电平;因此,可以通过设置TIMx_ARR(自动重装值)确定周期、TIMx_CCRx寄存器设置占空比来调出固定的PWM波。" J, ?! y) R8 G5 I7 r( k% v
13.png
& i  l3 x4 S$ z0 w$ L# r. p0 @

8 i& l7 T7 h; F; m& b4 |5 G参考手册里这一块大概就是说,PWM计数模式分为向上计数和向下计数模式,当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’;在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为高。如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为’1’。该模式下不能产生0%的PWM波形;当TIMx_CR1寄存器中的CMS位不为’00’时,为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位设置,比较标志可以在计数器向上计数时被置’1’、在计数器向下计数时被置’1’、或在计数器向上和向下计数时被置’1’。TIMx_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。2 ^4 z2 f8 x0 H3 F  Q6 t
14.png
% z( o8 h2 z5 g2 o( v; l
捕获/比较模式寄存器由TIMx_CCMR1和TIMx_CCMR2组成。TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。该寄存器的某些位在不同模式下功能不一样,上面一层对应输出而下面一层对应输入。其中模式设置OCxM位,此位由3位组成,一共可以配置成7种模式,我们使用的是PWM模式,所以这三位必须为110/111。其作用在PWM输出模式下,确定PWM的模式、使能相应的预装载寄存器等操作。
- |/ Q4 @- M  p# T
15.png % K' L) J; y& F' U  V6 {' w
16.png ( n0 C6 y; l6 p, O/ r8 ]

. ^3 O' C6 h+ D1 V& N1 _2 v$ ZBit1和Bit0在PWM输出模式下,确定PWM的的输出极性和输出使能。
3 [" N# `. f" ^! \. M# Z; Q( U
17.png 8 x  d. Q" k$ C$ V$ d  n. x

$ E" @+ H6 R5 m+ T& i' a4 WTIMx_CCR1寄存器确定PWM输出模式下比较的值。* `- f: `- J) G& B4 d* q7 i# B

/ e& B/ a! o, h5 h( W三、STM32CubxMX配置
; ^4 k4 a2 x& g. l* L4 i使用定时器PWM功能,选择TIM2 CLock Source为Internal Clock,通道2选择PWM Generation CH2。
4 s. ]! m3 n4 R
18.png # l1 }; o% l' h/ n% u; l
参数配置如图! P5 a3 |' b( M! M% y5 M* L
19.png
5 S, {) ]% P* z4 @4 l然后时钟源等配置不做过多说明,可以参见工程代码中的配置情况,点击生成代码,使用Keil打开。
& D( ?6 ]% \4 e! z
5 q# {# K. T* P: @- }% ?6 z
4 f, S5 N5 u/ [
四、代码修改
/ M7 n& ^: N( l% X: _$ }0 ^Keil5打开工程代码后,添加调用HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2)函数,定义变量uint16_t dutyCycle = 0,然后while循环函数如下:7 V  R2 Q4 B5 T4 b, `- F7 J
  1. while (1)$ s( b+ [- i& a- w) v2 ~
  2.   {
    " r" K4 S+ r9 q# j. x0 f. t  F
  3.     /* USER CODE END WHILE */  A- c( k: Z1 }7 ?

  4. $ x, A$ Z7 S& \' f
  5.     /* USER CODE BEGIN 3 */+ T: ^8 d8 [5 X1 W( c5 r
  6.     while(dutyCycle < 1000)* X  h! O( p, u: l9 D) U7 h/ y+ a8 t
  7.     {9 ~5 e- l( P6 E2 b) v: U
  8.       dutyCycle++;
    ' o$ }  L8 P% `) b; D6 J; q; }' {
  9.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);
    6 Z2 u1 e  L. ]8 g" o1 I: ?
  10.       HAL_Delay(1);
    / ^' E! b# X& z2 {9 a/ Q5 E
  11.     }
    , c% n. i! {' j1 ?7 t! g
  12.     while(dutyCycle)
    ! B" N9 m" U+ c2 x' h; D- M1 X1 _
  13.     {
    ! T0 l+ z; v. b4 L3 a, J
  14.       dutyCycle--;1 R% d6 E. a" h4 X' j& J: K0 o
  15.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);
    ' }& C" x0 t1 D+ [2 S, Y
  16.       HAL_Delay(1);
    - g1 x/ N7 f$ Z8 B, z3 `: |  x4 G* V
  17.     }$ P- z0 c9 v1 j/ M* ]
  18.   }
复制代码

& ~; u+ b5 f* X6 `" p4 a

+ [' |8 T$ F& b编译下载,使用示波器捕获即可看到1Khz的方波。$ T% ^% W  u  ~  Z' }' o4 ~0 U

- o  k) n( g7 O' }
赞 收藏 3 评论1 发布时间:2020-10-16 15:13

举报

1个回答
Fily 回答时间:2020-10-19 10:24:32
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版