TIM1比较模式

暂不讨论捕获功能,简化下面的描述方便阅读理解。

--------------------------------------------------------------------------------

13.4.14 TIM1  比较寄存器 1(TIMx_CCR1)    

CCR1[15:0]: 比较通道1的值 (Compare 1 value) 

若CC1 通道配置为输出:CCR1包含了装入比较1寄存器的值(预装载值)。

void TIM_SetCompare1(TIM_TypeDef* TIMx, u16 Compare1)
{
  /* Check the parameters */
  assert_param(IS_TIM_123458_PERIPH(TIMx));

  /* Set the Capture Compare1 Register value */
  TIMx->CCR1 = Compare1;
}

如果在TIMx_CCMR1寄存器(OC1PE位)中未选择预装载功能,写入的数值会立即传输至当前寄存器中。

否则只有当更新事件()发生时,此预装载值才传输至当前比较1寄存器中。

 

当前比较寄存器参与同计数器TIMx_CNT的比较,并在OC1端口上产生输出信号

 

--------------------------------------------------------------------------------

13.4.10 TIM1 和TIM8 计数器(TIMx_CNT)

CNT[15:0]:计数器的值 (Counter value) 

TIMx->CNT 是定时器配置好分频、ARR之后自动按节拍加减的数值。

 

--------------------------------------------------------------------------------

13.4.12 TIM1 和TIM8 自动重装载寄存器(TIMx_ARR)

自动重装载的值 (Prescaler value) 位15:0
ARR包含了将要装载入实际的自动重装载寄存器的值。
详细参考13.3.1节:有关ARR的更新和动作。当自动重装载的值为空时,计数器不工作。

void TIM_SetAutoreload(TIM_TypeDef* TIMx, u16 Autoreload)
{
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));

  /* Set the Autoreload Register value */
  TIMx->ARR = Autoreload;
}

 

--------------------------------------------------------------------------------

STM32 输出方波的方法有两种比较类似的,一个是PWM模式,一个是输出比较模式。下面来看看这两种模式的不同处在哪。

CCMRx寄存器

OCxM=000输出保持电平

OCxM=001输出有效电平

OCxM=010输出无效电平

OCxM=011输出翻转电平

CCER寄存器

CCxP位

 

 

通过CCMR寄存器中的OCM位可以看出来这两种模式的一点区别。

输出比较模式下: CCR = CNT 时,翻转输出电平。

PWM模式下:   CNT < CCR时输出一种电平,CNT > CCR时输出相反的电平。

通过图片来直观的看看这两种模式的区别。

 

PWM模式下: ARR 决定输出频率 ,CCR决定输出占空比。

输出比较模式下:  ARR 决定输出频率 CCRx 决定每个通道的初始相位。

两种模式下最主要的差别就是CCR值代表的含义不一样。PWM模式下CCR可以控制占空比。输出比较模式下CCR可以控制初始相位。

下面通过一个程序来对比一下这两种模式

#include "pwm.h"
 
void TIM3_PWM_Init( u16 arr, u16 psc )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
 
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );							//使能定时器3时钟
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );	//使能GPIO和AFIO复用功能模块时钟
 
    //设置TIM3 CH3 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure );
    //初始化TIM3
    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );
    //初始化TIM3_CH3  PWM 模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC3Init( TIM3, &TIM_OCInitStructure );
    //使能TIM3在CCR2上的预装载寄存器
    TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Enable );
    //使能TIM3
    TIM_Cmd( TIM3, ENABLE );
}
 
void TIM3_CMP_Init( u16 arr, u16 psc )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
 
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );	//使能定时器3时钟  
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );	//使能GPIOC时钟
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    //初始化TIM3
    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );
 
    //初始化TIM3_CH4 比较 模式  输出比较翻转触发模式(当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)   
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
		
    TIM_OC4Init( TIM3, &TIM_OCInitStructure );
    TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Enable );
 
    //使能TIM3
    TIM_Cmd( TIM3, ENABLE );
}

输出比较模式的占空比为50%,是固定的不能修改占空比。

通过上面实验可以看到,这两种模式的主要差别是。

PWM模式: ARR设置频率,CCR设置占空比,频率和占空比可以任意设置,起始相位不能设置。

输出比较模式:ARR设置频率,CCR设置相位,频率和起始相位可以任意设置,占空比不能设置。输出频率为理论计算值一半
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_20222919/article/details/106564957

posted @ 2024-06-28 01:12  流水江湖  阅读(2)  评论(0编辑  收藏  举报