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

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

[复制链接]
STMCU-管管 发布时间:2020-10-16 15:13
STM32CubeMX配置定时器实现1KHz的PWM输出
6 l( R8 @" Y% q' y
1 C, ^8 l! g# c: m$ H
一、STM32CubeMX
: O* O3 T. u. P  U# ~STM32CubeMX是ST公司推出的自动创建工程及初始化代码的工具,适用于旗下所有STM32系列产品。此软件需要安装JAVA运行环境。6 ^2 R! U8 C, y5 B8 _
9 l9 ]/ K) ~- Z2 x" B6 J
% y4 V0 X! I" Z% H& j
二、TIM定时器
  l  O, `, j% x4 Q! \3 i* ]- Y4 z从参考手册可知STM32的定时器除了基本定时器(TIM6、TIM7)外,其他的都可以产生PWM输出,我们以TIM2定时器的CHANNEL2为例,输出1Khz的方波。

8 k$ `+ M0 F1 U9 @
11.png
# E$ N% w% G7 l7 N

: b- }0 q3 Y& o1 l从定时器图框中可以看出主要相关部分是计数器时钟的选择、时基单元以及PWM输出。
% G3 r9 O; S  F; e* H
12.png 5 `  f+ G2 c* O4 A+ ~, f4 f* ~4 G) l
在PWM输出模式下,当CNT(计数器当前值)小于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出低电平;当CNT(计数器当前值)大于等于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出高电平;因此,可以通过设置TIMx_ARR(自动重装值)确定周期、TIMx_CCRx寄存器设置占空比来调出固定的PWM波。# N5 @& m8 Z8 y2 y/ g& E" [; r
13.png 0 x$ K. @% [, U* j5 s, M1 m
, M; X; [/ u! N1 m) w! Y, p
参考手册里这一块大概就是说,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)由硬件更新,不要用软件修改它。- K6 T) O' b9 D' }4 h
14.png ! f5 D" r* l; ~6 Z8 J
捕获/比较模式寄存器由TIMx_CCMR1和TIMx_CCMR2组成。TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。该寄存器的某些位在不同模式下功能不一样,上面一层对应输出而下面一层对应输入。其中模式设置OCxM位,此位由3位组成,一共可以配置成7种模式,我们使用的是PWM模式,所以这三位必须为110/111。其作用在PWM输出模式下,确定PWM的模式、使能相应的预装载寄存器等操作。. o7 y  s/ H8 u4 k* k
15.png
  T! h" V+ o' ~* f
16.png * E/ l4 g+ m% C5 J& `
* `6 J* P/ S& M5 g
Bit1和Bit0在PWM输出模式下,确定PWM的的输出极性和输出使能。5 S' H+ S1 ~, ?* y8 N; K# Y+ s% ~0 r
17.png 1 c9 B# x& c6 `, k" v

5 s" x. k+ C- `' K# B; r$ XTIMx_CCR1寄存器确定PWM输出模式下比较的值。2 R' e8 [' p+ e3 W7 e8 H

" P7 I8 w6 \# T# k( @3 n三、STM32CubxMX配置$ K7 z' e$ ^. z; E/ v. u
使用定时器PWM功能,选择TIM2 CLock Source为Internal Clock,通道2选择PWM Generation CH2。

) u' k- E6 ?* L2 I8 E2 y6 S 18.png . Y5 L- j: p( ~- e( S5 C. _0 ~9 q
参数配置如图" @- }# h8 e( m3 \( K
19.png ( y# E1 q, N/ y
然后时钟源等配置不做过多说明,可以参见工程代码中的配置情况,点击生成代码,使用Keil打开。
4 a8 h2 o( j1 H- g! c
, L, g- Y+ G0 I

  c7 v" R& g" j6 v) \% l四、代码修改9 h& i( ?! n" o
Keil5打开工程代码后,添加调用HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2)函数,定义变量uint16_t dutyCycle = 0,然后while循环函数如下:
: M! C5 ?- y) }8 ]6 n' w
  1. while (1)1 y% L2 f+ G  y3 n3 s  R
  2.   {
    % Z/ B' E. n. |$ Z  C
  3.     /* USER CODE END WHILE */
    # d7 C3 \) U3 H+ W. C0 |
  4. 3 @/ J* g+ i- O- c8 v' N# n, ?
  5.     /* USER CODE BEGIN 3 */
    . D) g) H7 E" V$ o- g
  6.     while(dutyCycle < 1000)
    - K: {( W' n' I0 h8 [! K
  7.     {8 N( Z' B+ l1 Z* ]6 }
  8.       dutyCycle++;+ O( f$ r" s. O6 }! [& v; S3 U7 b$ t
  9.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);
    ! U& k/ c8 Q0 y, a% H- T9 n' x3 ^
  10.       HAL_Delay(1);4 A4 v1 j; S0 o8 I2 N! b
  11.     }4 a1 n0 p, ]* o; B. f- m8 N, N6 H
  12.     while(dutyCycle)
    : d  x" A# E6 B
  13.     {
    / m9 {  F; a3 o, Q/ B: B- g
  14.       dutyCycle--;6 g( x; b0 p. p) R
  15.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);% P( v! N' \5 b
  16.       HAL_Delay(1);
    1 J. O* G0 [8 p& r! Z! A1 g
  17.     }
    9 z8 @+ a1 j! ?' h+ p! ~; ]
  18.   }
复制代码

& B- D: t; O& [

& c! t( @  `+ b  N1 X/ L) q" U编译下载,使用示波器捕获即可看到1Khz的方波。
* V6 w9 H  J; j3 ~% t. I4 `
& M. O% l- w7 ?0 Z5 ]' N
收藏 3 评论1 发布时间:2020-10-16 15:13

举报

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