在數(shù)字電路中時(shí)鐘是整個(gè)電路的心臟,電路的的一舉一動(dòng)都是根據(jù)時(shí)鐘節(jié)拍下進(jìn)行的,隨著信息量逐漸提高,對硬件信息處理能力提出了更大的需求,時(shí)鐘作為數(shù)字硬件的關(guān)鍵成員,其性能需要我們關(guān)注,尤其在高速電路設(shè)計(jì)中對模擬轉(zhuǎn)換芯片對時(shí)鐘性能有很高的需求,因此正確選擇時(shí)鐘是很關(guān)鍵的一步,前提是我們要了解時(shí)鐘的關(guān)鍵參數(shù)咯。在數(shù)字電路中最常見的時(shí)鐘元件有晶振和鎖相環(huán)、時(shí)鐘緩沖器等,本節(jié)對外部定時(shí)器進(jìn)行重點(diǎn)講解。
STM32 定時(shí)器專題講解
SysTick定時(shí)器的功能比較單一,主要是供給系統(tǒng)使用的,系統(tǒng)默認(rèn)設(shè)置為1ms觸發(fā)一次中斷。而用戶想要使用自己的定時(shí)器,STM32提供的用戶定時(shí)器不但數(shù)量多且功能更加強(qiáng)大。不同型號(hào)的STM32提供的定時(shí)器數(shù)量不同。
STM32F4xx 系列微控制器具有多達(dá)14個(gè)定時(shí)器。其中包括2個(gè)基本定時(shí)器,10 個(gè)通用定時(shí)器2個(gè)高級定時(shí)器。其中最大定時(shí)器時(shí)鐘可通過 RCC_DCKCFGR 寄存器配置為 84MHz 或者 168MHz。一般是默認(rèn)配置。

捕獲/比較通道:每一個(gè)通道對應(yīng)著外部一個(gè)管腳,接收外部的一些信號(hào)或者輸出一些信號(hào)。
基本定時(shí)器TIM6和TIM7:和SysTick定時(shí)器的功能差不多,基板上就是定時(shí)計(jì)數(shù)以及驅(qū)動(dòng)DAC的功能。
通用定時(shí)器TIM2、5、3、4、9、10、11、12、13、14:功能比基本定時(shí)器的功能多,且包含基本定時(shí)器的功能,多出來的功能包括輸入捕獲(通過捕獲通道,一個(gè)外接的管腳來測量外部信號(hào)的頻率和脈寬等)、輸出比較、PWM輸出(也對應(yīng)一個(gè)專門的通道)、使用外部信號(hào)控制定時(shí)器和定時(shí)器串連的同步電路的應(yīng)用等一些在特殊場合應(yīng)用的功能。
高級定時(shí)器TIM1和TIM8:包括了通用定時(shí)器的所有功能,在通用定時(shí)器的基礎(chǔ)上增加了更加特殊更加專業(yè)的功能,主要是用于PWM控制一些工業(yè)上的電機(jī),還有帶一些死區(qū)控制、急剎車等專業(yè)功能。
定時(shí)器計(jì)數(shù)模式:
向上計(jì)數(shù)模式:計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值(TIMx_ARR,相當(dāng)于SysTick的重載數(shù)值寄存器),然后重新從0開始計(jì)數(shù),達(dá)到設(shè)定的數(shù)值時(shí)產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件。
向下計(jì)數(shù)模式:計(jì)數(shù)器從自動(dòng)裝入的值(TIMx_ARR)開始向下計(jì)數(shù)到0,然后從自動(dòng)裝入的值重新開始,并產(chǎn)生一個(gè)計(jì)數(shù)器向下溢出事件。
中央對齊模式(向上/向下計(jì)數(shù)):計(jì)數(shù)器從0開始計(jì)數(shù)到自動(dòng)裝入的值-1,產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,然后向下計(jì)數(shù)到1并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件;然后再從0開始重新計(jì)數(shù)。該模式簡單說明為先進(jìn)行向上計(jì)數(shù)模式,當(dāng)達(dá)到數(shù)值寄存器的值時(shí),進(jìn)行中斷服務(wù),而計(jì)數(shù)器的值不會(huì)恢復(fù)為0重新向上計(jì)數(shù),而是保持該值轉(zhuǎn)而采用向下計(jì)數(shù)模式,減到0時(shí)觸發(fā)中斷進(jìn)行中斷服務(wù),再采用向上計(jì)數(shù)模式,周而復(fù)始。
定時(shí)器的時(shí)鐘:


