標(biāo)題:
STM8L的TIM2捕獲功能詳解 含例程
[打印本頁(yè)]
作者:
51hei小林
時(shí)間:
2016-10-10 00:44
標(biāo)題:
STM8L的TIM2捕獲功能詳解 含例程
TIM2是STM8的通用定時(shí)器,除了具有TIM4基本定時(shí)器具有的定時(shí)功能外,還具有PWM輸出和捕獲功能.
從上圖可以看到,當(dāng)TIM2作為捕獲或這PWM輸出時(shí),共有兩個(gè)通道,CH1和CH2.
本例程使用TIM2的捕獲功能,來(lái)測(cè)量CCO的輸出頻率,根據(jù)程序測(cè)量到的頻率和實(shí)際頻率對(duì)比,來(lái)學(xué)習(xí)TIM2的捕獲功能.
程序的編寫(xiě),主要參考STM8S的中文參考手冊(cè).STM8L的這一部分和STM8S相同,所以參考了下這個(gè)中文手冊(cè),畢竟英文的不是太容易看懂.
測(cè)量PWM信號(hào)時(shí),實(shí)際上只用到了一個(gè)引腳,本例程的捕獲輸入引腳為PB0.但用到了兩個(gè)測(cè)量通道,本例程中通道1檢測(cè)到PB0為高電平時(shí),將此時(shí)計(jì)數(shù)器的數(shù)據(jù)寫(xiě)入TIM2_CCR1寄存器.通道2檢測(cè)到PB0為低電平時(shí),將此時(shí)的計(jì)數(shù)器的數(shù)據(jù)寫(xiě)入TIM2_CCR2寄存器.
由于捕獲模式為復(fù)位觸發(fā)模式,即檢測(cè)到高電平(本例程設(shè)置是高電平)時(shí),數(shù)據(jù)寫(xiě)入寄存器后,計(jì)數(shù)器復(fù)位,重新從0開(kāi)始計(jì)數(shù),所以通道2檢測(cè)到低電平時(shí),存入到TIM2_CCR2寄存器中的數(shù)據(jù)為高電平脈沖時(shí)間.
PB0為輸入捕獲引腳,PC4為CCO輸出引腳,所以需要用杜邦線,將PC4連到PB0.同時(shí)用邏輯分析儀測(cè)量PC4輸出的波形,和程序計(jì)算值進(jìn)行對(duì)比,從下圖可以看到IAR中tmp的值為3.38983039E+1,即程序測(cè)量到的頻率為3.38983KHz,與邏輯分析測(cè)量到的32.7869KHz相似,但誤差還是很大,主要原因?yàn)槭荋SI不精確,如果使用HSE,會(huì)精確一些,同時(shí)提供給定時(shí)器的頻率不高,增大定時(shí)器的頻率,結(jié)果會(huì)接近邏輯分析儀測(cè)量值.
/*硬件連接*/
// PB0<----PC4
/****************************************************************************************
*開(kāi)發(fā)環(huán)境:IAR for stm8 v6.5.3
*硬件平臺(tái):STM8L-DISCOVERY
*功能說(shuō)明:本例程,通過(guò)CC0輸出32.768KHz的方波,提供給TIM2的捕獲輸入引腳PB0測(cè)量
*作 者:茗風(fēng)
****************************************************************************************/
#include"iostm8l152c6.h"
#include"stdint.h"
uint16_t tim2_ccr1=0,tim2_ccr2=0;
uint8_t f_finish=0;
/******************************************************************************************************
* 名 稱(chēng):void CLOCK_Init(void)
* 功 能:通過(guò)PC4輸出選擇的時(shí)鐘
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明:PC4輸出32.768KHz的方波,提供給TIM2的捕獲引腳PB0測(cè)量
* 范 例:無(wú)
******************************************************************************************************/
void CLOCK_Init(void)
{
PC_CR1_C14 =1;//推挽輸出
PC_CR2_C24 =1;//高速輸出
PC_DDR_DDR4 =1;//PC4輸出
CLK_CCOR_CCODIV=0x00;//選擇分頻值
/*
*0x00 CCO divided by 1
*0x01 CCO divided by 2
*0x02 CCO divided by 4
*0x03 CCO divided by 8
*0x04 CCO divided by 16
*0x05 CCO divided by 32
*0x06 CCO divided by 64
*0x07 CCO divided by 64
*/
CLK_CCOR_CCOSEL =0x08;//選擇輸出時(shí)鐘,這里選擇外部32.768KHz的時(shí)鐘做測(cè)試
/*
*0x01 HSI clock output clock source
*0x02 LSI clock output clock source
*0x04 HSE clock output clock source
*0x08 LSE clock output clock source
*/
}
/******************************************************************************************************
* 名 稱(chēng):void TIMER2_Init(void)
* 功 能:STM8定時(shí)器2捕獲功能初始化
* 入口參數(shù):無(wú)
* 出口參數(shù):無(wú)
* 說(shuō) 明:PB0為捕獲輸入引腳,使用通道0
* 范 例:無(wú)
******************************************************************************************************/
void TIMER2_Init(void)
{
PB_DDR_DDR0 =0;//輸入
PB_CR1_C10 =0;//浮空輸入
// PB_CR1_C10 =1;//上拉輸入
PB_CR2_C20 =0;//禁止外部中斷功能
CLK_PCKENR1_PCKEN10=1;//打開(kāi)定時(shí)器2時(shí)鐘
//------設(shè)置TIM2時(shí)鐘分頻值------
TIM2_PSCR_PSC=0;//分頻值 2M/2^0=2M/1=2000000Hz
//-重裝值,TIM2從0計(jì)數(shù)到此值,發(fā)生溢出-
// TIM2_ARRH=0;
// TIM2_ARRL=100;
//----AUTO_RELOAD 預(yù)裝載使能----
TIM2_CR1_ARPE =0;//不通過(guò)預(yù)裝載寄存器
TIM2_CR1_URS=1;//僅當(dāng)計(jì)數(shù)器溢出時(shí)才發(fā)生中斷請(qǐng)求
TIM2_CR1_UDIS=1;//禁止更新事件//計(jì)數(shù)器溢出屬于更新事件
TIM2_CR1_DIR=0;//向上計(jì)數(shù)
// TIM2_CCER1_CC1E=0;//清零使能位,為了配置寄存器
// TIM2_CCER1_CC2E=0;//清零使能位,為了配置寄存器
TIM2_CCMR1=0;
// TIM2_CCMR1=0x00; //IC1F=0000 輸入信號(hào)不分頻
TIM2_CCMR1 |=0x01;//CC1S=01 IC1 is mapped on TI1FP1
/*00: CC1 channel is configured as output
01: CC1 channel is configured as input, IC1 is mapped on TI1FP1
10: CC1 channel is configured as input, IC1 is mapped on TI2FP1
11: Reserved */
TIM2_CCMR2=0;
// TIM2_CCMR2=0x00;//IC1PSC=0 輸入信號(hào)不分頻
TIM2_CCMR2 |=0x02;// TIM2_CCMR2_CC2S=0x2
/* 00: CC2 channel is configured as output
01: CC2 channel is configured as input, IC2 is mapped on TI2FP2
10: CC2 channel is configured as input, IC2 is mapped on TI1FP2
11:CC2 channel is configured as input, IC2 is mapped on TRC */
TIM2_CCER1_CC1P=0;//上升沿時(shí)發(fā)生捕獲
TIM2_CCER1_CC2P=1;//下降沿時(shí)發(fā)生捕獲
TIM2_SMCR=0x54;//
// TIM2_SMCR_TS=0x05;//101 iput 1(TI1FP1) 頭文件有錯(cuò)誤
// TIM2_SMCR_SMS=0x04;//復(fù)位觸發(fā)模式
TIM2_CCER1_CC1E=1;//使能捕獲功能
TIM2_CCER1_CC2E=1;//使能捕獲功能
TIM2_IER_CC1IE=1;//開(kāi)啟捕獲中斷
TIM2_IER_CC2IE=1;//開(kāi)啟捕獲中斷
TIM2_CR1_CEN=1;//開(kāi)啟計(jì)數(shù)
}
void main(void)
{
static float tmp=0;
CLOCK_Init();
TIMER2_Init();
asm("rim"); //enable interrupts
while(1)
{
if(f_finish==0x01)
{
//1000000us/2000000=0.5us
//測(cè)量到的周期為 0.5us*59=29.5us
//測(cè)量到的周期為 1000000us/29.5us=33.898KHz
//實(shí)際CCO輸出的頻率為32.768KHz
tmp=1000/((float)tim2_ccr1*0.5);//tmp的值為測(cè)量到的頻率
f_finish=0;
asm("nop");
}
// asm("wfi");
}
}
#pragma vector=TIM2_CAPCOM_CC1IF_vector
__interrupt void TIM2_CAPCOM_CC1IF_ISR (void)
{
if(TIM2_SR1_CC1IF)
{
tim2_ccr1=TIM2_CCR1H;
tim2_ccr1<<=8;
tim2_ccr1+=TIM2_CCR1L;
TIM2_SR1_CC1IF=0;//清除中斷標(biāo)志位
f_finish=1;
//tim2_ccr1得到的時(shí)間為整個(gè)周期的時(shí)間
}
else if(TIM2_SR1_CC2IF)
{
tim2_ccr2=TIM2_CCR2H;
tim2_ccr2<<=8;
tim2_ccr2+=TIM2_CCR2L;
TIM2_SR1_CC2IF=0;//清除中斷標(biāo)志位
//tim2_ccr2得到的時(shí)間為高電平持續(xù)時(shí)間
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1