单片机/MCU论坛
直播中

天生我才

7年用户 47经验值
擅长:可编程逻辑 MEMS/传感技术 嵌入式技术 处理器/DSP 接口/总线/驱动 控制/MCU
私信 关注
[讨论]

歩进电机测速时有一个问题,一直未解决,求大佬帮忙!!!!

问题是这样的,我用定时器定时50ms,在定时器服务函数里面,判断是否到了12s,12s到了就显示转速。用计数器计脉冲数。(步进电机一档转一圈6s,二挡转一圈4s),现在有这么一个问题,转速可以在1602液晶实时显示,不过数据是错的,并且数据还一直在变,我现在不知道问题在哪,求各位大佬指点!!!!我不允许计数器中断的。一个是定时器的初始化,一个是定时器的中断服务程序,急急急!!! 定时器初始化.jpg 定时器中断服务程序.jpg

回帖(13)

天生我才

2018-5-9 16:25:58
求各位大佬帮忙!!!!
举报

天生我才

2018-5-10 08:46:41
没人吗??????
举报

陈志超

2018-5-10 09:05:17
if(240 == count)    这样也行么?改成if(count == 240)shiyixa
举报

天生我才

2018-5-10 09:29:40
引用: 向北c 发表于 2018-5-10 09:05
if(240 == count)    这样也行么?改成if(count == 240)shiyixa

好,我回去试一下,不过我觉得应该不是这个问题,一般常量不是写在前面的吗?
举报

天生我才

2018-5-10 09:40:16
引用: 向北c 发表于 2018-5-10 09:34
中断里处理的东西不能太多,你可以把数据处理拿到外面,处理完毕之后再对kop清零就好了

但是我进入中断后,if(count == 240)了,我就关了中断EA,完了后再打开EA,也不行啊,我这样试了
举报

陈志超

2018-5-10 11:16:11
kop = TH0<<8   就是说把低八位存在了kop之中,kop = (kop+ TL0)/2*10*5就相当于TL0*10*5  这是什么意思  另外你的脉冲数在12s内 会不会超过65535  超过会造成溢出,注意变量类型  不要溢出    ps:  TL0*10*5   这是吧脉冲个数低八位放大了50倍    速度需要除以时间啊  还是已经被你除过之后  算出来是应该x50
举报

天生我才

2018-5-10 12:38:06

kop = TH0 << 8,不应该是把TH0中的数据(16进制)左移8位,然后给kop,然后用(kop+TL0)就是计数器中的值,我的码盘有两个孔,计数器计数规则不是(1->0)时候就自动加1,定时12s(1圈需要4s或者6s),计数器也不会溢出啊。12s计数的个数是(kop+TL0),那1分钟就是5*(kop+TL0),我想显示的格式是:例如15.0。我就给他扩大了10倍,变成一个三位数,然后在取位,在显示。
举报

人中狼

2018-5-10 13:25:40
显示部分的程序放到主程序里,不要放到中断里
举报

天生我才

2018-5-10 13:40:08
引用: 人中狼 发表于 2018-5-10 13:25
显示部分的程序放到主程序里,不要放到中断里

我的主程序里面还有一个while(1),要处理那个按键按下,电机做相应的操作的,相当于一个死循环,如果要写在主程序里面,要怎么写?求大佬支招
举报

人中狼

2018-5-10 13:44:10
在定时中断里做一个定时标志,定时到了就置1,在主程序里判断这个标志,标志为1了,就显示转速就可以了
举报

天生我才

2018-5-10 13:48:36
引用: 人中狼 发表于 2018-5-10 13:44
在定时中断里做一个定时标志,定时到了就置1,在主程序里判断这个标志,标志为1了,就显示转速就可以了

主函数.jpg
大佬,我的主函数这样写的,你说那个标志位判断,要写在那一块,求指导
举报

人中狼

2018-5-10 15:16:09

while(1)
{
        KeyChoice();
        if(time_out)            //time_out 定时标志
        {
              display();
              time_out = 0;
         }
}
举报

天生我才

2018-5-10 16:15:33
引用: 人中狼 发表于 2018-5-10 15:16
while(1)
{
        KeyChoice();

谢谢老哥,非常感谢!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分