APB1和APB2總線上分別掛載的外設(shè)和定時(shí)器的最大時(shí)鐘頻率是不同的。
定時(shí)器的時(shí)基:

時(shí)鐘源:定時(shí)器時(shí)鐘 TIMxCLK,即內(nèi)部時(shí)鐘 CK_INT,經(jīng) 對應(yīng)的APB 預(yù)分頻器后分頻提供
計(jì)數(shù)器時(shí)鐘:定時(shí)器時(shí)鐘經(jīng)過 PSC 預(yù)分頻器之后,即 CK_CNT,用來驅(qū)動(dòng)計(jì)數(shù)器計(jì)數(shù),一般情況下該時(shí)鐘頻率值就是時(shí)鐘源的頻率值,為默認(rèn)配置
計(jì)數(shù)器CNT:是一個(gè) 16 位/32的計(jì)數(shù)器
自動(dòng)重裝載寄存器:這里面裝著計(jì)數(shù)器能計(jì)數(shù)的最大數(shù)值。當(dāng)計(jì)數(shù)到這個(gè)值的時(shí)候,如果使能了中斷的話,定時(shí)器就產(chǎn)生溢出中斷
計(jì)時(shí)中斷時(shí)間:1/(TIMxCLK/(PSC+1)) * (ARR+1) 這里所有的加1是因?yàn)閺?開始
輸入捕獲與輸出比較:
輸入捕獲:可以用來捕獲外部事件,比如引腳的電平變化(上升沿,下降沿),并記錄下變化的時(shí)間,通常可以用來測量外部信號(hào)的頻率或者電平持續(xù)的時(shí)間。

輸出比較:此項(xiàng)功能是用來控制一個(gè)輸出波形,當(dāng)計(jì)數(shù)器與捕獲/比較寄存器的內(nèi)容相同時(shí),輸出比較功能做出相應(yīng)動(dòng)作,比如電平的翻轉(zhuǎn)。通常用于生產(chǎn)PWM波形。

STM32定時(shí)器定時(shí)中斷實(shí)驗(yàn):利用基本定時(shí)器實(shí)現(xiàn)定時(shí)1秒中斷,并在中斷處理函數(shù)中打印輸出字符
使用定時(shí)器必須知道定時(shí)器時(shí)鐘源是多少,本實(shí)驗(yàn)使用基本定時(shí)器TIM6,掛載再APB1總線上,因此時(shí)鐘源大小為84MHz,設(shè)置分頻系數(shù)為8400-1,則計(jì)數(shù)器的時(shí)鐘頻率為10KHz,即一個(gè)CLK的周期為100us,想要實(shí)現(xiàn)1s中斷,則裝載寄存器的大小為1000-1。
第一步先配置時(shí)鐘

第二步配置定時(shí)器TIM6

第三步配置中斷

