STM32 TIM输出比较功能详解

输出比较简介:

●OC(Output Compare)输出比较
●输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
●每个高级定时器和通用定时器都拥有4个输出比较通道
●高级定时器的前3个通道额外拥有死区生成和互补输出的功能

PWM简介:

●PWM(Pulse Width Modulation)脉冲宽度调制
●在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
●PWM参数:
频率 = 1 / TS, 占空比 = TON / TS , 分辨率 = 占空比变化步距
图1
图1

STM32的输出比较:

输出比较通道(通用):
图2
OC引脚详见这里
输出比较模式:

图3

STM32的PWM:

PWM基本结构:

图4
PWM参数计算:

图5

STM32输出PWM:

STM32输出比较初始化:
常用初始化结构体:

typedef struct
{
  uint16_t TIM_OCMode; //输出比较模式
  uint16_t TIM_OutputState;//输出使能
  uint16_t TIM_Pulse; //设置CCR的值 
  uint16_t TIM_OCPolarity;//输出比较的极性    
} TIM_OCInitTypeDef;
字段 可选值
TIM_OCMode TIM_OCMode_Timing//冻结模式
TIM_OCMode_Active//匹配时置有效电平
TIM_OCMode_Inactive//匹配时置无效电平
TIM_OCMode_Toggle//匹配时电平翻转
TIM_OCMode_PWM1//PWM模式1
TIM_OCMode_PWM2//PWM模式2
TIM_OutputState TIM_OutputState_Enable//使能
TIM_OutputState_Disable//失能
TIM_Pulse 0x0000至 0xFFFF
TIM_OCPolarity TIM_OCPolarity_High//有效电平为高电平
TIM_OCPolarity_Low//有效电平为低电平

初始化结构体缺省补全:

TIM_OCInitStruct:指向需要补全结构体的指针
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct)

初始化函数:

TIM:要初始化的输出通道的定时器(其中 x 可以是 1、2、3、4、5 或 8)
TIM_OCInitStruct:初始化的结构体指针
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)//输出比较通道1初始化
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)//输出比较通道2初始化
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)//输出比较通道3初始化
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)//输出比较通道4初始化

STM32输出比较初始化步骤:
一:开启定时器和PWM输出引脚的时钟
二:初始化PWM输出引脚
三:初始化时基单元
四:初始化输出通道
五:开启定时器
以TIM2为例:

void PWM_Init()
{
	///
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	/*开启定时器和PWM输出引脚的时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
		
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;			/*初始化PWM输出引脚*/
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	///
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef PWM_Init;
	PWM_Init.TIM_ClockDivision=TIM_CKD_DIV1;
	PWM_Init.TIM_CounterMode=TIM_CounterMode_Up;/*初始化时基单元*/
	PWM_Init.TIM_Period=100-1;
	PWM_Init.TIM_Prescaler=36-1;
	PWM_Init.TIM_RepetitionCounter=0;
	
	TIM_TimeBaseInit(TIM2,&PWM_Init);
	
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;  /*初始化输出通道*/
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=0;
	TIM_OC3Init(TIM2,&TIM_OCInitStruct);
	
	TIM_Cmd(TIM2,ENABLE);/*开启定时器*/
}
物联沃分享整理
物联沃-IOTWORD物联网 » STM32 TIM输出比较功能详解

发表评论