在數(shù)字電路中時鐘是整個電路的心臟,電路的的一舉一動都是根據(jù)時鐘節(jié)拍下進行的,隨著信息量逐漸提高,對硬件信息處理能力提出了更大的需求,時鐘作為數(shù)字硬件的關(guān)鍵成員,其性能需要我們關(guān)注,尤其在高速電路設(shè)計中對模擬轉(zhuǎn)換芯片對時鐘性能有很高的需求,因此正確選擇時鐘是很關(guān)鍵的一步,前提是我們要了解時鐘的關(guān)鍵參數(shù)咯。在數(shù)字電路中最常見的時鐘元件有晶振和鎖相環(huán)、時鐘緩沖器等,本節(jié)對外部定時器進行重點講解。
SysTick定時器的功能比較單一,主要是供給系統(tǒng)使用的,系統(tǒng)默認設(shè)置為1ms觸發(fā)一次中斷。而用戶想要使用自己的定時器,STM32提供的用戶定時器不但數(shù)量多且功能更加強大。不同型號的STM32提供的定時器數(shù)量不同。
STM32F4xx 系列微控制器具有多達14個定時器。其中包括2個基本定時器,10 個通用定時器2個高級定時器。其中最大定時器時鐘可通過 RCC_DCKCFGR 寄存器配置為 84MHz 或者 168MHz。一般是默認配置。
捕獲/比較通道:每一個通道對應(yīng)著外部一個管腳,接收外部的一些信號或者輸出一些信號。
基本定時器TIM6和TIM7:和SysTick定時器的功能差不多,基板上就是定時計數(shù)以及驅(qū)動DAC的功能。
通用定時器TIM2、5、3、4、9、10、11、12、13、14:功能比基本定時器的功能多,且包含基本定時器的功能,多出來的功能包括輸入捕獲(通過捕獲通道,一個外接的管腳來測量外部信號的頻率和脈寬等)、輸出比較、PWM輸出(也對應(yīng)一個專門的通道)、使用外部信號控制定時器和定時器串連的同步電路的應(yīng)用等一些在特殊場合應(yīng)用的功能。
高級定時器TIM1和TIM8:包括了通用定時器的所有功能,在通用定時器的基礎(chǔ)上增加了更加特殊更加專業(yè)的功能,主要是用于PWM控制一些工業(yè)上的電機,還有帶一些死區(qū)控制、急剎車等專業(yè)功能。
定時器計數(shù)模式:
向上計數(shù)模式:計數(shù)器從0計數(shù)到自動加載值(TIMx_ARR,相當(dāng)于SysTick的重載數(shù)值寄存器),然后重新從0開始計數(shù),達到設(shè)定的數(shù)值時產(chǎn)生一個計數(shù)器溢出事件。
向下計數(shù)模式:計數(shù)器從自動裝入的值(TIMx_ARR)開始向下計數(shù)到0,然后從自動裝入的值重新開始,并產(chǎn)生一個計數(shù)器向下溢出事件。
中央對齊模式(向上/向下計數(shù)):計數(shù)器從0開始計數(shù)到自動裝入的值-1,產(chǎn)生一個計數(shù)器溢出事件,然后向下計數(shù)到1并且產(chǎn)生一個計數(shù)器溢出事件;然后再從0開始重新計數(shù)。該模式簡單說明為先進行向上計數(shù)模式,當(dāng)達到數(shù)值寄存器的值時,進行中斷服務(wù),而計數(shù)器的值不會恢復(fù)為0重新向上計數(shù),而是保持該值轉(zhuǎn)而采用向下計數(shù)模式,減到0時觸發(fā)中斷進行中斷服務(wù),再采用向上計數(shù)模式,周而復(fù)始。
定時器的時鐘:
APB1和APB2總線上分別掛載的外設(shè)和定時器的最大時鐘頻率是不同的。
定時器的時基:
時鐘源:定時器時鐘 TIMxCLK,即內(nèi)部時鐘 CK_INT,經(jīng) 對應(yīng)的APB 預(yù)分頻器后分頻提供
計數(shù)器時鐘:定時器時鐘經(jīng)過 PSC 預(yù)分頻器之后,即 CK_CNT,用來驅(qū)動計數(shù)器計數(shù),一般情況下該時鐘頻率值就是時鐘源的頻率值,為默認配置
計數(shù)器CNT:是一個 16 位/32的計數(shù)器
自動重裝載寄存器:這里面裝著計數(shù)器能計數(shù)的最大數(shù)值。當(dāng)計數(shù)到這個值的時候,如果使能了中斷的話,定時器就產(chǎn)生溢出中斷
計時中斷時間:1/(TIMxCLK/(PSC+1)) * (ARR+1) 這里所有的加1是因為從0開始
輸入捕獲與輸出比較:
輸入捕獲:可以用來捕獲外部事件,比如引腳的電平變化(上升沿,下降沿),并記錄下變化的時間,通常可以用來測量外部信號的頻率或者電平持續(xù)的時間。
輸出比較:此項功能是用來控制一個輸出波形,當(dāng)計數(shù)器與捕獲/比較寄存器的內(nèi)容相同時,輸出比較功能做出相應(yīng)動作,比如電平的翻轉(zhuǎn)。通常用于生產(chǎn)PWM波形。
STM32定時器定時中斷實驗:利用基本定時器實現(xiàn)定時1秒中斷,并在中斷處理函數(shù)中打印輸出字符
使用定時器必須知道定時器時鐘源是多少,本實驗使用基本定時器TIM6,掛載再APB1總線上,因此時鐘源大小為84MHz,設(shè)置分頻系數(shù)為8400-1,則計數(shù)器的時鐘頻率為10KHz,即一個CLK的周期為100us,想要實現(xiàn)1s中斷,則裝載寄存器的大小為1000-1。
第一步先配置時鐘
第二步配置定時器TIM6
第三步配置中斷
值得注意的是,STM32有很多片內(nèi)外設(shè),而一般情況下每一種片內(nèi)外設(shè)的數(shù)量不唯一,因此要有啟動函數(shù)來啟動用戶想要的啟動的目標(biāo)外設(shè)。如本節(jié)中定時器數(shù)量有很多,需要一定的定時器啟動函數(shù)區(qū)分不同的定時器,然后啟動目標(biāo)定時器,而系統(tǒng)定時器只有一個,再整個工作過程中一直工作,不需要專門的啟動函數(shù)。HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)可以啟動定時器,HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)既可以啟動定時器,又可以使能定時器中斷。
//mian.c
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM6_Init();//定時器初始化,配置參數(shù)
MX_USART1_UART_Init();
printf("this is tim6 int testn");
HAL_TIM_Base_Start_IT(&htim6);//啟動定時器并使能中斷
while (1)
{ }
}
在定時器中斷處理函數(shù)中有很多不同類型的事件可以觸發(fā)定時器中斷,如輸入捕獲,輸出比較,由于向上計數(shù)到達指定數(shù)值時,計數(shù)器會重新更新數(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){ //判斷是不是基本定時器TIM6
printf("tim6 intn");
}
}
高級定時器功能分析
高級定時器和通用定時器在基本定時器的基礎(chǔ)上引入了外部引腳,可以輸入捕獲和輸出比較功能。高級控制定時器比通用定時器增加了可編程死區(qū)互補輸出、重復(fù)計數(shù)器、帶剎車(斷路)功能,這些功能都是針對工業(yè)電機控制方面。
功能分析如下:
①時鐘源:對于高級或者通用定時器來說,時鐘源不僅僅只有來自APB總線的內(nèi)部時鐘,其時鐘源還可以來自外部,通過定時器連接外部的管腳引入進來,一般情況下我們都是使用內(nèi)部時鐘。
②控制器:包括觸發(fā)控制器、從模式控制器以及編碼器接口。觸發(fā)控制器用來針對片內(nèi)外設(shè)輸出觸發(fā)信號,比如為其它定時器提供時鐘和觸發(fā) DAC/ADC 轉(zhuǎn)換。編碼器接口專門針對編碼器計數(shù)而設(shè)計。從模式控制器可以控制計數(shù)器復(fù)位、啟動、遞增/遞減、計數(shù)。
③時基單元:定時計數(shù)的核心,預(yù)分頻器 PSC:對輸入時鐘進行分頻得到計數(shù)器的驅(qū)動時鐘CK_CNT,計數(shù)器 CNT: 在外部時鐘的驅(qū)動下實時的進行計數(shù),自動重載寄存器 ARR:用來存放與計數(shù)器,CNT 比較的值,如果兩個值相等就遞減重復(fù)計數(shù)器。
重復(fù)計數(shù)器 RCR:高級定時器特有,在定時器發(fā)生上溢或下溢事件時遞減重復(fù)計數(shù)器的值,只有當(dāng)重復(fù)計數(shù)器為0 時才會生成更新事件。相當(dāng)于有了一個緩沖,溢出時不會直接觸發(fā)中斷,而是時重復(fù)計數(shù)器減一,也就是可以延長計數(shù)時間,想要延長幾倍,重復(fù)計數(shù)器里的數(shù)值就是幾。
④輸入捕獲:輸入捕獲可以對輸入的信號的上升沿,下降沿或者雙邊沿進行捕獲,常用來測量輸入信號的脈寬和頻率,一個定時器可能有很多通道,每個通道對應(yīng)一個管腳,但是一個定時器不會擁有超過4個通道。
外部通過管腳將信號輸入后,信號會經(jīng)過一個輸入濾波器和邊沿檢測器。外部輸入的信號雜亂,使用濾波器進行濾波調(diào)整,過濾出用戶想要的頻率的信號;邊沿檢測器用來檢測輸入波形的頻率,以上升沿為例,第一次檢測到上升沿,將計數(shù)器的值CNT放入到捕獲寄存器CCR(捕獲寄存器就是用來記錄數(shù)值的),捕獲到下一次上升沿后再把計數(shù)器的值CNT放入到捕獲寄存器CCR,兩次數(shù)值相減就知道中間經(jīng)歷了多少個上升沿,再根據(jù)中間經(jīng)過的時間就可以算出頻率。
這里的預(yù)分頻器的作用是規(guī)定采集多少次上升沿才記錄一次。
⑤公共部分:公共部分就是CCR(capture compare),捕獲/比較寄存器,用來記錄特定數(shù)值。
⑥輸出比較:輸出一些固定頻率,且電平的寬度可以調(diào)節(jié)波形信號。輸出比較就是通過定時器的計數(shù)比較控制外部引腳對外輸出高低電平,比較輸出有很多種模式,其中PWM模式是輸出比較中使用的最多的模式。
輸出比較的基本原理為:在CCR中記錄一個值,專門用來與ARR(裝載寄存器)中的值進行比較比較的,因此可以這樣設(shè)定,當(dāng)CNT(計數(shù)器中的值,不斷變化的)小于CCR中的值時輸出低電平,當(dāng)CNT的值大于CCR中的值時輸出高電平。不會大于ARR中的值,因為ARR的值是用戶設(shè)定的最大值,超過就會溢出觸發(fā)中斷,CNT變回0重新計數(shù)。因此通過設(shè)置CCR中的值就可以調(diào)節(jié)高/低電平的寬度,這就是所謂的PWM波的原理。
互補輸出和死區(qū)控制
高級控制定時器比通用定時器增加了可編程死區(qū)互補輸出功能,常應(yīng)用在工業(yè)電機控制方面,下面紅框中的寄存器就是用來實現(xiàn)此功能的。
H橋電機如下圖所示,從上圖中可以看到每個定時器通過DTG寄存器和輸出控制單元連接了CHx和CHxN兩根管腳,正是用來與H橋電機的OCx和OCxN相連
互補輸出:兩根管腳一個輸出高電平,另一個必須為低電平,在H橋電機中,OCx為高電平,OCxN必須為低電平,此時電機逆時針逆時針旋轉(zhuǎn),反之電機順時針旋轉(zhuǎn)。倘若兩根管腳同時為高電平,則會導(dǎo)致電機損毀。如圖,互補輸出在一根管腳變?yōu)楦唠娖降乃查g要求另一跟管腳變?yōu)榈碗娖?,但是這屬于理想狀態(tài),實際上兩根管腳的電平變化一定會有延時,就會出現(xiàn)兩根管腳同時為高電平的情況,于是引入死區(qū)控制。
死區(qū)控制是當(dāng)一根管腳由高電平變?yōu)榈碗娖綍r,另一管腳不會立即變?yōu)楦唠娖?,延時一小段時間后再變?yōu)楦唠娖?,延時的這一小段時間就稱之為死區(qū),插入死去就避免了電機燒毀的問題。DTG寄存器是配置死區(qū)發(fā)生器 (Dead-time generator setup),保存的值為死區(qū)持續(xù)的時間。
STM32定時器輸入捕獲實驗
輸入捕獲可以對輸入的信號的上升沿,下降沿或者雙邊沿進行捕獲,常用來測量輸入信號的脈寬和頻率。加入我們設(shè)置捕獲下降沿,可以使能中斷,捕獲到下降沿后產(chǎn)生中斷,在中斷中執(zhí)行用戶程序。捕獲到下降沿后將計數(shù)器的值保存到捕獲寄存器中,當(dāng)出現(xiàn)下一次下降沿后同樣會觸發(fā)中斷,也會把當(dāng)前計數(shù)器的值保存到捕獲寄存器中。通過保存到捕獲寄存器中兩次數(shù)值的差值計信號頻率或者電平持續(xù)的時間。
如果想要捕獲脈寬,捕獲上升沿后應(yīng)該立即設(shè)置為捕獲下降沿。value2-value1就是高電平持續(xù)的時間,也就是脈寬。
實驗:利用定時器2的輸入捕獲功能測量按下KEY6鍵后低電平持續(xù)的時間
說明:根據(jù)原理圖可得,按鍵KEY6的管腳為PA0,正常情況下管腳電平為高電平,按下后管腳電平為低電平。所以應(yīng)當(dāng)先設(shè)置捕獲下降沿,當(dāng)捕獲到下降沿后立即設(shè)置未捕獲上升沿。兩簇計數(shù)器的差值即可得低電平持續(xù)的時間,但這知識理想狀態(tài)下,實際的操作過程中人有需要考慮的因素。
如果低電平的持續(xù)時間很長,那么計數(shù)器不可能無限增長,在計數(shù)時會產(chǎn)生N次溢出。所以有如下計算方法,當(dāng)?shù)谝淮尾东@到下降沿的時候,在捕獲中斷中我們將計數(shù)器的值清零并設(shè)置下一次捕獲為上升沿,這樣,低電平持續(xù)的時間就為T=N*ARR+CCRx2。在第二次捕獲到上升沿時,用戶可在上升沿捕獲中斷中統(tǒng)計時間,設(shè)置其他參數(shù)等。
步驟:
1.配置時鐘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);//開啟定時器2,使能更新溢出中斷
HAL_TIM_IC_Start_IT (&htim2, TIM_CHANNEL_1);
//開啟定時器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); //延時20ms消抖
if( HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
fall_flag = 1;
__HAL_TIM_DISABLE(htim);//關(guān)閉定時器
__HAL_TIM_SET_COUNTER(htim,0);//設(shè)置計數(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); //使能開啟定時器
}
}else{
printf("捕獲到的是上升n");
fall_flag = 0; //當(dāng)前捕獲的是上升沿,本次捕獲結(jié)束
//最終的時間=溢出的時間+當(dāng)前計數(shù)器的值+延時時間
cap_value = cap_value + HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + 20000 ;
printf("低電平持續(xù)的時間=%d秒:%d毫秒:%d微秒n",
cap_value/1000000,cap_value%1000000/1000,cap_value%1000);
cap_value = 0; __HAL_TIM_DISABLE(htim);//關(guān)閉定時器
TIM_RESET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1);//清除原來的設(shè)置
//設(shè)置為下降沿捕獲
TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
__HAL_TIM_ENABLE(htim); //打開定時器
HAL_Delay(20);
}
}
}
關(guān)鍵功能函數(shù)說明:
STM32定時器輸入捕之PWM呼吸燈實驗
PWM(Pulse Width Modulation):脈沖寬度調(diào)制.
占空比:就是輸出的PWM中,高電平保持的時間與該PWM的時鐘周期的時間之比 .
輸出一個波形,該波形的脈寬和頻率均可調(diào)節(jié),把這種波形叫做PWM波。通過調(diào)節(jié)脈寬可以控制電機的速度,燈的亮滅,舵機的角度等多種應(yīng)用,整個波形的平均電壓取決于占空比,占空比越大,平均電壓越高,則電機越快。
PWM應(yīng)用:它是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù),廣泛應(yīng)用于測量,通信,功率控制與變換等許多領(lǐng)域。脈沖寬度調(diào)制(PWM)是一種對模擬信號電平進行數(shù)字編碼的方法。通過高分辨率計數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體模擬信號的電平進行編碼。常見應(yīng)用有:電機控制,DAC輸出等。
輸出比較的基本原理為:在CCR中記錄一個值(一定比ARR中的值?。瑢iT用來與ARR(裝載寄存器)中的值進行比較比較的,因此可以這樣設(shè)定,當(dāng)CNT(計數(shù)器中的值,不斷變化的)小于CCR中的值時輸出低電平,當(dāng)CNT的值大于CCR中的值時輸出高電平。不會大于ARR中的值,因為ARR的值是用戶設(shè)定的最大值,超過就會溢出觸發(fā)中斷,CNT變回0重新計數(shù)。因此通過設(shè)置CCR中值的大小就可以調(diào)節(jié)高/低電平的寬度,這就是所謂的PWM波的原理。
PWM輸出模式:
PWM輸出極性:1.高電平有效 2.低電平有效
輸出高電平和輸出低電平都叫做通道有效,至于是哪一種,需要用戶自己去配置他的輸出極性。例如配置PWM輸出極性為低電平有效,且計數(shù)器采用PWM1模式下遞增方式,則計數(shù)器的值小于CCR時,輸出低電平,計數(shù)器的值大于CCR時,輸出高電平。
呼吸燈是由亮逐漸變暗,再由暗逐漸變亮的過程,而不是瞬間亮,瞬間滅。因為電平變化的速度很快,微觀實際上燈就是瞬間亮,瞬間滅,但是人眼無法分辨。宏觀上就是通過平均電壓來表現(xiàn),在單位時間內(nèi)通過配置多個有規(guī)律變化的占空比的大小就可以實現(xiàn)呼吸燈。
由上述LED燈的電器原理圖可知,PF7管腳的低電平持續(xù)時間越長,燈越亮,也就是占空比越小,燈越亮。本實驗采用采用PWM1模式下遞增方式低電平有效。
步驟:
1.配置時鐘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;//計數(shù)模式標(biāo)志位
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM11_Init();
MX_USART1_UART_Init();
printf("this is pwm led testn");
//啟動PWM定時器
HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1);
while (1) {
if(!dir){ //向上計數(shù)
compare += 10;
if(compare >=1000) {
compare = 1000-1;
dir = 1;
}
}else{ //向下計數(shù)
compare -= 10;
if(compare<=0) {
compare = 0;
dir = 0;
}
}
TIM11_Set_Compare(compare);//設(shè)置不同CCR值調(diào)節(jié)呼吸燈亮度
HAL_Delay(20); //沒有延時的話現(xiàn)象看不到,必須有一個電平的持續(xù)時間
//這20ms內(nèi)亮度不變,但是肉眼不可見
//燈緩慢亮緩慢滅
}
}
-
微控制器
+關(guān)注
關(guān)注
48文章
7552瀏覽量
151422 -
中斷處理
+關(guān)注
關(guān)注
0文章
94瀏覽量
10976 -
PWM波
+關(guān)注
關(guān)注
0文章
99瀏覽量
16857 -
定時器中斷
+關(guān)注
關(guān)注
0文章
49瀏覽量
11182 -
stm32定時器
+關(guān)注
關(guān)注
0文章
13瀏覽量
2294
發(fā)布評論請先 登錄
相關(guān)推薦
評論