值得注意的是,STM32有很多片內(nèi)外設(shè),而一般情況下每一種片內(nèi)外設(shè)的數(shù)量不唯一,因此要有啟動(dòng)函數(shù)來啟動(dòng)用戶想要的啟動(dòng)的目標(biāo)外設(shè)。如本節(jié)中定時(shí)器數(shù)量有很多,需要一定的定時(shí)器啟動(dòng)函數(shù)區(qū)分不同的定時(shí)器,然后啟動(dòng)目標(biāo)定時(shí)器,而系統(tǒng)定時(shí)器只有一個(gè),再整個(gè)工作過程中一直工作,不需要專門的啟動(dòng)函數(shù)。HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)可以啟動(dòng)定時(shí)器,HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)既可以啟動(dòng)定時(shí)器,又可以使能定時(shí)器中斷。
//mian.c
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM6_Init();//定時(shí)器初始化,配置參數(shù)
MX_USART1_UART_Init();
printf("this is tim6 int testn");
HAL_TIM_Base_Start_IT(&htim6);//啟動(dòng)定時(shí)器并使能中斷
while (1)
{ }
}
在定時(shí)器中斷處理函數(shù)中有很多不同類型的事件可以觸發(fā)定時(shí)器中斷,如輸入捕獲,輸出比較,由于向上計(jì)數(shù)到達(dá)指定數(shù)值時(shí),計(jì)數(shù)器會(huì)重新更新數(shù)值,所以我們選擇數(shù)值更新事件。


所以在中斷處理中我們只需重寫回調(diào)函數(shù)HAL_TIM_PeriodElapsedCallback(htim);即可
//tim.c
//重寫回調(diào)函數(shù)完成邏輯功能
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim- >Instance == TIM6){ //判斷是不是基本定時(shí)器TIM6
printf("tim6 intn");
}
}
高級定時(shí)器功能分析
高級定時(shí)器和通用定時(shí)器在基本定時(shí)器的基礎(chǔ)上引入了外部引腳,可以輸入捕獲和輸出比較功能。高級控制定時(shí)器比通用定時(shí)器增加了可編程死區(qū)互補(bǔ)輸出、重復(fù)計(jì)數(shù)器、帶剎車(斷路)功能,這些功能都是針對工業(yè)電機(jī)控制方面。


功能分析如下:
①時(shí)鐘源:對于高級或者通用定時(shí)器來說,時(shí)鐘源不僅僅只有來自APB總線的內(nèi)部時(shí)鐘,其時(shí)鐘源還可以來自外部,通過定時(shí)器連接外部的管腳引入進(jìn)來,一般情況下我們都是使用內(nèi)部時(shí)鐘。

②控制器:包括觸發(fā)控制器、從模式控制器以及編碼器接口。觸發(fā)控制器用來針對片內(nèi)外設(shè)輸出觸發(fā)信號(hào),比如為其它定時(shí)器提供時(shí)鐘和觸發(fā) DAC/ADC 轉(zhuǎn)換。編碼器接口專門針對編碼器計(jì)數(shù)而設(shè)計(jì)。從模式控制器可以控制計(jì)數(shù)器復(fù)位、啟動(dòng)、遞增/遞減、計(jì)數(shù)。

③時(shí)基單元:定時(shí)計(jì)數(shù)的核心,預(yù)分頻器 PSC:對輸入時(shí)鐘進(jìn)行分頻得到計(jì)數(shù)器的驅(qū)動(dòng)時(shí)鐘CK_CNT,計(jì)數(shù)器 CNT: 在外部時(shí)鐘的驅(qū)動(dòng)下實(shí)時(shí)的進(jìn)行計(jì)數(shù),自動(dòng)重載寄存器 ARR:用來存放與計(jì)數(shù)器,CNT 比較的值,如果兩個(gè)值相等就遞減重復(fù)計(jì)數(shù)器。
重復(fù)計(jì)數(shù)器 RCR:高級定時(shí)器特有,在定時(shí)器發(fā)生上溢或下溢事件時(shí)遞減重復(fù)計(jì)數(shù)器的值,只有當(dāng)重復(fù)計(jì)數(shù)器為0 時(shí)才會(huì)生成更新事件。相當(dāng)于有了一個(gè)緩沖,溢出時(shí)不會(huì)直接觸發(fā)中斷,而是時(shí)重復(fù)計(jì)數(shù)器減一,也就是可以延長計(jì)數(shù)時(shí)間,想要延長幾倍,重復(fù)計(jì)數(shù)器里的數(shù)值就是幾。

