Example #1
0
/***********************************************************
 *功能:	利用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;
					}
				}
			}
		}
	}
}
Example #2
0
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 ;
  } 
  
}
Example #3
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;
}
Example #4
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);       //清中断标志位
}
Example #5
0
File: main.c Project: gxx9203/mk60
/**********************中断服务程序*******************/
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);       //清中断标志位
}
Example #6
0
File: isr.c Project: Magicwangs/IAR
void PIT1_IRQHandler(void)
{
   PIT_Flag_Clear(PIT1);       //清中断标志位
   
   FTM_PWM_Duty(FTM0, CH2 ,10);
   if(sin_count==16)
   {
     sin_count=0;
   }
   sin_count++;

}
Example #7
0
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);       //清中断标志位
}
Example #8
0
void 
PIT0_ISR(void)
{
    DisableInterrupts;
    
    speed_cnt = encoder_cnt;
    getEncoder = true;
    encoder_cnt = 0;
    
    GPIOD_PTOR |= (1 << 8);
    PIT_Flag_Clear(PIT0);
    
    EnableInterrupts;
}
Example #9
0
/********************************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);
}
Example #11
0
File: isr.c Project: Magicwangs/IAR
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 ;
   }

}
Example #12
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中斷
}
Example #13
0
File: isr.c Project: Magicwangs/IAR
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);       //清中断标志位
}
Example #14
0
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;		//开总中断
}
Example #15
0
void 	PIT3_IRQHandler(){
#ifdef 	PIT3_OnInt 
		PIT3_OnInt();
#endif
	PIT_Flag_Clear(PIT3);
}
Example #16
0
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);

}
Example #17
0
void PIT0_IRQHandler()									
{
  pit0_isr();
  PIT_Flag_Clear(PIT0);
}
Example #18
0
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:PIT0_IRQHandler
*  功能说明:PIT0 定时中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-2-18    已测试
*  备    注:
*************************************************************************/
void PIT0_IRQHandler(void)
{ 
    PIT_Flag_Clear(PIT0);       //清中断标志位
}
Example #19
0
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;
}
Example #20
0
/*************************************************************************
*                             野火嵌入式开发工作室
*  
*  函数名称:PIT0_IRQHandler
*  功能说明:PIT0 定时中断服务函数
*  参数说明:无   
*  函数返回:无
*  修改时间:2012-2-18    已测试
*  备    注:
*************************************************************************/
void PIT0_IRQHandler(void)
{
    LED_turn(LED0);             //LED0反转
    PIT_Flag_Clear(PIT0);       //清中断标志位
}