OpenEdv-开源电子网

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

请问老师输入捕获的脉冲数量总是少于预期值,该怎么办啊!

[复制链接]

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
发表于 2018-6-2 17:54:57 | 显示全部楼层 |阅读模式
1金钱
老师好
我用的是探索者F4开发板,输入捕获的实验我做完了,我通过TIM14产生4KHz的PWM,然后通过TIM5的通道1也捕获到了,现在我想测试一下输入捕获是否有丢失,也就是统计一下捕获到的脉冲个数,这其中遇到了点问题。

我是这样做的,

首先是配置TIM14的PWM输出,其他部分都和教程一样,只有自动重载值和脉宽调整了一下。
TIM14_PWM_Init(250-1,84-1); //84M/84=1Mhz的计数频率计数到250,PWM频率为1M/250=4Khz
TIM_SetCompare1(TIM14,125); //脉宽125

1、定义了变量v_count,用来记录捕获的脉冲个数,
2、在TIM5的中断中,当捕获到上升沿时,v_count++;
3、用TIM3定时,每秒打印一次 v_count
   
PWM的频率4KHz,每秒应该会产生4000个脉冲信号(我这样计算对不对呀老师?),
实测每秒捕获到3996个,少了4个,而且这个数值很稳定。请问老师这是什么原因呢?

最佳答案

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

上个我用的工程给你,把你的在定时器中断里用printf打印的方式改到while里面查询了,不用printf,用usart_senddata,我做了两次实验,一次只发送捕获计数的高八位,一次只发送捕获计数的低八位。高低八位一起发送的话,需要的第一个usart_senddata后面加点延时,但这个延时会影响结果,所以做了两个实验,或者你可以直接操作串口的寄存器可能会好点
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6657
金钱
6657
注册时间
2015-8-25
在线时间
1034 小时
发表于 2018-6-2 17:54:58 | 显示全部楼层
上个我用的工程给你,把你的在定时器中断里用printf打印的方式改到while里面查询了,不用printf,用usart_senddata,我做了两次实验,一次只发送捕获计数的高八位,一次只发送捕获计数的低八位。高低八位一起发送的话,需要的第一个usart_senddata后面加点延时,但这个延时会影响结果,所以做了两个实验,或者你可以直接操作串口的寄存器可能会好点

实验10 输入捕获实验.zip

3.99 MB, 下载次数: 105

He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6657
金钱
6657
注册时间
2015-8-25
在线时间
1034 小时
发表于 2018-6-2 19:36:05 | 显示全部楼层
工程发上来给你试试
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-6-3 00:53:21 | 显示全部楼层
是不是你的频率就是3996?
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-3 10:36:10 | 显示全部楼层
szczyb1314 发表于 2018-6-2 19:36
工程发上来给你试试

谢谢了,这是工程,我是在咱们的 实验10 输入捕获 标准例程上修改了几处地方。

实验10 输入捕获实验.rar

3.02 MB, 下载次数: 94

回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-3 10:58:57 | 显示全部楼层
本帖最后由 牛仔很忙 于 2018-6-3 11:03 编辑
正点原子 发表于 2018-6-3 00:53
是不是你的频率就是3996?

老师,我是这样配的:
    TIM14_PWM_Init(250-1,84-1);                //84M/84=1Mhz的计数频率计数到250,PWM频率为1M/250=4Khz
    TIM_SetCompare1(TIM14,125);             //脉宽125   
    TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);   //以1Mhz的频率计数


main.png

实验现象

实验现象

   


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-6-4 01:51:56 | 显示全部楼层
牛仔很忙 发表于 2018-6-3 10:58
老师,我是这样配的:
    TIM14_PWM_Init(250-1,84-1);                //84M/84=1Mhz的计数频率计数到 ...

这个计数,你直接放中断里面吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6657
金钱
6657
注册时间
2015-8-25
在线时间
1034 小时
发表于 2018-6-5 12:20:01 | 显示全部楼层
我试过了,程序都是合适的,PWM输出是4K的没问题,捕获到的计数值也是4000(0x0FA0),只是你程序中不该用printf,这个函数很占用时间,我试验如下图:
1113.jpg中我用USART_SendData,输出捕获计数的低八位,结果是0xA0,如图1112.jpg
1114.jpg中我用USART_SendData,输出捕获计数的高八位,结果是0x0F,如图1111.jpg
另外我把捕获中断的抢占优先级设置为最高也就是0.
1113.jpg
1114.jpg
1111.jpg
1112.jpg
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-6 00:54:26 | 显示全部楼层
感谢老师细致的解答!!使我受益匪浅!!我对串口寄存器还不怎么会用,请老师再帮我一下,谢谢了!!
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6657
金钱
6657
注册时间
2015-8-25
在线时间
1034 小时
发表于 2018-6-6 08:55:15 | 显示全部楼层
牛仔很忙 发表于 2018-6-6 00:54
感谢老师细致的解答!!使我受益匪浅!!我对串口寄存器还不怎么会用,请老师再帮我一下,谢谢了!!