④輸入捕獲:輸入捕獲可以對輸入的信號(hào)的上升沿,下降沿或者雙邊沿進(jìn)行捕獲,常用來測量輸入信號(hào)的脈寬和頻率,一個(gè)定時(shí)器可能有很多通道,每個(gè)通道對應(yīng)一個(gè)管腳,但是一個(gè)定時(shí)器不會(huì)擁有超過4個(gè)通道。
外部通過管腳將信號(hào)輸入后,信號(hào)會(huì)經(jīng)過一個(gè)輸入濾波器和邊沿檢測器。外部輸入的信號(hào)雜亂,使用濾波器進(jìn)行濾波調(diào)整,過濾出用戶想要的頻率的信號(hào);邊沿檢測器用來檢測輸入波形的頻率,以上升沿為例,第一次檢測到上升沿,將計(jì)數(shù)器的值CNT放入到捕獲寄存器CCR(捕獲寄存器就是用來記錄數(shù)值的),捕獲到下一次上升沿后再把計(jì)數(shù)器的值CNT放入到捕獲寄存器CCR,兩次數(shù)值相減就知道中間經(jīng)歷了多少個(gè)上升沿,再根據(jù)中間經(jīng)過的時(shí)間就可以算出頻率。
這里的預(yù)分頻器的作用是規(guī)定采集多少次上升沿才記錄一次。

⑤公共部分:公共部分就是CCR(capture compare),捕獲/比較寄存器,用來記錄特定數(shù)值。

⑥輸出比較:輸出一些固定頻率,且電平的寬度可以調(diào)節(jié)波形信號(hào)。輸出比較就是通過定時(shí)器的計(jì)數(shù)比較控制外部引腳對外輸出高低電平,比較輸出有很多種模式,其中PWM模式是輸出比較中使用的最多的模式。


輸出比較的基本原理為:在CCR中記錄一個(gè)值,專門用來與ARR(裝載寄存器)中的值進(jìn)行比較比較的,因此可以這樣設(shè)定,當(dāng)CNT(計(jì)數(shù)器中的值,不斷變化的)小于CCR中的值時(shí)輸出低電平,當(dāng)CNT的值大于CCR中的值時(shí)輸出高電平。不會(huì)大于ARR中的值,因?yàn)锳RR的值是用戶設(shè)定的最大值,超過就會(huì)溢出觸發(fā)中斷,CNT變回0重新計(jì)數(shù)。因此通過設(shè)置CCR中的值就可以調(diào)節(jié)高/低電平的寬度,這就是所謂的PWM波的原理。
互補(bǔ)輸出和死區(qū)控制
高級控制定時(shí)器比通用定時(shí)器增加了可編程死區(qū)互補(bǔ)輸出功能,常應(yīng)用在工業(yè)電機(jī)控制方面,下面紅框中的寄存器就是用來實(shí)現(xiàn)此功能的。

H橋電機(jī)如下圖所示,從上圖中可以看到每個(gè)定時(shí)器通過DTG寄存器和輸出控制單元連接了CHx和CHxN兩根管腳,正是用來與H橋電機(jī)的OCx和OCxN相連

互補(bǔ)輸出:兩根管腳一個(gè)輸出高電平,另一個(gè)必須為低電平,在H橋電機(jī)中,OCx為高電平,OCxN必須為低電平,此時(shí)電機(jī)逆時(shí)針逆時(shí)針旋轉(zhuǎn),反之電機(jī)順時(shí)針旋轉(zhuǎn)。倘若兩根管腳同時(shí)為高電平,則會(huì)導(dǎo)致電機(jī)損毀。如圖,互補(bǔ)輸出在一根管腳變?yōu)楦唠娖降乃查g要求另一跟管腳變?yōu)榈碗娖剑沁@屬于理想狀態(tài),實(shí)際上兩根管腳的電平變化一定會(huì)有延時(shí),就會(huì)出現(xiàn)兩根管腳同時(shí)為高電平的情況,于是引入死區(qū)控制。

