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

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

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

7 q0 R- B+ X; j8 T: R- _
% y1 ^, n2 Z" x8 F4 j: a
一、STM32CubeMX- t. `* I$ j6 Z4 B, e
STM32CubeMX是ST公司推出的自动创建工程及初始化代码的工具,适用于旗下所有STM32系列产品。此软件需要安装JAVA运行环境。6 M) H0 o! d4 X
( W0 x1 M7 `/ _, ~7 u4 z0 n
  T% d7 k+ H' X5 c5 y: g
二、TIM定时器
* u- s% A6 N& z7 Q' [3 h. z从参考手册可知STM32的定时器除了基本定时器(TIM6、TIM7)外,其他的都可以产生PWM输出,我们以TIM2定时器的CHANNEL2为例,输出1Khz的方波。

# {, i5 M8 j, }/ P7 t2 Y: A6 @6 L
11.png 9 n" e7 V/ p8 [* x

: W6 Q4 y0 q5 k# h  D& Q0 z从定时器图框中可以看出主要相关部分是计数器时钟的选择、时基单元以及PWM输出。
% Z& z* h+ `: C, k" |4 C
12.png
$ Y& z3 d# S0 F) m: T
在PWM输出模式下,当CNT(计数器当前值)小于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出低电平;当CNT(计数器当前值)大于等于CCRx(捕获/比较寄存器值)时,TIMx_CHx通道输出高电平;因此,可以通过设置TIMx_ARR(自动重装值)确定周期、TIMx_CCRx寄存器设置占空比来调出固定的PWM波。8 r5 T+ m; J3 f" R, |
13.png # ~+ x1 J* u# |0 `
4 W3 D$ W4 o2 Z% k% D
参考手册里这一块大概就是说,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 P; b) j7 ^1 y2 s& I
14.png / ^0 w' q+ O/ M
捕获/比较模式寄存器由TIMx_CCMR1和TIMx_CCMR2组成。TIMx_CCMR1控制CH1和CH2,TIMx_CCMR2控制CH3和CH4。该寄存器的某些位在不同模式下功能不一样,上面一层对应输出而下面一层对应输入。其中模式设置OCxM位,此位由3位组成,一共可以配置成7种模式,我们使用的是PWM模式,所以这三位必须为110/111。其作用在PWM输出模式下,确定PWM的模式、使能相应的预装载寄存器等操作。
) F9 V2 s- O4 T% T, q' @
15.png 6 }$ G+ f7 G; r  }0 Q2 ^
16.png
0 f. H  ]) ^  }4 w% E
* V2 W/ g1 A/ }7 ]( f" e$ v
Bit1和Bit0在PWM输出模式下,确定PWM的的输出极性和输出使能。
) m  i1 e8 |* H
17.png
# B2 U( `" V, R" S" O& c8 n' X
0 _4 g6 e5 T0 c+ p$ E
TIMx_CCR1寄存器确定PWM输出模式下比较的值。
, n! n2 q) Y& S/ M4 b) i0 a
8 `+ s& O/ `) s: }. ]三、STM32CubxMX配置
& }) v7 y) B. |9 X1 p& E) i使用定时器PWM功能,选择TIM2 CLock Source为Internal Clock,通道2选择PWM Generation CH2。
: r+ ]- T# m4 ^4 C
18.png
2 j  S& s# z5 ?$ |  ]8 K9 ~参数配置如图
3 W' I, E# X! J* R0 U* l 19.png
' D8 M3 |' `" p  L然后时钟源等配置不做过多说明,可以参见工程代码中的配置情况,点击生成代码,使用Keil打开。& J: b# M- P  ^; J$ C

. b" v" U3 |1 u& D0 y

# H9 {6 I# i+ L- E  p4 x四、代码修改6 }, I- u, K+ A3 Q6 ]
Keil5打开工程代码后,添加调用HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2)函数,定义变量uint16_t dutyCycle = 0,然后while循环函数如下:
. @& s, u) I0 x) \8 B% |' U
  1. while (1)0 ^9 }' n2 Z& l
  2.   {# U5 I9 o4 J8 x9 K( O
  3.     /* USER CODE END WHILE */: _  ]5 i5 q. B& H0 H4 n) N% O  t
  4. $ a/ ]1 Q, G- W5 [* |# [3 {
  5.     /* USER CODE BEGIN 3 *// `5 f  j/ v; `* C& n7 N1 @
  6.     while(dutyCycle < 1000)
    7 Z! ?1 B+ p+ p: f& U0 z2 c
  7.     {
    ' Z- H3 k( z: c$ Y' r/ P& O
  8.       dutyCycle++;
    " \) b) e, y. t. h  L  ]
  9.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);' _6 e/ L4 H; e( ?: T
  10.       HAL_Delay(1);
    0 L' |: y& |" t# M+ Y
  11.     }
    1 }* |/ e( D. B2 K) y: d4 E
  12.     while(dutyCycle)
    6 S- |6 l' A% s( Z% x0 B
  13.     {
    , \5 r% k7 @: n. m6 V5 v
  14.       dutyCycle--;) t8 v  l/ B5 K6 L0 L8 {
  15.       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, dutyCycle);( e/ N% u$ B' A% u* n! ]# q
  16.       HAL_Delay(1);
    8 N2 Q8 J$ `3 O* b4 T5 p, R3 c
  17.     }
    5 {) L1 Y/ }  c
  18.   }
复制代码

: T" [3 G, w4 N9 n
0 k! ^  J  H5 P7 G" m9 x
编译下载,使用示波器捕获即可看到1Khz的方波。
! k. o( P8 v) [% u6 X" e+ r7 M$ @7 Z, Z+ y# T7 r
赞 收藏 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 手机版