库函数只是对寄存器操作的封装而已,便于理解。寄存器操作速度最快,库函数操作还有调用函数的时间花费呢,虽然很短但是也是有这个时间浪费,对执行时间要求较高的地方能汇编则汇编,能寄存器就寄存器,最后考虑库函数。
USART1->DR=data;//对串口1的数据寄存器写入数据串口就开始发送了
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

16

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1242
金钱
1242
注册时间
2017-3-18
在线时间
312 小时
发表于 2018-6-6 09:59:46 | 显示全部楼层
刚画了图,想找出点疑点但是最终没有。建议自己调试,脉冲数量由少增多,从1s1个到1s 100个逐步增大排查,这样可能有助于分析。
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-6 10:04:05 | 显示全部楼层
szczyb1314 发表于 2018-6-6 08:55
库函数只是对寄存器操作的封装而已,便于理解。寄存器操作速度最快,库函数操作还有调用函数的时间花费呢 ...

明白了,谢谢老师。好强大的后台支持!!选正点,真正点!!
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-7 21:34:50 | 显示全部楼层
szczyb1314 发表于 2018-6-6 08:55
库函数只是对寄存器操作的封装而已,便于理解。寄存器操作速度最快,库函数操作还有调用函数的时间花费呢 ...

老师,我用寄存器方式向串口发数据,结果不理想,预期是1500000/秒,也就是16E360 ,实测是在16E1左右浮动,差了不少。还有其他办法么?
TIM图片20180607212803.png TIM截图20180607213357.png

回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6657
金钱
6657
注册时间
2015-8-25
在线时间
1034 小时
发表于 2018-6-8 08:56:47 | 显示全部楼层
牛仔很忙 发表于 2018-6-7 21:34
老师,我用寄存器方式向串口发数据,结果不理想,预期是1500000/秒,也就是16E360 ,实测是在16E1左右浮动 ...

你想捕获1.5M的频率?这个太快了(捕获中断太快了),估计做不到,勉强做到也是有误差的吧,你可以试试,我原来的意思是你在串口发送的时候不要用while((USART1->SR&0X40)==0);这句来等待发送完成,你就用USART1->DR = DATA,这句把数据发出去就行了。分别实验三次,第一次实验仅仅先发高八位,不要发送中间的八位和低八位,如果结果是0x16,然后注释掉发送高八位的哪句,再仅仅发送中间八位,这时不要发送高八位和低八位,看看结果是0xE3么?如果是再发送低八位,如果是0x60,那么说捕获1.5M是可以实现的。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-8 10:01:13 | 显示全部楼层
szczyb1314 发表于 2018-6-8 08:56
你想捕获1.5M的频率?这个太快了(捕获中断太快了),估计做不到,勉强做到也是有误差的吧,你可以试试, ...

老师,我用USART1->DR=DATA试过,捕获没问题,但最终把捕获结果显示出来才算OK。您看能不能给提供些思路,我再尝试一下。多谢多谢
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-8 10:09:12 | 显示全部楼层
牛仔很忙 发表于 2018-6-8 10:01
老师,我用USART1->DR=DATA试过,捕获没问题,但最终把捕获结果显示出来才算OK。您看能不能给提供些思路 ...

如果我间隔30秒或1分钟显示一次捕获结果,这样会不会容易些?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6657
金钱
6657
注册时间
2015-8-25
在线时间
1034 小时
发表于 2018-6-9 07:36:19 | 显示全部楼层
牛仔很忙 发表于 2018-6-8 10:09
如果我间隔30秒或1分钟显示一次捕获结果,这样会不会容易些?

如果是捕获1.5M的信号是正确的,那么久简单了,简单点做:第1s发送高八位,第2s发送中间八位,第3s发送低八位,第4s再发送高八位,如此往复;如果觉得3s的显示周期太长也可以用1s的显示周期,你的捕获值定义u32类型的,前250ms发送高8位,接下来250ms发送次8位,再接下来发送次次8位,接下来250ms发送低8位。
u32 buhuo_value = 0x0016E360;
if(flag_250ms==1)USART1->DR=(u8)((huhuo_value&0xff000000)>>24);
if(flag_500ms==1)USART1->DR=(u8)((huhuo_value&0x00ff0000)>>16);
if(flag_750ms==1)USART1->DR=(u8)((huhuo_value&0x0000ff00)>>8);
if(flag_1000ms==1)USART1->DR=(u8)((huhuo_value&0x000000ff);
这样子就是1s显示周期,但是这个250ms不知道能不能把这个数据从串口成功发出去就不知道了,你试试吧
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2018-5-30
在线时间
48 小时
 楼主| 发表于 2018-6-11 13:05:40 | 显示全部楼层
szczyb1314 发表于 2018-6-9 07:36
如果是捕获1.5M的信号是正确的,那么久简单了,简单点做:第1s发送高八位,第2s发送中间八位,第3s发送低 ...

试过了,效果不理想,再想其他办法吧。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-9-10
在线时间
7 小时
发表于 2019-10-4 23:41:57 | 显示全部楼层
请问为什么我照着例子做了,开始捕获的脉冲数还是对的,一段时间后脉冲计数值就翻倍了呢?然后过一段时间又好了,如此反复
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 18:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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