void cal_speed(void) { if(tmr5isr_nums>0)//当T5产生溢出中断就认为转速为0 { now_speed=0; ic_isr_nums=0; // direction=NO_MOV; return; } if(ic_isr_nums>3)//当转速达到一定的转速的时候才开始检测 { if(conflag.ad_ready==1) { if(conflag.velocity_ready==1) { //csbuf1/=2; now_speed=(unsigned int)(SPEED_CON/csbuf1); conflag.velocity_ready=0; } else { return; } } else { return; } } }
void isr_ic(void) { if(PIR3bits.IC1IF==1) { updata_sequence(); PIR3bits.IC1IF=0; if(conflag.valid_hall==1) { PORTCbits.RC7=0; csbuf2=CAP1BUFL; csbuf0=CAP1BUFH; csbuf0<<=8; csbuf0|=csbuf2; csbuf+=csbuf0; if (hall_sensor_count<hall_cap_count) { hall_sensor_count++; } else { PORTCbits.RC7=1; csbuf1=csbuf; csbuf=0; csbuf0=0; csbuf2=0; hall_sensor_count=0; conflag.velocity_ready=1; } } else { conflag.valid_hall=1; return; } } else if(PIR3bits.IC2QEIF==1) { updata_sequence(); PIR3bits.IC2QEIF=0; if(conflag.valid_hall==1) { csbuf2=CAP2BUFL; csbuf0=CAP2BUFH; csbuf0<<=8; csbuf0|=csbuf2; csbuf+=csbuf0; if (hall_sensor_count<hall_cap_count) { hall_sensor_count++; PORTCbits.RC7=0; } else { csbuf1=csbuf; csbuf=0; csbuf0=0; csbuf2=0; hall_sensor_count=0; conflag.velocity_ready=1; } } else { conflag.valid_hall=1; return; } } 这是一段使用PIC18F2431的IC捕捉模块测速的子程序,现在的问题是检测到的误差会跳变,在1000的时候会有100-200的跳变,经过仿真观察是因为CSBUF1的值,在同等转速下产生很大的跳变,不知道如果去处理? 希望大家给点建议,已经找了10多天了始终没有找到问题!! 在此先谢谢!! |