输出比较简介:
●OC(Output Compare)输出比较
●输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
●每个高级定时器和通用定时器都拥有4个输出比较通道
●高级定时器的前3个通道额外拥有死区生成和互补输出的功能
PWM简介:
●PWM(Pulse Width Modulation)脉冲宽度调制
●在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
●PWM参数:
频率 = 1 / TS, 占空比 = TON / TS , 分辨率 = 占空比变化步距
图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);/*开启定时器*/
}