響應(yīng)式網(wǎng)站無法做百度聯(lián)盟最新seo操作
系列文章目錄
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記01:賽事介紹與硬件平臺
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記02:開發(fā)環(huán)境安裝
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記03:G4時鐘結(jié)構(gòu)
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記04:從零開始創(chuàng)建工程模板并開始點(diǎn)燈
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記05:Systick滴答定時器
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記06:按鍵輸入
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記07:ADC模數(shù)轉(zhuǎn)換
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記08:LCD液晶屏
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記09:EEPROM
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記10:USART串口通訊
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記11:數(shù)字電位器MCP4017
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記12:DAC數(shù)模轉(zhuǎn)換
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記13:RTC實(shí)時時鐘
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記14:PWM捕獲
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記15:PWM輸出
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記16:藍(lán)橋杯編程手冊
嵌入式|藍(lán)橋杯STM32G431(HAL庫開發(fā))——CT117E學(xué)習(xí)筆記17:第十四屆省賽真題
前言
上節(jié)課講解了PWM捕獲,這節(jié)課講解一下PWM的輸出,也就是用STM32進(jìn)行編程,讓在特定的管腳上產(chǎn)生PWM信號,這個信號的占空比和頻率是可調(diào)節(jié)的。
我們知道開發(fā)板上有兩個排針:
這些排針上對應(yīng)的是相應(yīng)的管腳,其中PA1-7都是可以用作PWM輸出的(當(dāng)然也可以用作捕獲),不同管腳對應(yīng)TIM的不同通道,只需要在CubeMX中配置引腳就可以看到對應(yīng)的通道了。上一節(jié)我們PWM捕獲也用到TIM,這里我們PWM輸出的時候就不要用相同的TIM了,比方說上一屆我們用的TIM2捕獲,這節(jié)我們可以用其他的TIM輸出如TIM16和TIM17,他們對應(yīng)的是PA6和PA7管腳。我們本節(jié)以PA7為例。
一、基礎(chǔ)知識
我們先了解一下PWM輸出的基本原理。
PWM輸出的本質(zhì)也是定時器,只要開啟TIM定時器,CNT計數(shù)器就開始++了,然后我們根據(jù)配置(一般還是1us)來計時。在捕獲中我們一嘴帶過了一下ARR,ARR是自動重裝載寄存器,相當(dāng)于計數(shù)的周期,計數(shù)到了周期之后會自動溢出重新計數(shù)。在捕獲中我們是不需要溢出的,所以直接設(shè)置的最大值0xFFFFFFFF,但是在PWM輸出里面我們是需要它溢出的,因?yàn)檫@樣就可以通過ARR讓CNT隔一段時間清零,實(shí)現(xiàn)了信號的周期變化。CNT每數(shù)到數(shù)就重新計數(shù),比如ARR固定為1000,那么周期就是1000us,即1ms。
除此之外還有一個CCRx比較寄存器,用于控制高電平的時間,當(dāng)CNT計數(shù)到CCRx時,輸出極性會翻轉(zhuǎn),這樣我們就可以控制PWM的占空比了。其中的x對應(yīng)不同的通道,比如CCR1就對應(yīng)通道1,因?yàn)槎〞r器有很多個通道,這樣不同的通道就有不同的比較值可以設(shè)置。但是ARR是整個定時器都共用的。
比如我們可以設(shè)置(CNT<=CCRx)時,引腳輸出1,(CNT>=CCRx)時,引腳輸出0,這樣通過調(diào)整CCRx就可以調(diào)節(jié)占空比了。至于這個誰是高電平誰是低電平我們是可以自己設(shè)置的。
二、產(chǎn)生一路PWM信號
1.CubeMX配置
我們用PA7,也就是定時器17的通道1來輸出PWM,我們來看一下怎么配置。
先勾選PA7。
然后找TIM17,點(diǎn)Activated激活,并在通道1選擇PWM輸出模式。(不選擇輸出比較模式是因?yàn)檫@里PWM輸出模式更為方便,可以直接調(diào)整周期和占空比)
PWM輸出就不用選擇中斷了。然后開始配置Configuration。
Prescaler分頻我們還是選擇79。Counter Mode依然是up向上計數(shù)模式,不用更改。
Counter Period就是我們的ARR寄存器,用來控制周期和頻率的。我們假設(shè)要生成的頻率是1kHz,那么周期就是1ms,那么就需要1000個CNT,所以Counter Period我們設(shè)置成999。還有一個auto-reload preload是選擇是否打開預(yù)裝載,我們將其使能。其他的保持默認(rèn)即可。
最下面的PWM輸出通道1還需要更改一下,里面有一個選擇PWM模式1還是模式2,這兩個的區(qū)別就是,模式1代表CNT<CCR1的時候?yàn)榛钴S狀態(tài)(在底下的CH Polarity可以設(shè)置活躍狀態(tài)是high還是low,如果是high就代表高電平),模式2代表CNT<CCR1的時候?yàn)榉腔钴S狀態(tài)。所以我們推薦配置模式1,活躍狀態(tài)是high,這樣配合起來的效果就是:CNT<CCR1時為高電平,CNT>CCR1時為低電平。
而這里的Pulse就是我們所說的CCRx寄存器,用于控制PWM的占空比(如果按照上面的設(shè)置,Pulse就是高電平的時間)。因?yàn)榍懊嬖O(shè)置了周期是1000,那么如果這里設(shè)置200,就代表著20%的占空比。
所以我們總結(jié)一下要改的地方:先勾選一下激活,然后選擇模式為PWM輸出模式,然后預(yù)分頻設(shè)置為79(每1us計數(shù)一次),然后設(shè)置Counter Period為999(周期為1000us),然后打開預(yù)裝載,然后設(shè)置Pulse(高電平時間)。
這樣我們就配置好了,生成工程即可。
2.程序設(shè)計
配置完之后我們可以看一下TIM17的初始化代碼,這里我們可以看到剛剛配置的周期和高電平時間都已經(jīng)生成好了,分別用htim17.Init.Period和sConfigOC.Pulse表示。
然后我們就可以進(jìn)行程序設(shè)計了,先調(diào)用一下TIM17的初始化函數(shù)MX_TIM17_Init(),然后開啟PWM輸出:HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1)。
我們編譯下載到開發(fā)板就直接可以輸出了。
當(dāng)然我們也可以改變PWM的周期和占空比,直接用對應(yīng)的寄存器改就行了(ARR、CCR1),比如:
TIM17->ARR = 499;//周期改為500us,頻率為2kHz
TIM17->CCR1 = 250;//占空比為50%
因?yàn)槭遣僮骷拇嫫鞯?#xff0c;所以可以直接改,比較方便。
也可以設(shè)置一個變量,然后通過按鍵調(diào)占空比等等。
u16 cycle = 499;
u16 high_time = 250;
void PWM_Out_Process()
{TIM17->ARR = cycle;//周期為cycle+1=500us,頻率為2kHzTIM17->CCR1 = high_time;//占空比為high_time/(cycle+1),即50%
}