OpenEdv-开源电子网

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

F4定时器多通道输入捕获

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-6-27
在线时间
14 小时
发表于 2018-9-12 16:12:40 | 显示全部楼层 |阅读模式
15金钱
现在是想用TIM3的通道1-4捕获遥控器接收机的4个通道的pwm,测量其脉宽。既然是多通道,就在原子哥的输入捕获源码上修改了一下,在捕获中断中不进行定时器清零操作,而是记录下上升沿到来时的CNT值,最后计算的值是0xFFFF*溢出次数+下降沿时的CNT值-上升沿时的CNT值,但是只使用一个通道时就会隔一段时间出现很大的一个数,若同时打开两个通道就更混乱了,找不出问题困扰了好久~求大神解答。还有怎么用HAL库判断定时器捕获中断是来自哪一个通道的??if条件是什么
1.png

捕获中断

捕获中断

主函数

主函数

串口打印数据

串口打印数据

最佳答案

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

这原因很明显, 当ARR溢出前捕获一个值, ARR溢出后捕获一个值, 两值双减, 自然就得到这错误的大数值了 解决方法 Cycle_Val = (TIM_Cap_Val - TIM_Cap_LastVal + Arr+1)% (Arr+1);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-12 16:12:41 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-12 16:20 编辑

这原因很明显, 当ARR溢出前捕获一个值, ARR溢出后捕获一个值, 两值双减, 自然就得到这错误的大数值了
解决方法
Cycle_Val = (TIM_Cap_Val - TIM_Cap_LastVal + Arr+1)% (Arr+1);

回复

使用道具 举报

4

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
748
金钱
748
注册时间
2018-9-1
在线时间
178 小时
发表于 2018-9-12 16:22:35 | 显示全部楼层
没看代码,但是这个大数字 = 0xFFFF FFFF+ 1515;
uevip#126.com
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-6-27
在线时间
14 小时
 楼主| 发表于 2018-9-12 16:58:28 | 显示全部楼层
edmund1234 发表于 2018-9-12 16:18
这原因很明显, 当ARR溢出前捕获一个值, ARR溢出后捕获一个值, 两值双减, 自然就得到这错误的大数值了
...

非常感谢,用这个公式后数值就没有问题了,可是我之前的式子也加上了ARR的值了,ARR-Val+LastVal感觉理论上应该对的呀
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-12 17:25:58 | 显示全部楼层
柠檬C 发表于 2018-9-12 16:58
非常感谢,用这个公式后数值就没有问题了,可是我之前的式子也加上了ARR的值了,ARR-Val+LastVal感觉理论 ...

别只看答案, 要去理解为啥公式要这样写
码农某个情度象个医生, 专医代码
如果说只是死记答案, 感冒就吃什么药, 头痛就吃什么药, 完全不管背后的病理, 那肯定不是个好医生, 没碰到过的病就只能靠百度了
如果你真的去理解这公式的背后原理, 你刚刚提的问题是你完全可以解决了
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-6-27
在线时间
14 小时
 楼主| 发表于 2018-9-12 17:35:45 | 显示全部楼层
edmund1234 发表于 2018-9-12 17:25
别只看答案, 要去理解为啥公式要这样写
码农某个情度象个医生, 专医代码
如果说只是死记答案, 感冒 ...

现在的问题是不能多通道捕获,不知道怎么判断捕获中断是来自哪一个通道的,以至于两个通道一开启数值就都乱了......大神知道HAL库怎么判断嘛~
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-12 17:39:16 | 显示全部楼层
柠檬C 发表于 2018-9-12 17:35
现在的问题是不能多通道捕获,不知道怎么判断捕获中断是来自哪一个通道的,以至于两个通道一开启数值就都 ...

除了初始外设外, 不用库, 用也只用STD的库, HAL没用过
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-9-14 17:54:25 | 显示全部楼层
edmund1234 发表于 2018-9-12 16:12
这原因很明显, 当ARR溢出前捕获一个值, ARR溢出后捕获一个值, 两值双减, 自然就得到这错误的大数值了
...

Cycle_Val = (TIM_Cap_Val - TIM_Cap_LastVal + Arr+1)% (Arr+1);
周期=(捕获值-上次捕获值+重装载值+1)%(重装载值+1)
如捕获值=3,上次捕获值=2,可能走了一圈,还不知道,只能得到一个合理的值
如11%10=1,但不能得到一个正确的值
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-14 18:06:00 | 显示全部楼层
1208 发表于 2018-9-14 17:54
Cycle_Val = (TIM_Cap_Val - TIM_Cap_LastVal + Arr+1)% (Arr+1);
周期=(捕获值-上次捕获值+重装载 ...

任何一种捕获的方法都是有范围限制的, 多加一个TIMX, 使用相同的ARR值, 每次捕获后就把TIMX清零, 便可根据TIMX溢出得知数据已超出范围
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-9-14 18:24:39 | 显示全部楼层
edmund1234 发表于 2018-9-14 18:06
任何一种捕获的方法都是有范围限制的, 多加一个TIMX, 使用相同的ARR值, 每次捕获后就把TIMX清零, 便 ...

原来你很强
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 00:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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