天天看點

STM32定時器輸出PWMSTM32定時器輸出PWMSTM32定時器TIM3使用PWM模式

STM32定時器輸出PWM

STM32定時器輸出PWMSTM32定時器輸出PWMSTM32定時器TIM3使用PWM模式

我們設定ARR值,就是設定CNT的上限,設定CCRX的值就是設定了一個臨界點,CNT是一直随時間變化而變化的,當CNT>CCRX的時候輸出 高/低電平 當CNT<CCRX的時候輸出相反的電平,當CNT達到上限時,下一刻就變成0了。又開始CNT小于或者大于兩種狀态。

CNT從0到ARR是一個周期

CNT<CCRX輸出高/低

CNT>CCRX輸出低/高

隻要TIM不關閉,CNT就一直循環上面兩個狀态。這樣就形成了PWM

PWM周期:ARR決定

PWM占空比:CCRX決定

STM32定時器TIM3使用PWM模式

代碼中相關寄存器和一些時鐘的配置:

1:打開TIM3時鐘

2:因為想使用PB5作為輸出腳是以打開複用時鐘

3:設定TIM3 CH2的部分映射

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
AFIO->MAPR&=0XFFFFF3FF;
AFIO->MAPR|=1<<11;PA7-->>PB5
           

4:使能GPIOB,設定GPIO_PB5為複用推挽輸出設定GPIO的速率為最大50MHZ

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_INIT;
GPIO_INIT.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_INIT.GPIO_Pin=GPIO_Pin_5;
GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_INIT);
           

5:設定計數器自動重裝值,預分頻器值,設定TIM CH2為PWM模式,預裝載使能,輸出使能,計數使能

TIM3->ARR=25; //設定計數器自動重裝值
TIM3->PSC=72; //預分頻器不分頻
TIM3->CCMR1|=7<<12; //CH2 PWM2 模式
TIM3->CCMR1|=1<<11; //CH2 預裝載使能 
TIM3->CCER|=1<<4; //OC2 輸出使能 
TIM3->CR1=0x0080; //ARPE 使能
TIM3->CR1|=0x01; //使能定時器 3
           

6:我們可以通過改變CCR2的值設定PWM占空比

7:可以通過改變ARR值改變PWM周期

總結:這個可以把之前的用延遲做的PWM改成用通用定時器做的。因為定時器做的PWM不占用主循環,硬體自動輸出。我們隻要改變寄存器的值就可以控制PWM。軟體延遲做的話,需要占用主循環,不能做别的事情。交流學習的可以+2197358160一起學習。