stm32寄存器版學習筆記05 PWM


  STM32除TIM6和TIM7外都可以產生PWM輸出。高級定時器TIM1和TIM8可以同時產生7路PWM,通用定時器可以產生4路PWM輸出。

1.TIM1 CH1輸出PWM配置步驟

①開啟TIM1時鍾,配置PA8為復用輸出

  APB2外設時鍾使能寄存器(RCC_APB2ENR)

  APB1外設復位寄存器 (RCC_APB1RSTR)

置1開啟。清0關閉。

  Eg:RCC->APB2ENR|=1<<11;  //使能TIM1時鍾

配置I/O口: 參見stm32寄存器版學習筆記01 GPIO口的配置

  Eg:GPIOA->CRH&=0XFFFFFFF0;  //PA8清除之前的設置

     GPIOA->CRH|=0X0000000B;  //PA8復用功能輸出

 

②設置TIM1的ARR和PSC

  自動重裝載寄存器(TIMx_ARR) 

  TIM1和TIM8預分頻器(TIMx_PSC)

 

③設置TIM1_CH1的PWM模式及通道方向

  TIM1和TIM8捕獲/比較模式寄存器1(TIMx_CCMR1)

輸出比較模式

 

 

 

 

 

 

 

 

  

 

 

  Eg:TIM1->CCMR1|= 7<<4;  //CH1 PWM2模式

     TIM1->CCMR1|= 1<<3;  //CH1預裝載使能

     CH1為輸出,CC1S[1:0] 默認為00.

 

④使能TIM1的CH1輸出,使能TIM1

設置TIM1_CCER來開啟TIM1的通道1的輸出。設置TIM1_CR1來開啟TIM1的時鍾。

  TIM1和TIM8捕獲/比較使能寄存器(TIMx_CCER)

  Eg:TIM1->CCER|= 1<<3;  //OC1輸出使能

  TIM1和TIM8控制寄存器1(TIMx_CR1)

ARPE:自動重裝載預裝載允許位  0:TIMx_ARR寄存器沒有緩沖; 1:TIMx_ARR寄存器被裝入緩沖器。

CEN:使能計數器  位0 0:禁止計數器; 1:使能計數器。

  Eg:TIM1->CR1=0x0080;  //ARPE使能

     TIM1->CR1|=0X01;  //使能定時器1

 

⑤設置MOE輸出,使能PWM輸出

  普通定時器在完成以上設置后可以輸出PWM,但高級定時器要使能剎車和死區寄存器。

  TIM1和TIM8剎車和死區寄存器(TIMx_BDTR)

  Eg:TIM1->BDTR|=1<<15;  //MOE主輸出使能

 

⑥修改TIM1_CCR1來控制占空比

  Eg:#define PWM_VAL TIM1->CCR1 (可以直接設置)

2.TIMx復用功能重印象

 

……

3.高級定時器TIM1輸出PWM應用

 1 //timer.c  2 //TIM1_CH1 PWM輸出初始化
 3 //arr:自動重裝值
 4 //psc:時鍾預分頻數
 5 void TIM1_PWM_Init(u16 arr,u16 psc)
 6 {                              
 7     //此部分需手動修改IO口設置
 8     RCC->APB2ENR|=1<<11;     //TIM1時鍾使能    
 9     GPIOA->CRH&=0XFFFFFFF0;    //PA8清除之前的設置
10     GPIOA->CRH|=0X0000000B;    //復用功能輸出 
11     
12     TIM1->ARR=arr;            //設定計數器自動重裝值 
13     TIM1->PSC=psc;            //預分頻器設置
14   
15     TIM1->CCMR1|=7<<4;      //CH1 PWM2模式         
16     TIM1->CCMR1|=1<<3;         //CH1預裝載使能     
17      TIM1->CCER|=1<<0;       //OC1 輸出使能       
18     TIM1->BDTR|=1<<15;       //MOE 主輸出使能       
19 
20     TIM1->CR1=0x0080;       //ARPE使能 
21     TIM1->CR1|=0x01;        //使能定時器1                                           
22 }  
1 //timer.h
2 #ifndef __TIMER_H
3 #define __TIMER_H
4 #include "sys.h" 
5 //通過改變TIM1->CCR1的值來改變占空比,從而控制LED0的亮度
6 #define LED0_PWM_VAL TIM1->CCR1     
7 
8 void TIM1_PWM_Init(u16 arr,u16 psc);
9 #endif

 

