第七章:STM32CubeMx普通PWM基本使用方法 STM32CubeMx 普通PWM基本使用方法 本文实例说明: 这里是使用 TIM3_CH2输出 一个频率为50kHz;占空比为50% 的PWM信号。 1 先配置STM32CubeMX 参数,如图:
- A3 ~0 w/ j+ n; b
重点说明: PWM 频率 = APB1 Timerclocks (MHz) / [(Prescaler+1) * (Counter Period+1)] APB1 Timer clocks (MHz) :64MHz Counter Period : 20 Prescaler :设置为64-1 那么此时PWM时钟设置为: f = 64000000 / 64 /20 = 50KHz Pulse :设置为10 ,也就是占比为:10/20 = 50% Fast Mode:如果频率太高可以使能快速模式。可以大大提高PWM反应时间;同时将IO口输出速度调高。 2 代码分析: - static void MX_TIM3_Init(void)
1 X5 P# A! E% p) q4 ~) z# L# z - {
5 Y' n* v* ~* Q: y( y% N% j' _
! r0 ]8 A: f; L! a) E- /* USER CODE BEGIN TIM3_Init 0 */
5 Q0 s7 n8 H; ^" D+ w: J$ i( _; w3 ` - - ^: ~# M5 D5 c! T, V; z0 k, S, d
- /* USER CODE END TIM3_Init 0 */
# N, U: Z, B/ r3 K - ' W" _. R0 [9 g- a W9 Q
- TIM_MasterConfigTypeDef sMasterConfig = {0};
5 q; C, o4 T' T# l - TIM_OC_InitTypeDef sConfigOC = {0};
/ y8 Y3 e$ N. R, H* J; i - {1 p( N# F) {4 j" l6 J8 I
- /* USER CODE BEGIN TIM3_Init 1 */. f# e! f: `" N+ c; `6 o- O" S
- P' c) z4 E4 d
- /* USER CODE END TIM3_Init 1 */! C8 D7 G! P7 C( [0 A0 a
- htim3.Instance = TIM3;
( K( p" ?' P% t7 M: |; ? - htim3.Init.Prescaler = 64-1;
- R7 a' x% D$ p: {$ X2 p - htim3.Init.CounterMode = TIM_COUNTERMODE_UP;# G" C' I9 S% W6 `
- htim3.Init.Period = 20-1;
. {' I5 x8 Y) E+ a9 P) S; Z4 a - htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;8 a: @/ `: O4 y
- htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
4 g( S. u9 d1 l - if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
2 y5 b# K9 E7 i' P- o$ P% s4 q; [9 a n - {
# H$ B& w, Q* k3 ]+ F$ S - Error_Handler(); L [: u, d/ q' \
- }
- @0 a1 [8 G/ ?5 F1 V% w - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;% \! Q5 v( [+ C2 c5 @1 H3 ?9 X
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
0 }& J3 C+ _& l( h' {" Z - if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)- `' q6 p1 I. X4 E t; e2 G" n8 k
- {; i( G" q% @; k' d/ R @& C
- Error_Handler();6 B* W! t5 Q0 S9 E |
- }
; N4 S; t! z" W$ S% d; ^" [( J4 A - sConfigOC.OCMode = TIM_OCMODE_PWM1;% t$ o, } [5 R4 L; W; v3 Q# P
- sConfigOC.Pulse = 10;
: B7 a% y9 X' e( T9 v4 _ - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
* K& n4 ~! \ w - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
5 Y' f2 x( }4 V9 l" R2 R - if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
, Y& V, V7 u1 g* \ - {2 {5 _! N6 v0 a' X
- Error_Handler();1 `- U4 q/ z1 M
- }# ]' z& T" O" c, N2 s9 J
- /* USER CODE BEGIN TIM3_Init 2 */
/ Y" q, r; v7 M4 j; H( z& x - HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); //启动PWM输出函数
% Z& @) B) m' T, e# p - __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 10);//这个函数可以设置占空比
: w, t3 V% i2 Y7 ~/ l& ? - /* USER CODE END TIM3_Init 2 */
* [1 o% }. [! x! X1 E, H. X - HAL_TIM_MspPostInit(&htim3);
6 _; D$ ^; g2 h5 N9 R* A - % m3 T) X0 x, s- `8 D, w8 V
- }
复制代码
7 B0 w* ?( Q0 [1 ~2 w
3 实验现象: 文章出处: LinuxARM 电子爱好者 Z$ Z% f( U% D V* ~' a% N
|