OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4135|回复: 13

stm32输入捕获出现偏差

[复制链接]

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-6-25
在线时间
29 小时
发表于 2019-1-25 11:04:24 | 显示全部楼层 |阅读模式
2金钱
单片机选择的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;这个误差是哪里的?是在因为在定时器中断中执行的上述语句的问题吗?

最佳答案

查看完整内容[请看2#楼]

终于找到问题在哪了,原子哥的程序中在初次捕获到上升沿时把定时器计数值清零了,这样损失了从进入中断到计数值清零的这段时间;我在测试程序中多设置了一个变量只用于记录初次捕获时的值,最后计算时减去这个值就刚刚好了; if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET) { if(TIM3CH4_CAPTURE_STA&0X4000) { TIM3CH4_CAPTURE_STA|=0X8000; TIM3CH4_CAPTURE_VAL=TIM_GetCapture4(TIM3); ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-6-25
在线时间
29 小时
 楼主| 发表于 2019-1-25 11:04:25 | 显示全部楼层
终于找到问题在哪了,原子哥的程序中在初次捕获到上升沿时把定时器计数值清零了,这样损失了从进入中断到计数值清零的这段时间;我在测试程序中多设置了一个变量只用于记录初次捕获时的值,最后计算时减去这个值就刚刚好了;
    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;       
                               
                        }                    
                }
如果大家觉得有问题欢迎指正
       
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2019-1-25 11:18:37 | 显示全部楼层
定时器采集肯定丢,为什么不用外部中断触发的方式
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-6-25
在线时间
29 小时
 楼主| 发表于 2019-1-25 11:35:43 | 显示全部楼层
三叶草 发表于 2019-1-25 11:18
定时器采集肯定丢,为什么不用外部中断触发的方式

我个人是不喜欢外部中断的,您说的定时器肯定丢是什么原因?定时器中断执行语句需要时间吗
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2019-1-25 12:41:11 | 显示全部楼层
外部输入信号怎么判断的?捕获?查询?
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-6-25
在线时间
29 小时
 楼主| 发表于 2019-1-25 13:36:07 | 显示全部楼层
wxjhby 发表于 2019-1-25 12:41
外部输入信号怎么判断的?捕获?查询?

捕获上升沿
回复

使用道具 举报

头像被屏蔽

18

主题

184

帖子

0

精华

禁止发言

积分
258
金钱
258
注册时间
2019-1-10
在线时间
10 小时
发表于 2019-1-25 15:32:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2019-1-25 17:05:34 | 显示全部楼层
是不是涉及到采集分辨率的问题了?
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-6-25
在线时间
29 小时
 楼主| 发表于 2019-1-25 17:10:40 | 显示全部楼层
lvkanger 发表于 2019-1-25 17:05
是不是涉及到采集分辨率的问题了?

是的,精度要求高,在低频时还好,几K时就不太满足要求;我在编程的时候把这个误差强制补上,计算结果也能满足要求,只是对这个原因有点不确定
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2019-1-28 10:00:08 | 显示全部楼层
啦啦啦德玛西亚 发表于 2019-1-25 17:10
是的,精度要求高,在低频时还好,几K时就不太满足要求;我在编程的时候把这个误差强制补上,计算结果也 ...

我的意思是定时器采集的时候会不会由于定时器导致采集分辨率降低?用中断计数会好些吧
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2019-1-28 10:00:42 | 显示全部楼层
啦啦啦德玛西亚 发表于 2019-1-25 17:10
是的,精度要求高,在低频时还好,几K时就不太满足要求;我在编程的时候把这个误差强制补上,计算结果也 ...

http://www.openedv.com/forum.php ... d=275545&extra=
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-6-25
在线时间
29 小时
 楼主| 发表于 2019-1-29 10:50:27 | 显示全部楼层
lvkanger 发表于 2019-1-28 10:00
http://www.openedv.com/forum.php?mod=viewthread&tid=275545&extra=

你用的L4,程序我不是很理解,原理上的是说用1个定时器计时1s去读取采样到的脉冲数,有个问题是低频怎么办,你用一个标准波去测试感觉上可以,如果方波频率是5.5hz,你这个方式计算的就有问题了,如果我理解的不对请指正
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2019-1-30 22:25:07 | 显示全部楼层
如果将定时器清零的话确实存在计数误差,我做的一个试验中直接用72MHz的时钟,结果是每次都差2个时钟周期
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-10-24
在线时间
4 小时
发表于 2020-7-26 22:15:58 | 显示全部楼层
啦啦啦德玛西亚 发表于 2019-1-25 11:04
终于找到问题在哪了,原子哥的程序中在初次捕获到上升沿时把定时器计数值清零了,这样损失了从进入中断到计 ...

感觉好像高占空比没问题了,高占空比出错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 05:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表