目录
概述
1 PWM模式介绍
2 PWM类型
2.1 PWM边缘对齐模式
2.2 PWM中心对齐模式
3 使用STM32Cube配置PWM
3.1 STM32Cube配置参数
3.2 生成Project
4 设置PWM占空比
4.1 函数介绍
4.3 函数源码
5 测试代码
5.1 编写测试代码
5.2 函数源码
6 运行代码
概述
本文主要介绍STM32高级控制定时器中的PWM波形功能,包括和PWM相关的寄存器配置,PWM的类型。还介绍如何使用STM32Cube配置PWM相关的参数,然后通过具体的实验来验证PWM功能。
1 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位。
2 PWM类型
2.1 PWM边缘对齐模式
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在此模式下不可能。
2.2 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)
3 使用STM32Cube配置PWM
STM32Cube版本信息: STM32CubeMX 6.11
STM32 HAL版本信息: STM32Cube_FW_F1_V1.8.5
3.1 STM32Cube配置参数
1)使用STM32Cube配置参数,选择内部Clock,配置为输出类型PWM
2) 配置主时钟参数
分频系数配置为71
系统主频时钟为:72M Hz, 分频系数配置为71,则TIME的主频为1M Hz
计数周期为9999
计数周期为9999,则计数周期为10ms
3)PWM通道参数,需要配置Pulse,默认配置为0,如果不改变该参数,PWM的输出占空比为0
3.2 生成Project
配置完成工程后,就可以生成工程。tim.c是自动生成和Timer相关的函数库
4 设置PWM占空比
4.1 函数介绍
参数介绍:
Pluse: 占空比
Channel: PWM输出通道
4.3 函数源码
在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();
}
}
5 测试代码
5.1 编写测试代码
创建Product文件夹,其和项目相关,创建pwm_ctrl.c文件,编写如下代码
代码第22行: 启动定时器
代码第23行:启动对应通道CH1的PWM
代码第24行:启动对应通道CH2的PWM
代码第26行:设置CH1占空间比为0
代码第27行:设置CH1占空间比为2500/10000
5.2 函数源码
在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 */
6 运行代码
编译代码,然后将代码下载到板卡中,运行代码,并使用逻辑分析仪捕捉波形