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

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

[复制链接]
STMCU-管管 发布时间:2020-10-16 15:13
STM32CubeMX配置定时器实现1KHz的PWM输出

4 g7 L2 j4 D5 L- l. O

# g" a, C. U8 c3 Y* L一、STM32CubeMX
4 ]2 ?2 w7 J$ i5 G* ~+ A) rSTM32CubeMX是ST公司推出的自动创建工程及初始化代码的工具,适用于旗下所有STM32系列产品。此软件需要安装JAVA运行环境。9 f* i  @2 J2 B1 C, N; V& ], B
; A( E  f; a% H) V' ]0 M2 V
" P1 i% h& `2 t0 g; o& v/ L
二、TIM定时器
! l; j5 t, i+ O& P从参考手册可知STM32的定时器除了基本定时器(TIM6、TIM7)外,其他的都可以产生PWM输出,我们以TIM2定时器的CHANNEL2为例,输出1Khz的方波。
8 z  N$ k9 p# }$ |5 [
11.png
; r( s1 A# X3 Y  `3 \" A( \
# C0 v8 v! {. c0 D+ A1 m: W
从定时器图框中可以看出主要相关部分是计数器时钟的选择、时基单元以及PWM输出。0 U- a- b- ~( F# ]
12.png
8 D! N0 n9 K4 ^/ {% n
在PWM输出模式下,当CNT(计数器当前值)小于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出低电平;当CNT(计数器当前值)大于等于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出高电平;因此,可以通过设置TIMx_ARR(自动重装值)确定周期、TIMx_CCRx寄存器设置占空比来调出固定的PWM波。8 ^$ E- `% K- D
13.png 4 S* D0 s. _2 K0 m' [

  v- E  q% Y( y# b. o参考手册里这一块大概就是说,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)由硬件更新,不要用软件修改它。8 v6 I7 i& P& t' ]9 }
14.png
- @- `) y( \( G( N* M# l
捕获/比较模式寄存器由TIMx_CCMR1和TIMx_CCMR2组成。TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。该寄存器的某些位在不同模式下功能不一样,上面一层对应输出而下面一层对应输入。其中模式设置OCxM位,此位由3位组成,一共可以配置成7种模式,我们使用的是PWM模式,所以这三位必须为110/111。其作用在PWM输出模式下,确定PWM的模式、使能相应的预装载寄存器等操作。: B6 h! k6 l" y( ^  }
15.png
6 g" @. j6 k$ w/ r2 V
16.png 4 @/ e" e( ]# G# u1 C
# H7 j8 Z# W5 t
Bit1和Bit0在PWM输出模式下,确定PWM的的输出极性和输出使能。
+ o: x7 J0 ]( _$ d
17.png
9 L+ V- t& i+ t& o8 m! m- W

; r% h9 Q9 \$ \+ |5 iTIMx_CCR1寄存器确定PWM输出模式下比较的值。6 m( q: b4 W# c2 f

, R0 U3 a0 u+ K! J3 Z; w! a三、STM32CubxMX配置
# \6 G- m, o0 w, @3 P使用定时器PWM功能,选择TIM2 CLock Source为Internal Clock,通道2选择PWM Generation CH2。

% e8 a1 x! \" G 18.png - F' {5 P0 O$ ~
参数配置如图
5 P5 q$ ^7 Y, _ 19.png
( r- s6 J" g( Y- f- _. H/ O然后时钟源等配置不做过多说明,可以参见工程代码中的配置情况,点击生成代码,使用Keil打开。
" D7 y8 ?8 x; e3 ]% ]' e8 I
5 d: E$ U, B/ x

! I, e1 j+ t- l6 [四、代码修改
, O9 `% x% V; y% v: O1 M& FKeil5打开工程代码后,添加调用HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2)函数,定义变量uint16_t dutyCycle = 0,然后while循环函数如下:) |4 \. U6 ]# E7 k  o  z/ e
  1. while (1): g% e% u/ G+ w, a/ O, f8 r
  2.   {; D; T+ p5 b* l. d3 a- A
  3.     /* USER CODE END WHILE */8 F) b, N: @& H9 b4 _0 x
  4. 2 [& q+ C/ Q; P" n1 g
  5.     /* USER CODE BEGIN 3 */8 X( i9 N" r8 \; g
  6.     while(dutyCycle < 1000)
    " S, i  T' I: w8 }/ F$ g, [
  7.     {
    % ^" M* C6 |# m; b) P9 J0 m( y" ?
  8.       dutyCycle++;
    ! k; J  X' n# i: M: V: W
  9.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);
      D# C( J* `* G4 F& I, o' v4 w* `# G
  10.       HAL_Delay(1);" W- i4 D  ~7 S' X3 H# B( L
  11.     }
    ' [0 Y+ e2 q( L9 Z
  12.     while(dutyCycle)8 y5 x" n: G7 n
  13.     {
    8 N( `* s3 C, G& \) u
  14.       dutyCycle--;
    0 k9 [# Q! G) H+ ]; T
  15.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);3 r8 T- u8 j7 _- f. Y
  16.       HAL_Delay(1);
    - x* j& Y4 ?/ J( H7 ~$ Z8 l5 w
  17.     }
    - P/ N. V" B+ {' r
  18.   }
复制代码

. |3 s6 w. w' l" @% R: h

2 V  m1 ^) r& r编译下载,使用示波器捕获即可看到1Khz的方波。
% q2 J- p( X7 H/ }& u
9 _8 V4 f& E& e* O
收藏 3 评论1 发布时间:2020-10-16 15:13

举报

1个回答
Fily 回答时间:2020-10-19 10:24:32
提示: 作者被禁止或删除 内容自动屏蔽
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版