发新帖我要提问
123
返回列表
打印

菜鸟也想做个电机钟,硬件都搞好了,可是显示不稳定啊

[复制链接]
楼主: FZJ
手机看帖
扫描二维码
随时随地手机跟帖
41
xue| | 2008-1-7 16:25 | 只看该作者 回帖奖励 |倒序浏览

不是除180和360

除512,不是180和360.就都解决了.

使用特权

评论回复
42
fzj| | 2008-1-7 16:42 | 只看该作者

再次请教匠人

按照你的思路我又重新写了个程序,发现在代码上有明显的压缩,但抖动还是无法解决.但比之前我的程序测试有了明显的提高,我怀疑我的时钟速度可能不够快.不知匠人的时钟也纯在略微的抖动?打算有空画个PCB用18系列的高速单片机,采用40M时钟进行测试.今天为这个都实验了N次.
第一次:我本来想既然匠人这么在乎"双字节",所以我干脆就不用TIME1,改用TIME2后分频比1:4,初始化设定为100US,即电机转数为100US*180=18MS,通电测试第一惊喜:角度有了明显的改善,相互在肉眼上基本看不出有太大的偏差.第二惊喜:原本以为你这个控制方式在速度跟踪上反应会很迟钝,但实际测试发现跟踪速度很快,凭感觉电机从开始工作到稳定基本对应,所以我觉得匠人的"模糊控制"可以不要.
第3点就是遗憾了,美中不足的就是显示抖动厉害,但有时也能同步,之前我还怀疑是不是红外接收抗干扰有问题,但后来仔细想想感觉也不是,因为过零后的第一个指示是相当稳定,只是单片机在通过时间计算所显示出来的有很大的偏差.为什么???????脑袋一片模糊.难道速度反应不过来??于是我去掉了显示函数的多个角度判断,干脆就最简单的,显示两点,结果通电测试"故障"依旧.第一次以失败告终.
第2次:报着侥幸的心里把TMR2改用TMR0,也就怀疑TMR2后分频的问题,结果测试发现还是一样的抖动.后来在查看匠人的程序发现匠人的调节精度要比我高好多,难道1US的调节精度会引起这么大的误差????于是把TMR0的分频比设定为2,即调节精度0.5US(16M时钟),测试发现在抖动上有了明显的提高.高兴之下马上把TMR0的分频器扔掉,可回过头一想,8位定时器在不做分频的情况下即使不给初始值也只有256*0.25=64US,这个时间在我的电机转数中肯定无法调整和工作.于是又放弃了.
第3次:还是一摸一样的照写吧,改用TMR1不作分频,通电测试,发现抖动比以前有了很大的提高,基本还算稳定,但还是没有想要的效果,不知为何?希望能得到匠人和各位高手的指导,谢谢!
下面是我抄匠人的程序,或许抄也抄的很不理想,请匠人指点.谢谢!
/**************************************************************************/
 void    interrupt  isr   (void)

     if   (INTF)
   {   INTF=0;
       if   (CLOCK_ADDR>179) {if  (TMR1_temp>100)  TMR1_temp--;}
       else {
            if   (CLOCK_ADDR<179) {if  (TMR1_temp<65400) TMR1_temp++;}
            }
       CLOCK_ADDR=0;
       TMR1L=(TMR1_temp&0X00FF);
       TMR1H=(TMR1_temp>>8);
       TMR1IF=0;
       display();
    }
/*---------------------------------------------------------------------------*/
            if   (TMR1IF)
        {     TMR1IF=0;
              TMR1L=(TMR1_temp&0X00FF);
              TMR1H=(TMR1_temp>>8);
              if  (++CLOCK_ADDR>0xfe)  CLOCK_ADDR=0xff;
              display();
             
        }
 }

使用特权

评论回复
43
李冬发| | 2008-1-7 17:46 | 只看该作者

不用除法就用乘法

使用特权

评论回复
44
程序匠人| | 2008-1-7 22:04 | 只看该作者

提两点小建议

