查询方法捕捉 能捕捉到值,值是错误的
[mw_shl_code=c,true]/******************** (C) COPYRIGHT **************
[mw_shl_code=c,true]/***************** (C) COPYRIGHT ******************
* 文件名 :tim1_ic.c
* 描述 :输入捕捉TIM1配置库
* 实验平台:stm8s003k3
* 库版本 :V2.1.0
* 作者 :
* 博客 :
* 修改时间 :2014-4-1
*******************************************************************************/
/* 包含系统头文件 */
/* 包含自定义头文件 */
#include "tim1_ic.h"
/* 自定义新类型 */
/* 自定义宏 */
/* 全局变量定义 */
static void Sort(u16 array[],u8 n);
u16 Frequency_Array[GetPulseNum]={0};
u16 AverageFrequency;
u16 Period;
u16 ICValue1,ICValue2;
/*******************************************************************************
* 名称: TIM1_Input_Capture
* 功能: TIM1输入捕捉初始化操作
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void TIM1_Input_Capture(void)
{
/* 初始化TIM1输入捕捉通道4 */
TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0x00);
TIM1_ClearFlag(TIM1_FLAG_CC1);
TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE); /* 使能输入捕获通道1*/
TIM1_Cmd(ENABLE); /* 使能定时器 */
}
/*******************************************************************************
* 名称: Get_IC_Frequency
* 功能: 得到输入捕捉计数值
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
u16 Get_IC_Frequency(void)
{
TIM1->CCR1H=0;
TIM1->CCR1L=0; /* 清空输入捕捉值 */
while(!TIM1_GetFlagStatus(TIM1_FLAG_CC1));
ICValue1=TIM1_GetCapture1(); /* 得到第一次捕捉计数值 */
TIM1_ClearFlag(TIM1_FLAG_CC1); /* 清空标志位 */
while(!TIM1_GetFlagStatus(TIM1_FLAG_CC1));
ICValue2=TIM1_GetCapture1(); /* 得到第二次捕捉计数值 */
TIM1_ClearFlag(TIM1_FLAG_CC1); /* 清空标志位 */
if(ICValue2 > ICValue1)
Period = ICValue2-ICValue1;
else if(ICValue2<ICValue1)
Period = 0xffff + ICValue2-ICValue1;
return Period;
}
/*******************************************************************************
* 名称: Get_IC_Frequency
* 功能: 将计数值存入数组
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void Get_FrequencyArray(u16 FrequencyArray[], u8 times)
{
u8 i;
for(i = 0; i < times; i++)
FrequencyArray=Get_IC_Frequency();
}
/*******************************************************************************
* 名称: Sort
* 功能: 对计数值进行排序
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
static void Sort(u16 array[],u8 n)
{
u8 i,j,k;
u16 t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k])
k=j;
t=array[k];
array[k]=array;
array=t;
}
}
/*******************************************************************************
* 名称: Get_AverageFrequency
* 功能: 对计数值进行滤波
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
u16 Get_AverageFrequency(u16 GetFrequency[],u8 n)
{
u8 i;
u16 temp=0;
Sort(GetFrequency,n);
for(i=5;i<n-5;i++)
temp+=GetFrequency;
temp/=(n-10);
return temp;
}
/*************** (C) COPYRIGHT *****END OF FILE****/[/mw_shl_code]
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
//#include "sysclock.h"
#include "tim1_ic.h"
#include "beep.h"
//#include "uart.h"
#include "display.h"
u32 F;//还是float F;
void Delay(u32 nCount);
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void main(void)
{
/* 设置外部16M晶振为系统主时钟 */
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
TIM1_Input_Capture(); /* 初始化TIM1输入捕获通道 */
enableInterrupts();
Get_FrequencyArray(Frequency_Array,GetPulseNum);
AverageFrequency=Get_AverageFrequency(Frequency_Array,GetPulseNum);
//F=2000000/AverageFrequency;
F=HSI_VALUE*8/AverageFrequency;
/* if(F<365||(412<F&&F<451)||F>491)
{
Set_Beep_OptionByte();
Beep_Init(BEEP_FREQUENCY_2KHZ);
BEEP_LSICalibrationConfig(LSI_128kHz);
}
else{;}*/
while(1)
{
display();
}
}
[/mw_shl_code]
|