專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

STM8S做輸入捕獲

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月01日   【字體:

希望我這個(gè)對正在用STM8S做輸入捕獲,測頻的有幫助!
-->
問卷調(diào)查,答題有禮

第一部:
內(nèi)部時(shí)鐘 CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //16M

第二步:
配置IO口 我用的是STM8S103k3t6
GPIO_Init(GPIOB , GPIO_PIN_0 , GPIO_MODE_IN_PU_NO_IT);//TIM1_CH1 PB0端口

第三步:TIM1初始化,
注意:
tim1 分頻是16000000/1600 =10000
那計(jì)數(shù)一下的時(shí)間是!1/10000 S
向上計(jì)數(shù) 0到20000 的時(shí)間是2S


void TIME1_INIT(void)
{
TIM1_DeInit();
TIM1_TimeBaseInit(1600, TIM1_COUNTERMODE_UP, 20000, 0);
TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);
TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);
TIM1_ClearFlag(TIM1_FLAG_CC1);
TIM1_Cmd(ENABLE);
}


第四步: TIM4用來產(chǎn)生溢出中斷用的!

void TIME4_INIT(void)
{
TIM4_TimeBaseInit(TIM4_PRESCALER_32 ,250);
TIM4_ARRPreloadConfig(ENABLE);
TIM4_PrescalerConfig(TIM4_PRESCALER_32,TIM4_PSCRELOADMODE_IMMEDIATE);
TIM4_SetAutoreload(250);
TIM4_Cmd(ENABLE);
TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);
}


第五步: TIM1的中斷程序 連續(xù)進(jìn)入兩次中斷,兩次計(jì)數(shù)的值 乘 第三步中計(jì)數(shù)一下的時(shí)間 就是脈寬

// if(TIM1_GetFlagStatus(TIM1_FLAG_CC1))
if(TIM1_GetITStatus(TIM1_FLAG_CC1) != RESET)
{
switch(temp)
{
case 0: ICValue1=TIM1_GetCapture1();
temp=1;
break;

case 1: ICValue2=TIM1_GetCapture1();
temp=2;
break;

default:
TIM1_CCxCmd(TIM1_CHANNEL_1, DISABLE);
TIM1_ITConfig(TIM1_IT_CC1, DISABLE);
temp=3;
break;
}
TIM1_ClearITPendingBit(TIM1_IT_CC1);
TIM1_ClearFlag(TIM1_FLAG_CC1);
}

 

第六步:
TIM4的中斷程序
if(temp==3)
{
temp=0;
if(ICValue2>ICValue1)
{
disvalue=ICValue2-ICValue1;
}
else if(ICValue2<ICValue1)
{
//disvalue=0xffff+ICValue2-ICValue1;
disvalue=20000+ICValue2-ICValue1; //防止計(jì)數(shù)到末端的時(shí)候 重新計(jì)數(shù)
}
val[i0++] = disvalue;
if(i0>10) i0=0;
display();
TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);
TIM1_ITConfig(TIM1_IT_CC1, ENABLE);
}
else
{
display();
}
TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

 

關(guān)閉窗口

相關(guān)文章