STM32單片機學(xué)習---PWM輸出
今天最大的感嘆就是網(wǎng)絡(luò )資源實(shí)在是個(gè)巨大的寶庫,真的很慶幸,在這個(gè)復雜的社會(huì )環(huán)境里,在一個(gè)到處充斥著(zhù)私心、私利的時(shí)代,各個(gè)網(wǎng)站,各個(gè)論壇上的眾多網(wǎng)友都時(shí)刻保持著(zhù)開(kāi)源的氛圍。學(xué)習一定要和他人交流,而網(wǎng)絡(luò )提供了這么一個(gè)極好的平臺。
本文引用地址:http://dyxdggzs.com/article/201611/322220.htm廢話(huà)少說(shuō),言歸正傳。
實(shí)現功能:采用定時(shí)器2的通道2,使PA1輸出頻率1K,占空比40的PWM波形,用PA8隨意延時(shí)取反led燈,指示程序運行。
首先熟悉一下定時(shí)器的PWM相關(guān)部分??磮D最明白
其實(shí)PWM就是定時(shí)器的一個(gè)比較功能而已。
CNT里的值不斷++,一旦加到與CCRX寄存器值相等,那么就產(chǎn)生相應的動(dòng)作。這點(diǎn)和AVR單片機很類(lèi)似。既然這樣,我們要產(chǎn)生需要的PWM信號,就需要設定PWM的頻率和PWM的占空比。
首先說(shuō)頻率的確定。由于通用定時(shí)器的時(shí)鐘來(lái)源是PCLK1,而我又喜歡用固件庫的默認設置,那么定時(shí)器的時(shí)鐘頻率就這樣來(lái)確定了,如下:
AHB(72MHz)→APB1分頻器(默認2)→APB1時(shí)鐘信號(36MHz)→倍頻器(*2倍)→通用定時(shí)器時(shí)鐘信號(72MHz)。
這里為什么是這樣,在RCC模塊學(xué)習記錄里有詳細記載,不多說(shuō)。
因此圖中的CK_PSC就是72MHz了。
下面的資料也是網(wǎng)上一搜一大把,我就羅列了:
STM32的PWM輸出有兩種模式,模式1(PWM1)和模式2(PWM2),由TIMx_CCMRx寄存器中的OCxM位確定的(“110”為模式1,“111”為模式2)。模式1和模式2的區別如下:
110:PWM模式1-在向上計數時(shí),一旦TIMx_CNT=TIMx_CCR1時(shí)通道1為無(wú)效電平(OC1REF=0),否則為有效電平(OC1REF=1)。
111:PWM模式2-在向上計數時(shí),一旦TIMx_CNT=TIMx_CCR1時(shí)通道1為有效電平,否則為無(wú)效電平。
由此看來(lái),模式1和模式2正好互補,互為相反,所以在運用起來(lái)差別也并不太大。我用的是模式一,因此后面的設定都是按照模式一來(lái)設定的。
PWM的周期是就是由定時(shí)器的自動(dòng)重裝值和CNT計數頻率決定的。而CNT的計數時(shí)鐘是CK_PSC經(jīng)分頻器PSC得到,因此CNT的時(shí)鐘就是CK_PSC/分頻系數。這個(gè)分頻系數在TIM_TimeBaseStructure.TIM_Prescaler確定。我設置的值是72,因此CNT的計數頻率也就是CK_CNT的頻率為1MHz。
下一步就是確定定時(shí)器自動(dòng)重裝值。因為CNT每自加到ARR寄存器的值時(shí)就會(huì )自動(dòng)清零,當然前提是設定為為向上計數模式,而就是根據這個(gè)溢出事件來(lái)改變PWM的周期。所以PWM信號的頻率由ARR的值來(lái)確定。我設置的值是1000-1,即TIM_TimeBaseStructure.TIM_Period = 1000-1;因此PWM的周期是1MHz/1000=1KHz。
接下來(lái)就要確定PWM的占空比了。因為CNT在自加到ARR值的過(guò)程中會(huì )不斷和CRRX的值相比較,一旦二者相等就產(chǎn)生匹配事件,但要注意CNT不會(huì )理會(huì )這件事,它會(huì )繼續++直到等于A(yíng)RR。而CRRX的值我設定為400-1,那么占空比就隨之確定為40%。
好了,下面就是庫函數的配置了。
TIMER輸出PWM實(shí)現步驟
1.
2.
3.
4.
首先是main函數和全局變量申明,很簡(jiǎn)單,不作說(shuō)明
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TimOCInitStructure;
int main(void)
{
//
}
下面是IO口的配置:
void gpio_cfg()
{
}
此處要注意的是PWM輸出口要配置為復用推挽輸出,原因我也不知道,反正照搬就是了。
評論