赞
踩
目录
本文主要介绍STM32高级控制定时器中的PWM波形功能,包括和PWM相关的寄存器配置,PWM的类型。还介绍如何使用STM32Cube配置PWM相关的参数,然后通过具体的实验来验证PWM功能。
脉冲宽度调制模式允许生成频率由TIMx_ ARR寄存器的值和由TIMx_CCRx寄存器。
PWM模式可以在每个通道上独立选择(每个OCx一个PWM输出),方法是在TIMx_CCMRx寄存器。必须通过设置来启用相应的预加载寄存器TIMx_CCMRx寄存器中的OCxPE位,以及最终的自动重新加载预加载寄存器(在上计数或中心对准模式)。
因为只有当发生更新事件时,预加载寄存器才会转移到影子寄存器发生时,在启动计数器之前,用户必须通过设置UG来初始化所有寄存器位。
OCx极性可使用TIMx_CCER寄存器中的CCxP位进行软件编程。它可以编程为有效高电平或有效低电平。OCx输出通过以下组合启用CCxE、CCxNE、MOE、OSSI和OSSR位(TIMx_CCER和TIMx_BDTR寄存器)。有关更多详细信息,请参阅TIMx_CCER寄存器说明。
在PWM模式(1或2)中,TIMx_CNT和TIMx_CCRx总是进行比较,以确TIMx_CCRxTIMx_CNT或TIMx_CNT TIMx_CCRx(取决于方向计数器的)。
定时器能够在边缘对齐模式或中心对齐模式下生成PWM取决于TIMx_ CR1寄存器中的CMS位。
1)递增配置
当TIMx_CR1寄存器中的DIR位为低电平时,上计数激活。提到递增计数模式。在以下示例中,我们考虑PWM模式1。参考PWM信号只要TIMx_CNT<TIMx_CCRx,OCxREF就高,否则它变低。如果TIMx_CCRx中的比较值大于自动重新加载值(TIMx_ARR中)则OCxREF被保持在“1”。如果比较值为0,则OCxRef保持在“0”。下图显示了一个示例中的一些边缘对齐PWM波形,其中
TIMx_ARR=8。
Edge-aligned PWM waveforms (ARR=8)
2)倒计数配置
当TIMx_CR1寄存器中的DIR位为高时,递减计数激活。提到递减计数模式在PWM模式1中,只要
TIMx_CNT>TIMx_CCRx,否则它变高。如果TIMx_CCRx中的比较值为大于TIMx_ARR中的自动重新加载值,则OCxREF保持在“1”。0%PWM在此模式下不可能。
当TIMx_CR1寄存器中的CMS位与“00”(所有剩余配置对OCxRef/OCx信号具有相同影响)。
计数器向上计数时、向下计数时或两者都设置比较标志根据CMS位配置向上和向下计数。中的方向位(DIR)TIMx_CR1寄存器由硬件更新,不得由软件更改。提到居中对齐模式(向上/向下计数)。
下图显示了一个示例中的一些中心对齐PWM波形,其中:
TIMx_ ARR=8
PWM模式是PWM模式1
当计数器与中心对齐相对应倒计时时,设置该标志为TIMx_CR1寄存器中的CMS=01选择模式1
中间对齐PWM 波形(ARR=8)
STM32Cube版本信息: STM32CubeMX 6.11
STM32 HAL版本信息: STM32Cube_FW_F1_V1.8.5
1)使用STM32Cube配置参数,选择内部Clock,配置为输出类型PWM
2) 配置主时钟参数
分频系数配置为71
系统主频时钟为:72M Hz, 分频系数配置为71,则TIME的主频为1M Hz
计数周期为9999
计数周期为9999,则计数周期为10ms
3)PWM通道参数,需要配置Pulse,默认配置为0,如果不改变该参数,PWM的输出占空比为0
配置完成工程后,就可以生成工程。tim.c是自动生成和Timer相关的函数库
参数介绍:
Pluse: 占空比
Channel: PWM输出通道
在tim.c文件中编写如下代码:
- void HAL_TIM_SetPWM_Pulse( uint32_t Pulse, uint32_t Channel)
- {
- TIM_OC_InitTypeDef sConfigOC = {0};
-
- sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = Pulse;
- sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
- sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
- sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
- sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
- if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, Channel) != HAL_OK)
- {
- Error_Handler();
- }
- }
创建Product文件夹,其和项目相关,创建pwm_ctrl.c文件,编写如下代码
代码第22行: 启动定时器
代码第23行:启动对应通道CH1的PWM
代码第24行:启动对应通道CH2的PWM
代码第26行:设置CH1占空间比为0
代码第27行:设置CH1占空间比为2500/10000
在pwm_ctrl.c文件,编写如下代码:
- /* USER CODE BEGIN Header */
- /**
- ******************************************************************************
- * @file : pwm_ctrl.c
- * @brief : pwm control library
- ******************************************************************************
- * @attention
- *
- * Copyright (c) tangmingfei2013@126.com 2024~2029.
- * All rights reserved.
- *
- *
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "pwm_ctrl.h"
- #include "tim.h"
-
- void pwm_ctrl_Init( void )
- {
- HAL_TIM_Base_Start( &htim8 );
- HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_1);
- HAL_TIM_PWM_Start( &htim8, TIM_CHANNEL_2);
-
- HAL_TIM_SetPWM_Pulse( 0, TIM_CHANNEL_1);
- HAL_TIM_SetPWM_Pulse( 2500, TIM_CHANNEL_2);
- }
-
-
-
- /* End of this file */
编译代码,然后将代码下载到板卡中,运行代码,并使用逻辑分析仪捕捉波形
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。