提2点小建议:
1、请查一下你的指针板的重心是否偏移很大,导致电机转速不稳,如是,则应想办法克服。(调整指针板重心,或加强基板固定)
2、对TMR1的每次赋值,应该用“追加”,而不是用“重新赋值”,其中有着细微的差别。可能会导致每次定时中断时间不均。如果你手上有张明峰的书,可以看一下第210页的例6-10。
--------------------------------------------------
你的程序:
if   (TMR1IF)
        {     TMR1IF=0;
              TMR1L=(TMR1_temp&0X00FF);        //匠人注意到,你这里是重新赋值给TMR1,但是,在此之前的指令,好像被“忽略”了吧? 
              TMR1H=(TMR1_temp>>8);
              if  (++CLOCK_ADDR>0xfe)  CLOCK_ADDR=0xff;  //你这句语句好像有问题????+1后,〉0xfe时=oxff??那下次再进来岂不是要溢出了?
              display();
             
        }

--------------------------------------------------
匠人的程序:

    //================
    //TMR1中断,用于显示扫描控制
    //================
    if ( TMR1IE && TMR1IF )                    
    {
        TMR1IF = 0 ;                    //清除中断标志
        TMR1ON = 0 ;                    //TMR1暂停
        TMR1HL = TMR1HL + DISP_TIME_SET ;        //TMR1重新赋初值(请注意,匠人用的是“追加”,而不是重新赋值。)
        TMR1ON = 1 ;                    //TMR1启动

        if ( ++TIMR1_JSQ > 250 ) TIMR1_JSQ = 250 ;    //TIMR1溢出计数器+1,>250,=250

        if ( ++DISP_LINE > 179 ) DISP_LINE = 0 ;    //显示列计数器+1,>179,=0
        
        //========
        //根据显示列计数器,刷新显示缓冲区
        //========

     。。。。。。。。。。。。。。。

使用特权

评论回复
45
nxy825715| | 2008-1-11 17:05 | 只看该作者

个人见解:

在论坛上看到求助时,我就头晕,下面就马上关闭网页

使用特权

评论回复
46
nxy825715| | 2008-1-11 17:07 | 只看该作者

个人见解:

在论坛上看到求助时发来大段的代码,我就头晕,下面就马上关闭网页

使用特权

评论回复
47
bios51| | 2008-1-12 00:34 | 只看该作者

!

使用特权

评论回复
48
sch_l| | 2008-1-22 19:39 | 只看该作者

顶好贴,匠人厉害!

使用特权

评论回复
49
people12| | 2008-1-28 13:48 | 只看该作者

我看你还是看一下电机拖动!

使用特权

评论回复
50
jianzhengbo| | 2010-9-16 09:38 | 只看该作者
请教匠人,我用的是4位机,只有一个定时器,最高定时到2MS,没有IO口中断,电机转速在25-35MS之间,7个灯。对于显示没有什么问题,就是在移动的时候,移过速度检测点之后的数据无法显示出来,我用的算法是在速度检测点之后,就显示之后延时,但是这种算法对于移动效果就很不好,对于你们所说的一周平分360等份,觉得可行,可是有个疑问,如果转速偏差较大,那么在速度检测点附近会出现一个字被分开的现象(我猜想),能详细说下吗,最好有个流程图。还有我觉得用红外是不是很浪费钱啊,单片机用那么贵的。

使用特权

评论回复
51
ar_dong| | 2010-9-16 20:20 | 只看该作者
要么调速,要么位置反馈
每时每刻知道自己在哪里就知道该显示什么了

使用特权

评论回复
52
huangqi412| | 2010-9-16 22:08 | 只看该作者
请教匠人,我用的是4位机,只有一个定时器,最高定时到2MS,没有IO口中断,电机转速在25-35MS之间,7个灯。对于显示没有什么问题,就是在移动的时候,移过速度检测点之后的数据无法显示出来,我用的算法是在速度检测 ...
jianzhengbo 发表于 2010-9-16 09:38

市面上有用4位机做的显示字的小风扇。价格灰常低,芯片是绑定的。。。
用红外管占地方又奢侈,那个直接靠接触点产生中断。。。

有兴趣的话可以自己去找找。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则