STM32标准库通用定时器PWM生成

STM32标准库通用定时器PWM生成

1. 初始化

void TIM2_Init()                                            // 定时器2初始化
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     // 使能定时器2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    // 使能GPIOA的时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;                    // 定义一个GPIO_InitTypeDef类型的结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;      // 定义一个TIM_TimeBaseInitTypeDef类型的结构体
	TIM_OCInitTypeDef TIM_OCInitStructure;                  // 定义一个TIM_OCInitTypeDef类型的结构体
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;               // 选择要控制的GPIO引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         // 设置引脚为复用推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       // 设置引脚速度为50MHz
	GPIO_Init(GPIOA,&GPIO_InitStructure);                   // 初始化GPIOA的引脚
	
	TIM_TimeBaseInitStructure.TIM_Period = 1000-1;          // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1;       // 设置用来作为TIM2时钟频率的预分频值
	TIM_TimeBaseInitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;    // 设置时钟分割
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置TIM2计数器的工作模式
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);              // 初始化TIM2
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               // 设置TIMx的通道的输出比较模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 设置输出比较状态
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;     // 设置输出比较极性
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);                 // 初始化TIM2通道3
	
	TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);        // 使能TIMx在CCR3上的预装载寄存器
	
	TIM_CtrlPWMOutputs(TIM2,ENABLE);                        // 使能TIMx的输出比较

	TIM_Cmd(TIM2,ENABLE);                                   // 使能TIM2
}

STM32通用定时器生成的PWM波形周期为 (STM32主频)/((TIM_Period+1)*(TIM_Prescaler+1))

  • TIM_OCMode:PWM的模式,有两种模式:TIM_OCMode_PWM1和TIM_OCMode_PWM2

    • TIM_OCMode_PWM1:向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT >TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

    • TIM_OCMode_PWM2:与TIM_OCMode_PWM1相反。在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT > TIMx_CCR1时通道1为有效电平,否则为无效电平。

  • TIM_OCNPolarity_High:PWM的输出极性

    • TIM_OCNPolarity_High:输出比较极性高

    • TIM_OCNPolarity_Low:输出比较极性低

PWM的模式不能单独讨论,必须要和对应的输出极性放在一起才有意义。

例如:设置输出极性为高,则在有效电平内,输出高电平;在无效电平内,输出低电平。设置输出极性为低,则在有效电平内,输出低电平;在无效电平内,输出高电平。是否决定有效电平和无效电平的,取决于PWM的模式。

在初始化通道时要注意,对应的通道有专门的函数名字,例如我这里使用的为TIM2的通道3,那么对应的函数名字为TIM_OC3Init与TIM_OC3PreloadConfig。

2. 设置PWM占空比

设置PWM占空比只需要一个函数:

  • void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)

    • 这里是通道3,如果为通道2,则需要使用函数TIM_SetCompare2,其余通道同理。

    • Compare3为要设置的占空比,实际占空比为(Compare3/TIM_Period)*100%。

posted @ 2024-03-08 09:50  T7H  阅读(59)  评论(0编辑  收藏  举报