stm32的定時(shí)器輸入捕獲與輸出比較
輸入捕捉:可以用來(lái)捕獲外部事件,并為其賦予時(shí)間標記以說(shuō)明此事件的發(fā)生時(shí)刻。
外部事件發(fā)生的觸發(fā)信號由單片機中對應的引腳輸入(具體可以參考單片機的datasheet),也可以通過(guò)模擬比較器單元來(lái)實(shí)現。
時(shí)間標記可用來(lái)計算頻率,占空比及信號的其他特征,以及為事件創(chuàng )建日志,主要是用來(lái)測量外部信號的頻率。
輸出比較:定時(shí)器中計數寄存器在初始化完后會(huì )自動(dòng)的計數。從bottom計數到top。并且有不同的工作模式。
另外還有個(gè)比較寄存器。一旦計數寄存器在從bottom到top計數過(guò)程中與比較寄存器匹配則會(huì )產(chǎn)生比較中斷(比較中斷使能的情況下)。
然后根據不同的工作模式計數寄存器將清零或者計數到top值。
1、朋友,可以解釋一下輸入捕獲的工作原理不?
很簡(jiǎn)單,當你設置的捕獲開(kāi)始的時(shí)候,cpu會(huì )將計數寄存器的值復制到捕獲比較寄存器中并開(kāi)始計數,當再次捕捉到電平變化時(shí),這是計數寄存器中的值減去剛才復制的值就是這段電平的持續時(shí)間,你可以設置上升沿捕獲、下降沿捕獲、或者上升沿下降沿都捕獲。它沒(méi)多大用處,最常用來(lái)測頻率。
計數寄存器的初值,是自己寫(xiě)進(jìn)去的嗎?
是的,不過(guò)默認不要寫(xiě)入
我如果捕獲上升沿,兩個(gè)值相減,代表的時(shí)兩個(gè)上升沿中間那段電平的時(shí)間。對不?
是的
timer1有五個(gè)通道(對應五個(gè)IO引腳),在同一時(shí)刻,只能捕獲一個(gè)引腳的值,對不?
那是肯定的,通道很像ADC通道,是可以進(jìn)行切換的。
那輸出比較的原理你可以幫我介紹一下不?
這里有兩個(gè)單元:一個(gè)計數器單元和一個(gè)比較單元,比較單元就是個(gè)雙緩沖寄存器,比較單元的值是可以根據不同的模式設置的,與此同時(shí),計數器在不停的計數,并不停的與比較寄存器中的值進(jìn)行比較,當計數器的值與比較寄存器的值相等的時(shí)候一個(gè)比較匹配就發(fā)生了,根據自己的設置,匹配了是io電平取反、變低、還是變高,就會(huì )產(chǎn)生不同的波形了。
比較單元的值是人為設進(jìn)去的吧?
是的,但是他要根據你的控制寄存器的配置,來(lái)初始化你的比較匹配寄存器。
上面這個(gè)總看不懂,好像不不止你說(shuō)的那幾種情況:“匹配了是io電平取反、變低、還是變高,就會(huì )產(chǎn)生不同的波形了”
就是比較匹配了你要IO電平怎么辦?是清0還是置1?還是怎么樣?這樣才能產(chǎn)生波形啊要不然你要比較單元有什么用呢?
設置輸出就是置1,清除輸出就是置0,切換輸出就是將原來(lái)的電平取反,對不?
是的你理解的很快
011:計數器向上計數達到最大值時(shí)將引腳置1,達到0時(shí),引腳電平置0,,對不?
恩
定時(shí)器1的輸出比較模式怎么用。利用這個(gè)功能輸出一個(gè)1KHZ,占空比為10%的程序怎么寫(xiě)???求高人指點(diǎn)
1、陪定時(shí)器1的功能為特殊功能,不是普通IO
2、P1SEL引腳選擇
3、P1DIR設為輸出
4、T3CC0設置周期
5、T3CC1設置占空比
6、T3CCTL0 設置通道0
7、T3CCTL1 設置通道1
8、T3CTL設為模模式
9、用T3CTL打開(kāi)即可
************以下是用定時(shí)器做頻率源,用定時(shí)器測量該頻率的應用程序?。?!***********
調試STM32的定時(shí)器好幾天了,也算是對STM32的定時(shí)器有了點(diǎn)清楚的認識了。我需要測量4路信號的頻率然后通過(guò)DMA將信號的頻率傳輸到存儲器區域,手冊說(shuō)的很明白每個(gè)定時(shí)器有4個(gè)獨立通道。然后我就想能不能將這4路信號都連接到一個(gè)定時(shí)器的4個(gè)通道上去。理論上應該是行的通的。剛開(kāi)始俺使用的是 TIM2的123通道,TIM4的2通道來(lái)進(jìn)行頻率的測量。由于沒(méi)有頻率發(fā)生器,所以我用tim3作為信號源,用TIM2,TIM4來(lái)進(jìn)行測量就ok了(剛好4個(gè)通道了)。
請看一開(kāi)始的程序,以TIM2的1,3通道為例子(2通道設置方法一樣):
TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP;
TIM_ICInitStructure.TIM_Channel =TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter =0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;
TIM_ICInitStructure.TIM_Channel =TIM_Channel_3;
TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
以上是輸入捕獲配置
還需要做的工作就是(參考stm32參考手冊的TIM的結構框圖):
//主從模式選擇
這樣我們就可以很輕松的就得到了連接在TIM2的通道1上的信號的頻率,但是3通道的頻率的值永遠都是跳動(dòng)的不準,測試了半天也沒(méi)有找到根本原因,請看TIM的結構框圖的一部分
紅色箭頭所指,這才找到原因,觸發(fā)的信號源只有這四種,而通道3上的計數器的值不可能在接受到信號的上升沿時(shí)候,有復位這個(gè)動(dòng)作,找到原因了。這就是3 通道上的數據不停跳動(dòng)的原因,要想得到信號的頻率也是有辦法的,可以取連續兩次捕捉的值之差,這個(gè)值就是信號的周期,自己根據實(shí)際情況去算頻率吧。
有以上可以得到:
stm32的TIM2的四個(gè)通道可以同時(shí)配置成輸入捕捉模式,但是計算CH3,CH4信號的頻率步驟有點(diǎn)繁瑣(取前后捕捉的差值),但是他的CH1,和CH2可以輕松得到:
通道1
TIMx->CRR1的值即為信號的周期
通道2:
TIMx->CRR2的值即為信號的周期
STM32的定時(shí)器外設功能強大得超出了想像力,STM32一共有8個(gè)都為16位的定時(shí)器。其中TIM6、TIM7是基本定時(shí)器;TIM2、TIM3、TIM4、TIM5是通用定時(shí)器;TIM1和TIM8是高級定時(shí)器。這些定時(shí)器使STM32具有定時(shí)、信號的頻率測量、信號的PWM測量、PWM輸出、三相6步電機控制及編碼器接口等功能,都是專(zhuān)門(mén)為工控領(lǐng)域量身訂做的。
我們來(lái)看看它的啟動(dòng)代碼:
void TIM2_Configuration(void)
{
}
我們來(lái)詳細講解:如何生成PWM脈沖
通用定時(shí)器可以利用GPIO引腳進(jìn)行脈沖輸出,在配置為比較輸出、PWM輸出功能時(shí),捕獲/比較寄存器TIMx_CCR被用作比較功能,下面把它簡(jiǎn)稱(chēng)為比較寄存器。
這里直接舉例說(shuō)明定時(shí)器的PWM輸出工作過(guò)程:若配置脈沖計數器TIMx_CNT為向上計數,而重載寄存器TIMx_ARR(相當于庫函數寫(xiě)法的TIM_Period的值N)被配置為N,即TIMx_CNT的當前計數值數值X在TIMxCLK時(shí)鐘源的驅動(dòng)下不斷累加,當TIMx_CNT的數值X大于N時(shí),會(huì )重置TIMx_CNT數值為0重新計數。
而在TIMxCNT計數的同時(shí),TIMxCNT的計數值X會(huì )與比較寄存器TIMx_CCR預先存儲了的數值A進(jìn)行比較,當脈沖計數器TIMx_CNT的數值X小于比較寄存器TIMx_CCR的值A時(shí),輸出高電平(或低電平),相反地,當脈沖計數器的數值X大于或等于比較寄存器的值A時(shí),輸出低電平(或高電平)。
如此循環(huán),得到的輸出脈沖周期就為重載寄存器TIMx_ARR存儲的數值(N+1)乘以觸發(fā)脈沖的時(shí)鐘周期,其脈沖寬度則為比較寄存器TIMx_CCR的值A乘以觸發(fā)脈沖的時(shí)鐘周期,即輸出PWM的占空比為A/(N+1)。
如果不想看的可以直接看我標注的紅色字體,就大體可以理解。
下面我們來(lái)編寫(xiě)具體代碼和講解:
void TIM3_GPIO_Config(void)
{配置TIM3復用輸出PWM的IO
}
void TIM3_Mode_Config(void)
{
}太累了邊看邊寫(xiě)都這個(gè)點(diǎn)了2014年7月27日0:24:13在自己床上寫(xiě)的。下面是看看我們程序達到的4路PWM的效果:
可以看到明顯占空比不同的4路pwm波。
評論