4.普通定時器TIM2輸出2路PWM 應用

 1 //TIM2_CH3~4 PWM輸出初始化
 2 //arr:自動重裝值
 3 //psc:時鍾預分頻數
 4 void TIM2_PWM_Init(u16 arr,u16 psc)
 5 {                              
 6     //此部分需手動修改IO口設置
 7     RCC->APB1ENR|=1<<0;     //TIM2時鍾使能    
 8     GPIOA->CRL&=0XFFFF00FF;    //PA2-3清除之前的設置
 9     GPIOA->CRL|=0X0000BB00;    //復用功能輸出 
10     
11     TIM2->ARR=arr;            //設定計數器自動重裝值 
12     TIM2->PSC=psc;            //預分頻器設置
13   
14     
15     TIM2->CCMR2|=7<<4;      //CH3 PWM2模式(輸出)
16     TIM2->CCMR2|=1<<3;         //CH3預裝載使能
17     TIM2->CCER|=1<<8;       //OC3 輸出使能
18     
19     TIM2->CCMR2|=7<<12;      //CH4 PWM2模式(輸出)         
20     TIM2->CCMR2|=1<<11;     //CH4預裝載使能    
21     TIM2->CCER|=1<<12;       //OC4 輸出使能
22 
23     TIM2->CR1=0x0080;       //ARPE使能 
24     TIM2->CR1|=0x01;        //使能定時器2                                                       
25 }  
26 
27 
28 //設定占空比 duty<899
29 //設置多少就是多少低的
30 void pwm_duty1(u16 duty)
31 {
32     
33     TIM2->CCR3=duty;
34 }
35 
36 void pwm_duty2(u16 duty)
37 {                      
38     TIM2->CCR4=duty;
39 }

 

5.普通定時器TIM3輸出2路PWM 應用

 1 //timer.c
 2 //TIM3_CH1~2 PWM輸出初始化
 3 //arr:自動重裝值
 4 //psc:時鍾預分頻數
 5 void TIM3_PWM_Init(u16 arr,u16 psc)
 6 {                              
 7     //此部分需手動修改IO口設置
 8     RCC->APB1ENR|=1<<1;     //TIM3時鍾使能    
 9     GPIOA->CRL&=0X00FFFFFF;    //PA6-7清除之前的設置
10     GPIOA->CRL|=0XBB000000;    //復用功能輸出 
11     
12     TIM3->ARR=arr;            //設定計數器自動重裝值 
13     TIM3->PSC=psc;            //預分頻器設置
14     
15     TIM3->CCMR1|=7<<4;      //CH1 PWM2模式(輸出)
16     TIM3->CCMR1|=1<<3;         //CH1預裝載使能
17     TIM3->CCER|=1<<0;       //OC1 輸出使能
18     
19     TIM3->CCMR1|=7<<12;      //CH2 PWM2模式(輸出)         
20     TIM3->CCMR1|=1<<11;     //CH2預裝載使能    
21     TIM3->CCER|=1<<4;       //OC2 輸出使能
22 
23     TIM3->CR1=0x0080;       //ARPE使能 
24     TIM3->CR1|=0x01;        //使能定時器3                                                       
25 } 
26 void pwm_duty3(u16 duty)
27 {
28     
29     PWM3_PWM_VAL=duty;
30 }
31 
32 void pwm_duty4(u16 duty)
33 {                      
34     PWM4_PWM_VAL=duty;
35 }
36 
37 //timer.h
38 #define PWM3_PWM_VAL TIM3->CCR1
39 #define PWM4_PWM_VAL TIM3->CCR2

 

切記在主函數前添加輸出化函數!

Eg:TIM2_PWM_Init(899,0);//不分頻。PWM頻率=72000/(899+1)=80Khz 

 


免責聲明!

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



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