OpenEdv-开源电子网

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

谁有定时器不能准确定时的解决办法?

[复制链接]

4

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-4-7
在线时间
29 小时
发表于 2016-5-30 17:20:40 | 显示全部楼层 |阅读模式
10金钱
我用外部中断来采集一个10ms周期的方波信号,在上升沿启动定时器,定一定时间,到时后在中断中输出控制信号、再关闭定时器,下降沿,控制信号再取消,下一个周期,再重复这样。刚开始,发现启动定时器后,立即进入了中断,控制信号施加了,定时关闭,下个周期重复。如下图所示:通道2为触发信号,通道1为控制信号,低电平为施加。

立即进入中断

立即进入中断

后来,看了网上的各种帖子、参考手册等,试了好多种方法,始终不能解决,反而又加比原来新增一名:TIM3->EGR |= 1<<0;才能进入中断,否则,不能进入中断了。
后来发现在通道2的8ms当中,总共进入了40次中断,每200us一次,利用这40次中断计次,好像能定时施加控制信号,但是还是不能全部正确,有时不正确。如下图:

中断次数

中断次数

施加信号

施加信号


其实需要延时的时间是由串口传过来的命令确定的,数字不一样,那200us也还是一样。
搞了好几天了,实在搞不明白了。请有确实解决过该问题的朋友帮一下忙,到底需要怎么解决?谢谢!

程序是在原子的库函数版外部中断例程的基础上加上定时器写成的,请大佬们不吝赐教啊!

实验5 外部中断实验_160530.rar (2.19 MB, 下载次数: 131)

天生我才必有用,千金散尽还复来!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-5-30 18:08:39 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-5-30 18:28 编辑

楼主,你计数定时器的更新中断做什么,为什么不设置定时器一步到位,时间到了直接进入中断,而不是计数??
而且你每次重新初始化定时器,都是接着上一次的TIM3_Cnt计数的。我不知道意义何在。

你开比较中断好了,在外部中断里面改变比较寄存器,在比较中断里面改变输出,然后中断自己把自己关了,等外部中断函数开启。另外,最好把外部中断里面的延时改关了
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2016-5-30 20:11:51 | 显示全部楼层
不太明白你现在的问题,是中断进不去,还是指中断进去处理时间不对
1-1
回复

使用道具 举报

4

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-4-7
在线时间
29 小时
 楼主| 发表于 2016-5-30 21:50:54 | 显示全部楼层
憨厚诚实大叔 发表于 2016-5-30 18:08
楼主,你计数定时器的更新中断做什么,为什么不设置定时器一步到位,时间到了直接进入中断,而不是计数?? ...

我是做电机调速的,外部中断检测的是交流过零点,本来我就是准备直接定时几个ms的,只是这样一用,一开启就直接进中断了,没有达到要定时的目的,本来的问题就是“开启定时器,立即进中断,没有准确定时”
天生我才必有用,千金散尽还复来!
回复

使用道具 举报

4

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-4-7
在线时间
29 小时
 楼主| 发表于 2016-5-30 22:03:15 | 显示全部楼层
mygod 发表于 2016-5-30 20:11
不太明白你现在的问题,是中断进不去,还是指中断进去处理时间不对

是没有到定时时间就进中断了
天生我才必有用,千金散尽还复来!
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-5-31 10:05:55 | 显示全部楼层
wyming210 发表于 2016-5-30 21:50
我是做电机调速的,外部中断检测的是交流过零点,本来我就是准备直接定时几个ms的,只是这样一用,一开启 ...

我知道,你别用更新中断,用比较中断,另外关中断别关定时器。
在外部中断用下面的函数设置比较捕获寄存器
TIM_SetCompare1(TIM3,  你需要的延时计数+TIM_GetCounter(TIM3));
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
然后在定时器的比较中断中,处理完后自己把自己关了
TIM_ITConfig(TIM3, TIM_IT_CC1, DISABLE);
回复

使用道具 举报

4

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-4-7
在线时间
29 小时
 楼主| 发表于 2016-6-1 17:37:09 | 显示全部楼层
憨厚诚实大叔 发表于 2016-5-31 10:05
我知道,你别用更新中断,用比较中断,另外关中断别关定时器。
在外部中断用下面的函数设置比较捕获寄存 ...

恕我愚钝,我修改了一下,没有达到我想要的效果,示波器测量的一直是一条直线,帮我看看吧,谢谢!
实验5 外部中断实验_160601-1.rar (2.86 MB, 下载次数: 133)
天生我才必有用,千金散尽还复来!
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-1 17:47:33 | 显示全部楼层
一步步的来啊,你仿真看看他有没有正常进入定时器中断,和有没有进入外部中断               
        if (AC_S_IN==0)
                        {
                                                GPIO_SetBits(GPIOC,GPIO_Pin_9);        这里
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-4-10
在线时间
6 小时
发表于 2016-6-4 23:01:21 来自手机 | 显示全部楼层
楼主如果是用可控硅做电机调速,不如用比较匹配模式,在市电过零时清零计数器,这样可以很方便调节可控硅触发信号的相位
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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