死區(qū)控制是當(dāng)一根管腳由高電平變?yōu)榈碗娖綍r(shí),另一管腳不會(huì)立即變?yōu)楦唠娖剑訒r(shí)一小段時(shí)間后再變?yōu)楦唠娖剑訒r(shí)的這一小段時(shí)間就稱之為死區(qū),插入死去就避免了電機(jī)燒毀的問題。DTG寄存器是配置死區(qū)發(fā)生器 (Dead-time generator setup),保存的值為死區(qū)持續(xù)的時(shí)間。

STM32定時(shí)器輸入捕獲實(shí)驗(yàn)
輸入捕獲可以對輸入的信號(hào)的上升沿,下降沿或者雙邊沿進(jìn)行捕獲,常用來測量輸入信號(hào)的脈寬和頻率。加入我們設(shè)置捕獲下降沿,可以使能中斷,捕獲到下降沿后產(chǎn)生中斷,在中斷中執(zhí)行用戶程序。捕獲到下降沿后將計(jì)數(shù)器的值保存到捕獲寄存器中,當(dāng)出現(xiàn)下一次下降沿后同樣會(huì)觸發(fā)中斷,也會(huì)把當(dāng)前計(jì)數(shù)器的值保存到捕獲寄存器中。通過保存到捕獲寄存器中兩次數(shù)值的差值計(jì)信號(hào)頻率或者電平持續(xù)的時(shí)間。

如果想要捕獲脈寬,捕獲上升沿后應(yīng)該立即設(shè)置為捕獲下降沿。value2-value1就是高電平持續(xù)的時(shí)間,也就是脈寬。
實(shí)驗(yàn):利用定時(shí)器2的輸入捕獲功能測量按下KEY6鍵后低電平持續(xù)的時(shí)間
說明:根據(jù)原理圖可得,按鍵KEY6的管腳為PA0,正常情況下管腳電平為高電平,按下后管腳電平為低電平。所以應(yīng)當(dāng)先設(shè)置捕獲下降沿,當(dāng)捕獲到下降沿后立即設(shè)置未捕獲上升沿。兩簇計(jì)數(shù)器的差值即可得低電平持續(xù)的時(shí)間,但這知識(shí)理想狀態(tài)下,實(shí)際的操作過程中人有需要考慮的因素。

如果低電平的持續(xù)時(shí)間很長,那么計(jì)數(shù)器不可能無限增長,在計(jì)數(shù)時(shí)會(huì)產(chǎn)生N次溢出。所以有如下計(jì)算方法,當(dāng)?shù)谝淮尾东@到下降沿的時(shí)候,在捕獲中斷中我們將計(jì)數(shù)器的值清零并設(shè)置下一次捕獲為上升沿,這樣,低電平持續(xù)的時(shí)間就為T=N*ARR+CCRx2。在第二次捕獲到上升沿時(shí),用戶可在上升沿捕獲中斷中統(tǒng)計(jì)時(shí)間,設(shè)置其他參數(shù)等。

步驟:
1.配置時(shí)鐘RCC。
2.選擇管腳PA0,配置為TIM2的通道1。

3.配置TIM2硬件。

4.TIM2協(xié)議參數(shù)配置。

5.中斷配置。

//mian.c
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();//初始化TIM2,配置寄存器參數(shù)
MX_USART1_UART_Init();
printf("this is tim2 cap testn");
HAL_TIM_Base_Start_IT(&htim2);//開啟定時(shí)器2,使能更新溢出中斷
HAL_TIM_IC_Start_IT (&htim2, TIM_CHANNEL_1);
//開啟定時(shí)器2輸入捕獲功能,使能捕獲中斷,使用通道1
while (1)
{}
}
//stm32f4xxxit.c
void TIM2_IRQHandler(void){ //中斷函數(shù)入口
HAL_TIM_IRQHandler(&htim2);
}
展開函數(shù)HAL_TIM_IRQHandler();可得如下


