TIM1比較模式

流水江湖發表於2024-06-28

暫不討論捕獲功能,簡化下面的描述方便閱讀理解。

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

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位

TIM1比較模式

透過CCMR暫存器中的OCM位可以看出來這兩種模式的一點區別。

輸出比較模式下: CCR = CNT 時,翻轉輸出電平。

PWM模式下: CNT < CCR時輸出一種電平,CNT > CCR時輸出相反的電平。

透過圖片來直觀的看看這兩種模式的區別。

TIM1比較模式

PWM模式下: ARR 決定輸出頻率 ,CCR決定輸出佔空比。

TIM1比較模式

輸出比較模式下: 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

相關文章