按照你的思路我又重新写了个程序,发现在代码上有明显的压缩,但抖动还是无法解决.但比之前我的程序测试有了明显的提高,我怀疑我的时钟速度可能不够快.不知匠人的时钟也纯在略微的抖动?打算有空画个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(); } } |