1.输出比较
输出比较模式允许定时器在特定条件下改变输出引脚状态。这些条件通常是定时器计数器达到某个预设的比较值(Compare Value)。
可以从下图看到,输出比较和输入捕获公用一个通道。同时也是操作CCR寄存器。
定时器输出比较的8种模式,一般用的都是PWM1
输出比较模式
一般我们都是采用PWM1模式进行PWM输出配置,那么根据PWM1就需要先配置CCR寄存器
PWM1:
1.CNT<OCXREF时,OCXREF为有效电平,
2.CNT>OCXREF时,OCXREF为无效电平,
OCXREF是用户设置的值,这样就可以调节PWM波。
配置步骤
步骤1
第一步:配置CCR寄存器值;
第二步:选择模式,前面讲到输出比较一共有八种模式,常规选择PWM1模式;
第三步:选择极性,是正极性,还是取反;
第四步:打开开关;
步骤2
第一步:打开MOE总开关
第二步:手动动态设置CCR1的值,回顾之前讲的预加载机制,CCR1修改时,先写入影子寄存器,后中断发生后才能加载到CCR寄存器,所以这里需要打开预加载开关,否则容易出错。
3.重点强调
我们在使能影子寄存器时,不单单只使能ARR(自动重装载寄存器)的还需要使能CCR。
反正一句话,只要是影子寄存器都要使能。
TIM_SetCompare1(TIM14,i);通过手动设置比较值进行PWM输出
配置设置:
void TIM14_CH1_PWM_Init(u16 per,u16 psc)
{
************************GIPO配置**********************************
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//使能TIM14时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//管脚复用
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用输出模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//管脚设置
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100M
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化结构体
****************************时基单元配置*****************************
TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStructure);
****************************PWM配置*****************************
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM14,&TIM_OCInitStructure); //输出比较通道1初始化
******************************特别要注意关闭影子寄存器************************************
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//使能预装载寄存器
TIM_Cmd(TIM14,ENABLE); //使能定时器
}
*****************************手动修改CRR即PWM值************************************
TIM_SetCompare1(TIM14,i);