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