STM8S003 TIM1输入捕获问题请教

2019-07-19 20:58发布

先谢谢各位。
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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
aleelau
1楼-- · 2019-07-20 01:43
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-20 04:07
帮顶
qi.ang
3楼-- · 2019-07-20 08:53
CLKNUM =((u32)16000000/3)*1/AverageFrequency;
以上这句是有问题的吧
1.16000000*3才对
2.AverageFrequency应该是捕获1次和2次相减的值
tian213
4楼-- · 2019-07-20 14:49
 精彩回答 2  元偷偷看……

一周热门 更多>