天天看點

STM32之定時器PWM輸出

一、什麼是定時器

對于stm32f103系列單片機,其定時器是一個通過可程式設計預分頻器驅動的,16位自動裝載計數器。

  1. 可程式設計預分頻器驅動
  2. 計數器是16位的
  3. 自動裝載

二、STM32中的定時器

定時器種類 捕獲/比較通道 互補輸出 特殊應用場景
基本定時器(TIM6,TIM7) 主要應用于驅動DAC
通用定時器(TIM2~TIM5) 4 通用。定時器技術,PWM輸出,輸入捕獲,輸出比較
進階定時器(TIM1,TIM8) 4 帶死區控制盒緊急刹車,可應用于PWM電機控制

三、通用定時器基本原理

STM32之定時器PWM輸出
  1. 位于低速的APB1總線上
  2. 16位的,計數值在1到65535之間調節
  3. 支援向上、向下和向上/向下(也即中央對齊)3種計數模式;
  4. 重裝載值自動裝載
  5. 含有16位可程式設計預分頻器(也即TIMx_PSC寄存器),計數器時鐘頻率分頻系數可以在1到65535之間調節
  6. 含有4個獨立通道(也即CH1到CH4),每個通道都可以用來:輸入捕獲、輸出比較、pwm生成以及單脈沖模式輸出;
  7. 可以使用外部信号(TIMx_ETR)控制定時器之間的級聯
  8. 如下事件發生時産生中斷/DMA(6個獨立的IRQ/DMA請求生成器)
    • 更新事件,也即計數器向上或向下溢出;
    • 觸發事件,也即計數器啟動、停止、初始化等;
    • 輸入捕獲;
    • 輸出比較;
    • 支援針對定位的增量(正交)編碼器和霍爾傳感器電路
    • 觸發輸入作為外部時鐘,或者按周期的電流管理。
  9. 每個通用定時器都是完全獨立的,之間不共享任何資源,不會産生互相幹擾就制約。

四、時鐘系統

  1. STM32有5個時鐘源:HSI、HSE、LSI、LSE、PLL
    • HSI是高速内部時鐘,RC振蕩器,頻率約為8MHz,精度不高
    • HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者外接時鐘源,頻率範圍為4~16MHz
    • LSI是低速内部時鐘,RC振蕩器,頻率約為40kHz,提供低功耗時鐘。WDG
    • LSE是低速外部時鐘,接頻率為32.768kHz石英晶體。RTC
    • PLL為鎖相環倍頻輸出,其時鐘輸入可選擇HSI2、HSE或者HSE/2。倍頻可選擇2~16倍,但是其輸出頻率不超過72MHz
  2. 系統時鐘 SYSCLK可來源于三個時鐘源
    • HS振蕩器時鐘
    • HSE振蕩器時鐘
    • PLL時鐘
  3. STM32可以選擇一個時鐘信号輸出到MCO腳(PA8)上,可以選擇為PLL輸出的2分頻、HSI、HSE、或者系統時鐘
  4. 有2條總線,AHB總線和APB總線,APB總線又分為低速APB1總線和高速APB2總線
  5. 任何一個外設在使用之前,必須首先使能其相應的時鐘

五、計數器模式

通用定時器可以使用向上計數、向下計數、中央對齊(向上向下)計數模式。

Tout(溢出時間) = (ARR+1)(PSC+1) / Tclk

六、PWM輸出配置步驟

  1. 使能定時器3和相關IO口時鐘。
    • 使能定時器3時鐘:

      RCC_APB1PeriphClockCmd();

    • 使能GPIOB時鐘:

      RCC_APB2PeriphClockCmd();

  2. 初始化IO口為複用功能輸出。函數:

    GPIO_Init();

  3. 這裡我們是要把PB5用作定時器的PWM輸出引腳,是以要重映射配置,

    是以需要開啟AFIO時鐘。同時設定重映射。

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
               
  4. 初始化定時器:ARR,PSC等:

    TIM_TimeBaseInit();

    參數 代碼 備注
    計數 TIM_Period arr
    預分頻數 TIM_Prescaler psc
    時鐘分割 TIM_ClockDivision 通常用于輸入捕獲PWM直接等于0
    計數模式 TIM_CounterMode 向上、向下向上/向下
  5. 初始化輸出比較參數:

    TIM_OC2Init();

    參數 代碼 備注
    選擇定時器模式 TIM_OCMode TIM_OCMode_PWM2
    比較輸出使能 TIM_OutputState ENABLE/DISABLE
    輸出極性 TIM_OCPolarity 高/低
  6. 使能預裝載寄存器:

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  7. 使能定時器。

    TIM_Cmd();

  8. 不斷改變比較值CCRx,達到不同的占空比效果:

    TIM_SetCompare2();