初级会员
- 积分
- 151
- 金钱
- 151
- 注册时间
- 2014-9-29
- 在线时间
- 10 小时
|
5金钱
先谢谢各位。
1.芯片型号是STM8S003F3P6
2.测量方波的频率。
3.测试1khz的标准方波,测到的频率不正确。在计数分频为1分频和2分频时测到的数据分别是5658hz和5672hz,在计数分频为3~16分频时测到的数据是1001或者1002hz.
在计数器分频为3分频时测79KHZ的方波时只有2647hz。其它频率的方波还没测试过。下面是我的代码,麻烦高手看看,问题在哪里,谢谢。
[mw_shl_code=applescript,true]void main(void)
{
u8 i;
CLK_CKDIVR = 0x00;
GPIO_Init1();
TIM1_Input_Capture(); /* 初始化TIM1输入捕获通道 */
enableInterrupts();
Get_FrequencyArray(Frequency_Array,GetPulseNum);
AverageFrequency=Get_AverageFrequency(Frequency_Array,GetPulseNum);
CLKNUM =((u32)16000000/3)*1/AverageFrequency;
CLKNUM =0;
while (1){
}
}
/* 全局变量定义 */
static void Sort(u16 array[],u8 n);
/*******************************************************************************
* 名称: TIM1_Input_Capture
* 功能: TIM1输入捕捉初始化操作
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
void TIM1_Input_Capture(void)
{
/* 初始化TIM1输入捕捉通道1 */
//TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x0f);
TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0x00);
TIM1_CNTRH = 0x00;//清零计数器高8位
TIM1_CNTRL = 0x00;//清零计数器低8位
TIM1_PSCRH = 0x00;//计数器时钟分频高8位
TIM1_PSCRL = 0x02;//计数器时钟分频低8位16分频
TIM1_ClearFlag(TIM1_FLAG_CC1);
TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE); /* 使能输入捕获通道1 */
TIM1_Cmd(ENABLE); /* 使能定时器 */
}
/*******************************************************************************
* 名称: Get_IC_Frequency
* 功能: 得到输入捕捉计数值
* 形参: 无
* 返回: 无
* 说明: 无
******************************************************************************/
u16 Get_IC_Frequency(void)
{
u16 Period;
u16 ICValue1,ICValue2;
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;
}
[/mw_shl_code]
|
|