stm32输入捕获出现偏差

2019-07-21 05:29发布

单片机选择的stm32f103zet6,现在做一个频率采样的产品,为了测试程序,先用了一个定时器输出一个pwm,在用一个定时器去采集;计算频率的方法是测量两个上升沿的时间作为一个周期计算频率;
程序都是在原子哥的程序上修改的;仿真时发现频率有偏差;
下面是计算一个周期的时间的程序
void TIM3_IRQHandler(void)
{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                {            
                        if(TIM3CH4_CAPTURE_STA&0X40)
                        {
                                if((TIM3CH4_CAPTURE_STA&0X3F)==0X3F)
                                {
                                        TIM3CH4_CAPTURE_STA|=0X80;
                                        TIM3CH4_CAPTURE_VAL=0XFFFF;
                                }else TIM3CH4_CAPTURE_STA++;
                        }         
                }
                if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
                {       
                        if(TIM3CH4_CAPTURE_STA&0X40)       
                        {                                 
                                TIM3CH4_CAPTURE_STA|=0X80;               
                                TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3);
                          
                        }else                                                         
                        {
                                TIM3CH4_CAPTURE_STA=0;                       
                                TIM3CH4_CAPTURE_VAL=0;
                                 TIM_SetCounter(TIM3,0);
                                TIM3CH4_CAPTURE_STA|=0X40;                       
                        }                    
                }

   TIM_ClearITPendingBit(TIM3, TIM_IT_CC4|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ

}

实际计算时发现两个上升沿的时间计数值:
在4M的采样频率时和我用定时器输出pwm的值差10,
在12M的时候差30,在1M的时候差3;这个误差是哪里的?是在因为在定时器中断中执行的上述语句的问题吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
啦啦啦德玛西亚
1楼-- · 2019-07-21 05:41
终于找到问题在哪了,原子哥的程序中在初次捕获到上升沿时把定时器计数值清零了,这样损失了从进入中断到计数值清零的这段时间;我在测试程序中多设置了一个变量只用于记录初次捕获时的值,最后计算时减去这个值就刚刚好了;
    if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
                {       
                        if(TIM3CH4_CAPTURE_STA&0X4000)       
                        {                                 
                                TIM3CH4_CAPTURE_STA|=0X8000;               
                                TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3);
                               
                                  
                        }else                                                                 
                        {
                                TIM3CH4_CAPTURE_STA=0;                        //Çå¿Õ
                                TIM3CH4_CAPTURE_VAL=0;
                                //TIM_SetCounter(TIM3,0);
                                TIM3CH4_CAPTURE_First=TIM_GetCapture4(TIM3);

                                TIM3CH4_CAPTURE_STA|=0X4000;       
                               
                        }                    
                }
如果大家觉得有问题欢迎指正
       
三叶草
2楼-- · 2019-07-21 06:37
定时器采集肯定丢,为什么不用外部中断触发的方式
啦啦啦德玛西亚
3楼-- · 2019-07-21 07:45
三叶草 发表于 2019-1-25 11:18
定时器采集肯定丢,为什么不用外部中断触发的方式

我个人是不喜欢外部中断的,您说的定时器肯定丢是什么原因?定时器中断执行语句需要时间吗
wxjhby
4楼-- · 2019-07-21 09:23
 精彩回答 2  元偷偷看……
啦啦啦德玛西亚
5楼-- · 2019-07-21 12:48
wxjhby 发表于 2019-1-25 12:41
外部输入信号怎么判断的?捕获?查询?

捕获上升沿
零一三南宫南
6楼-- · 2019-07-21 14:08
是不是涉及到采集分辨率的问题了?

一周热门 更多>