麦龙电子 发表于 2020-3-16 20:19:01

stm定时器采集高电平数据有波动

通过STM32F103RCT6需要采集3路方波的高电平,没有使用输入捕获采集(输入捕获是特定的引脚,比较麻烦)采集的方波的周期是7MS频率145HZ,通过定时加外部中断的方式实现了采集,由于对采集电平的精度有要求,所以在串口直接打印得到的数据上看会有最小位数为10左右的跳动。但是通过软件滤波没有实现平稳的输出。我个人觉得是采集的方式有问题,导致的数据跳动,有没有高手请教一下,通过软件来修正一下,使用了窗口滑动滤波测试效果很差,延迟比较严重。初始化部分

麦龙电子 发表于 2020-3-16 20:30:22

         TIM2_Cap_Init(0XFFFF,100-1);            //1US分辨率 计数值65535 最大60ms
         TIM3_Cap_Init(0XFFFF,100-1);            //1US分辨率 计数值65535 最大60ms
         TIM4_Cap_Init(0XFFFF,100-1);            //1US分辨率 计数值65535 最大60ms         
      delay_us(10);
      EXTI_PA1_Init();                  //配置外部中断1
      EXTI_PA2_Init();                  //配置外部中断2
      EXTI_PA3_Init();                  //配置外部中断3      


unsigned short High_Time_us_PA1=0; //PA1高电平时间
unsigned short High_Time_us_PA2=0; //PA2高电平时间
unsigned short High_Time_us_PA3=0; //PA3高电平时间

void EXTI1_IRQHandler(void)                     //EXTI_Line1
{
if(EXTI_GetITStatus(EXTI_Line1)!= RESET)      
{
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))      //上升沿中断
                {
                        TIM2->CNT=0;         //从0开始计数
                        TIM_Cmd(TIM2,ENABLE);//启动定时器2
                }
    else //下降沿中断
    {
            High_Time_us_PA1=TIM2->CNT;//将高电平时间读出来
                  TIM_Cmd(TIM2,DISABLE); //关闭定时器2等待下次测量
                        TIM2->CNT=0;         //计数值清零
    }      
                EXTI->PR = EXTI_Line1;//清除中断标志

}
}


void EXTI2_IRQHandler(void)                     //EXTI_Line2
{
if(EXTI_GetITStatus(EXTI_Line2)!= RESET)      
{
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2))      //上升沿中断
                {
                        TIM3->CNT=0;         //从0开始计数
                        TIM_Cmd(TIM3,ENABLE);//启动定时器3
                }
    else //下降沿中断
    {
            High_Time_us_PA2=TIM3->CNT;//将高电平时间读出来
                  TIM_Cmd(TIM3,DISABLE); //关闭定时器3等待下次测量
                        TIM3->CNT=0;         //计数值清零
    }      
                EXTI->PR = EXTI_Line2;//清除中断标志
}
}


void EXTI3_IRQHandler(void)                     //EXTI_Line3
{
if(EXTI_GetITStatus(EXTI_Line3)!= RESET)      
{
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3))      //上升沿中断
                {
                        TIM4->CNT=0;         //从0开始计数
                        TIM_Cmd(TIM4,ENABLE);//启动定时器4
                }
    else //下降沿中断
    {
            High_Time_us_PA3=TIM4->CNT;//将高电平时间读出来
                  TIM_Cmd(TIM4,DISABLE); //关闭定时器4等待下次测量
                        TIM4->CNT=0;         //计数值清零
    }      
                EXTI->PR = EXTI_Line3;//清除中断标志
}
}

麦龙电子 发表于 2020-3-17 20:24:44

:):lol

麦龙电子 发表于 2020-3-18 18:15:27

:):):):):)

mylovemcu 发表于 2020-3-19 14:35:21

我没有实际做过不过感觉你这个属于正常吧1us的分辨率波动个7-8us很正常
再说了输入信号的稳定性也有关系啊
页: [1]
查看完整版本: stm定时器采集高电平数据有波动