求平均基本没用,红外线角度我用热缩管给它套住
造成显示抖动的原因分析 1:电机转速不稳(即前次所测时间与当次相差很大) ,但我用示波器看红外接收波形基本没圈都一致(大概一圈是18MS),这点可以排除电机不稳的问题. 2:红外元件在检测中由于电机旋转造成的抖动(不平衡)而使接收角度有偏差. 对于平衡电因没有合适的仪器,所以只能是个大概的判断:在初次调试中测得电机工作电流,然后凭感觉在某端点装一根螺杆,越小越好,以使平衡点调试更加精细,测试电机电流,如果变大,换方向安装,如果减小,继续安装螺杆,或者套一个螺帽,直到电机电流最小,这时手握电机旋转基本上抖动不是那么厉害. 3:最怀疑的一点,软件思路不对,对于一周时间无法给180或360所整除,造成余数引起显示位置不能固定,还有TIME1的分频系数也是引起误差的关键,真的是想不出好的办法,看了N遍老外写的程序也没看明白,感觉如果要使显示稳定,误差必须为0,可如何避免这个误差. 4:难道我的电机速度不够???是不是加快电机装速,以旋转4周或8周甚至更多来作一次动态显示?下面是我写的测试程序,简单到把一个圆平分成60等份,要求显示稳定,惭愧我做不到啊,肯顶高人给我作一下分析,感激不尽 ***********************************************************************/ #include "pic.h" __CONFIG (PWRTEN&WDTEN&HS&BORV25&PROTECT); /***********************************************************************/ void mcu_init (void); void display (void); /***********************************************************************/ #define clock_bk_on() RA2=1 #define clock_bk_off() RA2=0 #define time1_en() T1CON=0x31 #define time1_dis() T1CON=0 #define time2_interrupt_en() PIE1=2 #define time2_interrupt_dis() PIE1=0 #define time2_en() T2CON=7 #define time2_dis() T2CON=0;TMR2=0 /***********************************************************************/ volatile unsigned int time1_temp; volatile unsigned char CLOCK_ADDR; volatile unsigned char data_y; volatile unsigned char cnt; volatile long buff; /************************************************************************/ void mcu_init (void) { TRISA=0; TRISB=1; OPTION=1; INTCON=0XD0; ADCON1=7; CLRWDT(); } /**************************************************************************/ void interrupt isr (void) { if (INTF) { INTF=0; CLOCK_ADDR=0; time1_dis(); buff+=(TMR1L|TMR1H<<8); TMR1L=TMR1H=0; time1_en(); if (++cnt>=8) { cnt=0; time1_temp=(unsigned int) (buff/8); buff=0; /* if ((time1_temp>21000)||(time1_temp<6000)) { time2_dis(); time2_interrupt_dis(); clock_bk_off(); } else { */ time1_temp=(time1_temp+data_y); PR2=(time1_temp/360); data_y=(time1_temp%360); time2_en(); time2_interrupt_en(); clock_bk_on(); display(); //} } } /*---------------------------------------------------------------------------*/ if (TMR2IF) { TMR2IF=0; display(); } } /*********************************************************************************/ void display (void) { if ( (CLOCK_ADDR==0)|| (CLOCK_ADDR==15)|| (CLOCK_ADDR==30)|| (CLOCK_ADDR==45)|| (CLOCK_ADDR==60)|| (CLOCK_ADDR==75)|| (CLOCK_ADDR==90)|| (CLOCK_ADDR==105)|| (CLOCK_ADDR==120)|| (CLOCK_ADDR==135)|| (CLOCK_ADDR==150)|| (CLOCK_ADDR==165) ) { PORTA|=0xa;PORTB=0X18;} else { PORTA&=0X4;PORTB=0;} ++CLOCK_ADDR; } /************************************************************************************/ void main (void) { unsigned int i; PORTA=0; PORTB=0; TMR0=0; mcu_init(); while (1) { for (i=10000;i>0;i--) CLRWDT(); mcu_init(); } } |
|