STM8S003k3 tim1捕捉值不稳定,求指教!!!!

2019-07-19 20:51发布

查询方法捕捉 能捕捉到值,值是错误的 [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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。