重寫回調(diào)函數(shù)
//tim.c
uint8_t fall_flag = 0; //下降沿捕獲標(biāo)志位
uint32_t cap_value = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim- >Instance == TIM2) {
if(fall_flag) {
cap_value += 1000000;//每次溢出給cap_value增加重裝載寄存器中的值
printf("update int n");
}
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if(htim- >Instance == TIM2) {
if(!fall_flag){//當(dāng)前捕獲到的是下降沿
printf("捕獲到的是下降沿n");
HAL_Delay(20); //延時(shí)20ms消抖
if( HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
fall_flag = 1;
__HAL_TIM_DISABLE(htim);//關(guān)閉定時(shí)器
__HAL_TIM_SET_COUNTER(htim,0);//設(shè)置計(jì)數(shù)器的值為0
TIM_RESET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1);//清除原來的設(shè)置
//設(shè)置為上升沿捕獲
TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
__HAL_TIM_ENABLE(htim); //使能開啟定時(shí)器
}
}else{
printf("捕獲到的是上升n");
fall_flag = 0; //當(dāng)前捕獲的是上升沿,本次捕獲結(jié)束
//最終的時(shí)間=溢出的時(shí)間+當(dāng)前計(jì)數(shù)器的值+延時(shí)時(shí)間
cap_value = cap_value + HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + 20000 ;
printf("低電平持續(xù)的時(shí)間=%d秒:%d毫秒:%d微秒n",
cap_value/1000000,cap_value%1000000/1000,cap_value%1000);
cap_value = 0; __HAL_TIM_DISABLE(htim);//關(guān)閉定時(shí)器
TIM_RESET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1);//清除原來的設(shè)置
//設(shè)置為下降沿捕獲
TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
__HAL_TIM_ENABLE(htim); //打開定時(shí)器
HAL_Delay(20);
}
}
}
關(guān)鍵功能函數(shù)說明:

STM32定時(shí)器輸入捕之PWM呼吸燈實(shí)驗(yàn)
PWM(Pulse Width Modulation):脈沖寬度調(diào)制.
占空比:就是輸出的PWM中,高電平保持的時(shí)間與該P(yáng)WM的時(shí)鐘周期的時(shí)間之比 .

輸出一個(gè)波形,該波形的脈寬和頻率均可調(diào)節(jié),把這種波形叫做PWM波。通過調(diào)節(jié)脈寬可以控制電機(jī)的速度,燈的亮滅,舵機(jī)的角度等多種應(yīng)用,整個(gè)波形的平均電壓取決于占空比,占空比越大,平均電壓越高,則電機(jī)越快。
PWM應(yīng)用:它是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用于測量,通信,功率控制與變換等許多領(lǐng)域。脈沖寬度調(diào)制(PWM)是一種對模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來對一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。常見應(yīng)用有:電機(jī)控制,DAC輸出等。

輸出比較的基本原理為:在CCR中記錄一個(gè)值(一定比ARR中的值小),專門用來與ARR(裝載寄存器)中的值進(jìn)行比較比較的,因此可以這樣設(shè)定,當(dāng)CNT(計(jì)數(shù)器中的值,不斷變化的)小于CCR中的值時(shí)輸出低電平,當(dāng)CNT的值大于CCR中的值時(shí)輸出高電平。不會(huì)大于ARR中的值,因?yàn)锳RR的值是用戶設(shè)定的最大值,超過就會(huì)溢出觸發(fā)中斷,CNT變回0重新計(jì)數(shù)。因此通過設(shè)置CCR中值的大小就可以調(diào)節(jié)高/低電平的寬度,這就是所謂的PWM波的原理。
PWM輸出模式:

