STM8S103F3--PWM配置


本文使用的芯片是是stm8s103f3。

以下主要說明配置TIM2通道1為PWM輸出的過程。

1.寄存器配置

clip_image004

4位預分頻器,計數器的計數頻率Fck_cnt=Fck_psc/2^(PSC[3:0])=16M/2^0=16M

那么計數周期為1/16us,也就是說計數器會每隔1/16us計數一次。

TIM2_PSCR=0x00; //分頻值=0 16M

clip_image006

自動重裝載寄存器,

當自動重裝載寄存器=0時,計數器處於阻塞狀態,也就是不計數狀態,因為當CNTR=ARR時,CNTR就會清零,所以配置時自動重裝載寄存器應該大於0。另外自動重裝載寄存器的值就是PWM波形的周期,比如ARR=0X0100,PWM的周期為0x0100*1/16=16us,PWM的周期就是16us

  TIM2_ARRH=0x01; //自動重裝的值 0x0100

  TIM2_ARRL=0x00;

clip_image008

捕獲/比較使能寄存器,這個寄存器的配置可以選通相應的Tim2通道。

bit5,bit4為ch2配置,bit1,bit0為ch1配置

如果當前OC1為輸出通道,則

bit1:OC1低電平有效

bit0:OC1信號被輸出到當前引腳上

  TIM2_CCER1=bit0|bit1; //low level,OC1

clip_image010

clip_image012

clip_image014

捕獲/比較模式寄存器,

bit1,bit0

CC1S[1:0]為捕獲/比較選擇

        00:CC1通道被配置為輸出

bit2保留

bit3輸出比較預加載使能

    0:不使能

    1:使能

bit6,bit5,bit4輸出比較模式

    110:PWM1模式

PWM1和PWM2模式區別

PWM1:CNT<CCR,CH1被激活

PWM2:CNT>CCR,CH1被激活

TIM2_CCMR1=bit3|bit5|bit6; //MODE

clip_image016

捕獲/比較寄存器,這個寄存器決定着PWM的占空比。CCR/ARR=PWM的占空比,例如設置為0x0060,那么占空比為0x0060/0x0100=6/16

  TIM2_CCR1H=0x00;

  TIM2_CCR1L=0x60;

clip_image018

中斷使能寄存器,如果需要中斷可以在此設置。

bit1:CC1E 捕獲/比較1中斷使能

    0:CC1 中斷不使能

    1:CC1中斷使能

  TIM2_IER=0x00; //更新中斷使能

clip_image020

控制寄存器,bit0控制計數器的打開和關閉。

bit0,計數器使能

    0:不使能

    1:使能

  TIM2_CR1=bit0; //enable counter

通過邏輯分析儀測試PD4管腳的輸出電平,波形圖如下所示。

clip_image022

源碼如下,

//*******************************************

 1 #define bit0 0x01 
 2 #define bit1 0x02 
 3 #define bit2 0x04 
 4 #define bit3 0x08 
 5 #define bit4 0x10 
 6 #define bit5 0x20 
 7 #define bit6 0x40 
 8 #define bit7 0x80
 9 
10   void Timer2_Init(void) 
11   { 
12     CLK_ICKR|=0x01;         //開啟內部HSI 
13    while(!(CLK_ICKR&0x02));//HSI准備就緒 
14     CLK_SWR=0xe1;           //HSI為主時鍾源 
15     CLK_CKDIVR=0x00;   //HSI,8分頻=16M 
16     TIM2_PSCR=0x00;       //分頻值=0 16M 
17     TIM2_ARRH=0x01;       //自動重裝的值 0x0100 
18    TIM2_ARRL=0x00; 
19    TIM2_CCER1=bit0|bit1; //low level,OC1
20  
21    TIM2_CCMR1=bit3|bit5|bit6;  //MODE 
22   TIM2_CCR1H=0x00; 
23    TIM2_CCR1L=0x60; 
24    TIM2_IER=0x00;        //更新中斷使能 
25 
26    TIM2_CR1=bit0;        //enable counter 
27  }
28 int main( void ) 
29 { 
30   Timer2_Init(); 
31   while(1){}; 
32 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM