/*********************************************************** *功能: 利用pit定时中断,模拟N路定时器,定时间隔1ms *形参: * 无 *返回: * 无 */ void SimulatTimerMsF_PIT_ISR() { uint_8 i; if((PIT_TFLG(SimulatTimer_PIT_Tn) & PIT_TFLG_TIF_MASK) != 0) { PIT_Flag_Clear(SimulatTimer_PIT_Tn); for(i = 0; i < SimulatTimerMsCountN; i++) { if(SimulatTimerMsVal[i] . flag.ten == 1) //使能 { if(++ SimulatTimerMsVal[i].count == 0) //溢出 { SimulatTimerMsVal[i].flag.tov = 1; } if(SimulatTimerMsVal[i].flag.tfc == 1) //比较 { if(SimulatTimerMsVal[i].count == SimulatTimerMsVal[i].cmr) { SimulatTimerMsVal[i].count = 0; SimulatTimerMsVal[i].flag.tcf = 1; } } } } } }
void PIT0_IRQHandler(void) { PIT_Flag_Clear(PIT0); //清中断标志位 TimeCount ++ ; if(TimeCount%5 == 0 ) { TIME0flag_5ms = 1; } if(TimeCount%10 == 0 ) { TIME0flag_10ms = 1; } if(TimeCount%20 == 0 ) { TIME0flag_20ms = 1; } if(TimeCount%80 == 0 ) { TIME0flag_80ms = 1; } if(TimeCount%100 == 0 ) { TIME0flag_100ms = 1; } if(TimeCount%200 == 0 ) { TIME0flag_200ms = 1; TimeCount = 0 ; } }
void PIT0_IRQHandler() { speed_current = FTM2_CNT; speed_count = 1; //printf("%d\n", speed_current); system_clock ++; PIT_Flag_Clear(PIT0); FTM2_CNT = 0; }
/************************************************************************* * Jack * * 函数名称:SysTimerISR * 功能说明:PIT1中断,用作系统时钟 * 参数说明:无 * 函数返回:无 * 修改时间:2013-4-9 已测试 * 备 注: *************************************************************************/ void SysTimerISR(void) { for( uint8 i = 0; i <= 7; i++ ) { PB[i] = gpio_get(PORTC,i+10); } Tick++; PIT_Flag_Clear(PIT1); //清中断标志位 }
/**********************中断服务程序*******************/ void PIT0_IRQHandler(void) { //printf(" %d, %d \r\n",get_gyro(),adc_once(ADC1_SE6a, ADC_12bit)); //printf("x :%d\r\n",adc_once(ADC1_SE6a, ADC_12bit)) ; printf("x :%d\r\n",get_gravity(MMA8451_REG_STATUS ,MMA8451_REG_OUTZ_MSB)); PIT_Flag_Clear(PIT0); //清中断标志位 }
void PIT1_IRQHandler(void) { PIT_Flag_Clear(PIT1); //清中断标志位 FTM_PWM_Duty(FTM0, CH2 ,10); if(sin_count==16) { sin_count=0; } sin_count++; }
void PIT0_IRQHandler(void) { if(aa<1000) aa++; delayms(); mpu6050_read(); angle_calculate(); angle_calculate1(); if (flag==2||flag==1) set_gyro(); if (flag==3&&active==1) { set_gyro1_3(); set_gyro_3(); } // oledplay(); if(flag==1) { motor_control(); SetMotorVoltage(0.05,0); MotorSpeedOut(); } if(qd==0) { motor_control(); SetMotorVoltage(0.05,0); MotorSpeedOut(); } if (flag==3&&active==1) { motor_control_3(); // SetMotorVoltage(0,0.5); MotorSpeedOut_3(); } if (flag==4) { motor_control_4(); SetMotorVoltage(0.05,0); MotorSpeedOut(); } if(flag==5) { set_gyro1(); motor_control1(); SetMotorVoltage(0,0.05); MotorSpeedOut1(); angle_set1=16; } PIT_Flag_Clear(PIT0); //清中断标志位 }
void PIT0_ISR(void) { DisableInterrupts; speed_cnt = encoder_cnt; getEncoder = true; encoder_cnt = 0; GPIOD_PTOR |= (1 << 8); PIT_Flag_Clear(PIT0); EnableInterrupts; }
/********************************5ms定时器*************************************/ void PIT0_IRQHandler(void) { PDkongzhi();//舵机PD控制 //SetMotorVoltage(0.2, 0.2); PID_count(); // if(gpio_get (PTE3)) //拨码3 // { // #if ( CAR_NUMBER == 1 ) // if(gpio_get (PTE5)) // { // #endif // do_camere_stop(img); //检测停车 // #if ( CAR_NUMBER == 1 ) // } // #endif // } vall = - ( ftm_quad_get(FTM1) ); //获取FTM 正交解码 的脉冲数(负数表示反方向) ftm_quad_clean(FTM1); #if ( CAR_NUMBER == 1 ) valr = - ( ftm_quad_get(FTM2) ); //获取FTM 正交解码 的脉冲数(负数表示反方向) ftm_quad_clean(FTM2); #endif #if ( CAR_NUMBER == 2 ) valr = ftm_quad_get(FTM2); //获取FTM 正交解码 的脉冲数(负数表示反方向) ftm_quad_clean(FTM2); #endif if(stop_do) { //检测停车延时,防止第一次检测到之后停车 } else { if(stop_count > 200 * 5) //延时5秒 { stop_do = 1; } else { stop_count++; } } PIT_Flag_Clear(PIT0);//清中断标志位 }
void PIT_IRQHandler(void) { //TpmCountRead(); Speed.Acturally = tpm_pulse_get(TPM2); //Speed.Acturally = (tpm_pulse_get(TPM2) * WheelGirth) / (CordLineInOneCircle * CoderTimeCircle); //保存脉冲计数器计算值 MotorCtrl(); extern uint32 mpwm; //printf("$%d,1000,%d,0,0,0,0,0#", Speed.Acturally, mpwm); tpm_pulse_clean(TPM2); //清空脉冲计数器计算值(开始新的计数) led_turn(LED3); PIT_Flag_Clear(PIT0); }
void PIT2_IRQHandler(void) { PIT_Flag_Clear(PIT2); //清中断标志位 if(key8start) { key8cout ++ ; } if( key8cout > 150) { key8cout = 0 ; key8start = 0 ; } if(key9start) { key9cout ++ ; } if( key9cout > 150) { key9cout = 0 ; key9start = 0 ; } if(key10start) { key10cout ++ ; } if( key10cout > 150) { key10cout = 0 ; key10start = 0 ; } if(key11start) { key11cout ++ ; } if( key11cout > 150) { key11cout = 0 ; key11start = 0 ; } }
/************************************************************************* * 野火嵌入式開發工作室 * * 函數名稱:pit_init * 功能說明:PITn定時中斷 * 參數說明:PITn 模塊號(PIT0~PIT3) cnt 延時時間(單位為bus時鐘周期) * 函數返回:無 * 修改時間:2012-1-24 * 備 注: *************************************************************************/ void pit_init(PITn pitn,u32 cnt) { //PIT 用的是 Bus Clock 總線頻率 //溢出計數 = 總線頻率 * 時間 /* 開啟時鐘*/ SIM_SCGC6 |=SIM_SCGC6_PIT_MASK; //使能PIT時鐘 /* PIT模塊控制 PIT Module Control Register (PIT_MCR) */ PIT_MCR &=~(PIT_MCR_MDIS_MASK | PIT_MCR_FRZ_MASK ); //使能PIT定時器時鐘 ,調試模式下繼續運行 /* 定時器加載值設置 Timer Load Value Register (PIT_LDVALn) */ PIT_LDVAL(pitn) =cnt; //設置溢出中斷時間 //定時時間到了後,TIF 置 1 。寫1的時候就會清0 PIT_Flag_Clear(pitn); //清中斷標志位 /* 定時器控制寄存器 Timer Control Register (PIT_TCTRL0) */ PIT_TCTRL(pitn) |=( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK ); //使能 PITn定時器,並開PITn中斷 enable_irq(pitn+68); //開接收引腳的IRQ中斷 }
void PIT0_IRQHandler(void) { DisableInterrupts; TimeCount ++ ; I1_Vol_present_value=ad_ave(ADC0, AD9,ADC_16bit,10); I1_Vol_present_value=I1_Vol_present_value/65535*3.3; U1_present_value=ad_ave(ADC0, AD10,ADC_16bit,10); U1_present_value=U1_present_value/65535*3.3*16; U2_present_value=ad_ave(ADC0, AD12,ADC_16bit,10); U2_present_value=U2_present_value/65535*3.3*16; sum+=I1_Vol_present_value; PID_control(); if(TimeCount==3000) { TimeCount = 0 ; sum/=3000; I1_Vol_present_value=sum; Refresh_Present(); sum=0; if(U1_present_value>=24) { gpio_init(PORTC,3,GPO,0); gpio_init(PORTC,4,GPO,0); start_flag=0; ftm_flag=0; } } EnableInterrupts; PIT_Flag_Clear(PIT0); //清中断标志位 }
void SamplingISR(void) { #define T 10 static uint8 count; DisableInterrupts; //关总中断 GetPosInfo(); FuzzyCtrl(); if(count>T) { count = 0; SpeedCtrl(); if(StopDelay<30*T+10) StopDelay++; //ScopeShow(); } else { count++; } ShowLCD(); PIT_Flag_Clear(PIT0); //清中断标志位 EnableInterrupts; //开总中断 }
void PIT3_IRQHandler(){ #ifdef PIT3_OnInt PIT3_OnInt(); #endif PIT_Flag_Clear(PIT3); }
void pit3_system_loop(void) { switch (system_mode) { case 0: if(gpio_get(PORTE, 6) == 0) { system_mode=99; } if(gpio_get(PORTE, 8) == 0) {system_mode=98;} if(gpio_get(PORTE, 9) == 0) {system_mode=97;} if(e<5000){e++;system_mode=0; //wait 5 sec } break; case 99: ideal_speed=300; trankp=14; leftkp=12; rightkp=13; leftkd=8; rightkd=6; system_mode=100; break; case 98: ideal_speed=300; trankp=13; leftkp=13; rightkp=11; leftkd=9; rightkd=7; system_mode=100; break; case 97: ideal_speed=180; trankp=18; leftkp=18; rightkp=14; leftkd=11; rightkd=9; system_mode=100; break; case 100: if(t<3000){t++; //wait 3 sec system_mode=100; } else{ {system_mode=1; FTM_PWM_Duty(FTM1,CH1,3800); }} break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: //get sensor advalue for(i = 0; i < 6; i++){ ADvalue_left += ad_max(ADC0,SE14,ADC_16bit,20); ADvalue_right += ad_max(ADC0,SE15,ADC_16bit,20);} ADvalue_left=ADvalue_left/6; ADvalue_right=ADvalue_right/6; //decide turn left or turn right ADvalue_left=ADvalue_left-41500; ADvalue_right=ADvalue_right-42000; if(ADvalue_left<0){ADvalue_left=1;} //avoid 0/0 if(ADvalue_right<0){ADvalue_right=1;} k=ADvalue_right-ADvalue_left; // easy to go straight if(k<1400 && k>-1400 && ADvalue_left>6000 && ADvalue_right>6000) {k=750; FTM_PWM_Duty(FTM0,CH1,k); tempk=k; system_mode=system_mode+1; ADvalue_left=0; // set ad value to zero ADvalue_right=0; break; } q=ADvalue_right+ADvalue_left; k=k*1000; k=k/q; if(k>0){ k=k*k;} if(k<0){ k=-k*k;} k=k/1000; k=k*trankp/100; if(k>0){k=k*rightkp/10;} if(k<0){k=k*leftkp/10;} k=750+k; if(k>910){k=909;} if(k<570){k=571;} errork=k-tempk; if(k>0){errork=errork*rightkd/10;} if(k<0){errork=errork*leftkd/10;} k=k+errork; if(k>910){k=909;} if(k<570){k=571;} absoluterrork=k-tempk; if(absoluterrork>50 || absoluterrork<-57){k=tempk;} FTM_PWM_Duty(FTM0,CH1,k); ADvalue_left=0; ADvalue_right=0; tempk=k; system_mode=system_mode+1;//go to next state on next cycle if(s<5000){s++; rsw=0;} else{ if(rsw>1){system_mode=22;}} break; case 21: // speed control encoder20ms = FTM2_CNT; error = ideal_speed-encoder20ms ; if(error==ideal_speed){error= error*7;} if(error>ideal_speed*7/10){error = error*4;} if(error>ideal_speed*9/20){error = error*2;} if(error>ideal_speed*1/5){error = error*1;} if(error>0){error = error*1/5;} if(error<-ideal_speed){error = error*7;} if(error<-ideal_speed*7/10){error = error*4;} if(error<-ideal_speed*9/20){error = error*2;} if(error<-ideal_speed*1/5){error = error*1;} if(error<0){error = error*1/5;} if(encoder20ms!=ideal_speed){final_speed = final_speed+error;} if(final_speed>8000){final_speed=7600;} if( encoder20ms>ideal_speed*2) { gpio_set(PORTD,9,0); final_speed= 2000; } else{gpio_set(PORTD,9,1);} FTM_PWM_Duty(FTM1,CH1,final_speed); FTM2_CNT=0; system_mode=1; //back to the top of pit if(s<5000){s++; rsw=0;} else{ if(rsw>1){system_mode=22;}} break; case 22: FTM_PWM_init(FTM1,CH1,10000,0); break; } PIT_Flag_Clear(PIT3); }
void PIT0_IRQHandler() { pit0_isr(); PIT_Flag_Clear(PIT0); }
/************************************************************************* * 野火嵌入式开发工作室 * * 函数名称:PIT0_IRQHandler * 功能说明:PIT0 定时中断服务函数 * 参数说明:无 * 函数返回:无 * 修改时间:2012-2-18 已测试 * 备 注: *************************************************************************/ void PIT0_IRQHandler(void) { PIT_Flag_Clear(PIT0); //清中断标志位 }
void PIT0_IRQHandler(void) { DisableInterrupts; PIT_Flag_Clear(PIT0); zlf++; sf++; df++; if(b==1) { if(fanzhuan==0) { sdsd=700;//1350 fanzhuan=1; } } if(d==1||g_fCarAngle>=35) while(1) { FTM_PWM_Duty(FTM0, CH0, 0); FTM_PWM_Duty(FTM0, CH1, 0); FTM_PWM_Duty(FTM0, CH2, 0); FTM_PWM_Duty(FTM0, CH3, 0); } /////////////////////////////////////////////////////分段 g_nSpeedControlPeriod++; speedcontrolout(); g_nDirectionControlPeriod++; directcontrolout(); ////////////////////////////////////////////// if(zlf>=5) { zlf=0; AD_Calculate(); Speed_Calculate(g_fCarAngle,Gyro_Now);//清华 // Speed_Calculate(angle,angle_dot);//卡尔曼 ssc();///////////////////////////////////////////////////PWM驱动 } if(df>=10) { df=0; g_nDirectionControlPeriod=0; directcontrol(Find_Mid_Place);///////////////////////////////////传入中线值 } if(sf>=100) { sf=0; g_nSpeedControlPeriod=0; speedcontrol(); } if(js==0) { StartIntegration1(); StartIntegration2(); js=1; } else fs++; EnableInterrupts; }
/************************************************************************* * 野火嵌入式开发工作室 * * 函数名称:PIT0_IRQHandler * 功能说明:PIT0 定时中断服务函数 * 参数说明:无 * 函数返回:无 * 修改时间:2012-2-18 已测试 * 备 注: *************************************************************************/ void PIT0_IRQHandler(void) { LED_turn(LED0); //LED0反转 PIT_Flag_Clear(PIT0); //清中断标志位 }