PWM輸出極性:1.高電平有效 2.低電平有效
輸出高電平和輸出低電平都叫做通道有效,至于是哪一種,需要用戶自己去配置他的輸出極性。例如配置PWM輸出極性為低電平有效,且計(jì)數(shù)器采用PWM1模式下遞增方式,則計(jì)數(shù)器的值小于CCR時(shí),輸出低電平,計(jì)數(shù)器的值大于CCR時(shí),輸出高電平。
呼吸燈是由亮逐漸變暗,再由暗逐漸變亮的過程,而不是瞬間亮,瞬間滅。因?yàn)殡娖阶兓乃俣群芸欤⒂^實(shí)際上燈就是瞬間亮,瞬間滅,但是人眼無法分辨。宏觀上就是通過平均電壓來表現(xiàn),在單位時(shí)間內(nèi)通過配置多個(gè)有規(guī)律變化的占空比的大小就可以實(shí)現(xiàn)呼吸燈。

由上述LED燈的電器原理圖可知,PF7管腳的低電平持續(xù)時(shí)間越長,燈越亮,也就是占空比越小,燈越亮。本實(shí)驗(yàn)采用采用PWM1模式下遞增方式低電平有效。
步驟:
1.配置時(shí)鐘RCC.
2.選擇管腳PF7,配置為TIM11的通道1。

3.配置TIM11硬件。

4.TIM11協(xié)議參數(shù)配置。

//mian.c
#include "main.h"
#include "stm32f4xx_hal.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
void SystemClock_Config(void);
//此函數(shù)用來調(diào)節(jié)TIM11比較寄存器的大小
void TIM11_Set_Compare(uint32_t compare) {
TIM11- >CCR1 = compare;
}
int main(void) {
int32_t compare = 0;
uint8_t dir = 0;//計(jì)數(shù)模式標(biāo)志位
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM11_Init();
MX_USART1_UART_Init();
printf("this is pwm led testn");
//啟動(dòng)PWM定時(shí)器
HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1);
while (1) {
if(!dir){ //向上計(jì)數(shù)
compare += 10;
if(compare >=1000) {
compare = 1000-1;
dir = 1;
}
}else{ //向下計(jì)數(shù)
compare -= 10;
if(compare<=0) {
compare = 0;
dir = 0;
}
}
TIM11_Set_Compare(compare);//設(shè)置不同CCR值調(diào)節(jié)呼吸燈亮度
HAL_Delay(20); //沒有延時(shí)的話現(xiàn)象看不到,必須有一個(gè)電平的持續(xù)時(shí)間
//這20ms內(nèi)亮度不變,但是肉眼不可見
//燈緩慢亮緩慢滅
}
}
-
微控制器
+關(guān)注
關(guān)注
48文章
8375瀏覽量
164551 -
中斷處理
+關(guān)注
關(guān)注
0文章
96瀏覽量
11480 -
PWM波
+關(guān)注
關(guān)注
0文章
101瀏覽量
17726 -
定時(shí)器中斷
+關(guān)注
關(guān)注
0文章
49瀏覽量
11755 -
stm32定時(shí)器
+關(guān)注
關(guān)注
0文章
13瀏覽量
2530
發(fā)布評論請先 登錄
STM32定時(shí)器與外部觸發(fā)的同步有哪幾種模式呢
STM32F10ZET6通用定時(shí)器的計(jì)數(shù)模式有哪幾種
STM32F4定時(shí)器的計(jì)數(shù)器模式有哪幾種呢
STM32高級定時(shí)器-PWM簡單學(xué)習(xí)案例
STM32定時(shí)器-基本定時(shí)器
STM32——高級定時(shí)器、通用定時(shí)器、基本定時(shí)器的區(qū)別
STM32---定時(shí)器知多少
STM32有哪幾種定時(shí)器 STM32高級定時(shí)器有哪些功能
評論