Esempio n. 1
0
/* ================= PIT0_ISR ====================
      desc: PIT周期定时中断,用于控制激光传感器分时亮
      pre:  无
      Post: 无       
*/ 
void interrupt 66 PIT0_ISR(void) {
    DisableInterrupts; 
      Light_Up();         //激光整排点亮
     
   //  Collect_IR();   //这两个是红外捕捉和判断红外位置 先注释
   //  Level_IR();
   Confirm_Light(); //排除误点
   Clear_baitou();  //position的第一次滤波
   General_Position();      
   Collect_Point();
   Collect_Section();
   Judge_Slope();
   Clear_General();
   
   dajiao();

  /* send_count++;
   if(send_count%20==0) {
     send_count=1;
    TestSMinfo();  
   }   
    */
  
   baitou_delay++;
   if(baitou_delay%10==0) 
   {
    baitou_delay=1;
    baitou( ); //先执行摆头舵机,通过计算得出角度,为第二次滤波做准备
    } 
    Clear_Speed();
    SpeedCtrl();
    PITTF_PTF0 = 1;//清中断标志位 
    EnableInterrupts; 
} //PIT0_ISR  
Esempio n. 2
0
S32 CPlayHelper::_frameFunc(Frame_t* pFram, Void* Param)
{
	while (!IsPlaying())
	{
		//Open后,堵住,点play后开始
		Sleep(3);	
	}

	//暂停和恢复
	PauseResume();

	//按帧播放PlayFrame();
	PlayFrame();

	m_nCurFrame = pFram->FrameNo;
	if(pFram->FrameType == FRAME_I || pFram->FrameType == FRAME_P)
	{
		if(IsPlayingVideo())
		{
			DWORD dwStart = GetTickCount();
			PlayVideo(pFram->Data, pFram->DataLen);
			if(!m_isPlayFrame)
			{
				SpeedCtrl(pFram->Pts - m_nPts, dwStart);
			}
		}
		m_nPts = pFram->Pts;
	}
	else if(pFram->FrameType == FRAME_A)
	{
		if(IsPlayingAudio())
		{
			char* audioBuf = NULL;
			int iAudioLen = 0;
			audioBuf = FS_GetPCMData(m_hDecoder, (char*)pFram->Data, pFram->DataLen, iAudioLen); 

			PlayAudio(audioBuf, iAudioLen);
		}
	}

	return 0;
}
Esempio n. 3
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;		//开总中断
}
Esempio n. 4
0
void main()
{
#if 0
	extern void DebugAdc();
	DebugAdc();
#endif

	//////////////////////////////////////////////////////////////////////////
	//                       局部变量或结构体                               //
	//////////////////////////////////////////////////////////////////////////
	SpeedForline = FreecaleConfig.Config.Motor.Speed.LineSpeed;
	//////////////////////////////////////////////////////////////////////////
	//                       位置提示                                       //
	//////////////////////////////////////////////////////////////////////////
	/************************************************************************/
	/* 开中断                                                               */
	/************************************************************************/

	set_vector_handler(UART0_VECTORn, UartHandler);   // 设置中断服务函数到中断向量表里
	uart_rx_irq_en(UART0);//串口中断
	FLKeyIrqEnable();
	//wdog_init (1000);//初始化看门狗
	//wdog_enable ();
	//////////////////////////////////////////////////////////////////////////
	//                       用户操作                                       //
	//////////////////////////////////////////////////////////////////////////
#if UseEndLine
	switch (FreecaleConfig.Config.CarState)
	{
	case CarStandby:
#endif//UseEndLine
		printf("start");
#if UseAdcNormalizingInit
		AdcNormalizingInit();//初始化归一化变量
#else//UseAdcNormalizingInit
		LCDPrint(0, 0, "Car Ready!");


		AdcInit();
		if (FreecaleConfig.Config.Mode.NrfStartCar == On)
		{
			if (FreecaleConfig.Config.CarThis == MyCar1)
			{
				uint8 exitfunc = false;
				LCDPrint(0, LcdLine2, "Press the");
				LCDPrint(LcdLocal2, LcdLine3, "start!");
				LCDPrint(LcdLocal1, LcdLine4, "Nrf Mode");

				while (!exitfunc)
				{
					switch (KeyScanWithoutIrq())//按键检测
					{
					case FLKeyAdcNorExit:
						LcdCls();
						LCDPrint(LcdLocal1, LcdLine1, "Findind Car2!");
						while (NrfSendStr("$", 1) != Nrf_AllGreen)
						{
							led(LED1, LED_ON);
							DELAY_MS(1);
						};
						led(LED1, LED_OFF);
						exitfunc = TRUE;//退出
						break;

					default:
						break;
					}
				}
			}
			else
			{
				LCDPrint(0, LcdLine2, "Wait Command!");
				uint8 strTemp[10];
				while (true)
				{
					if (NrfRecStrCheck(strTemp, 5) != 0)
					{
						if (strTemp)
						{
							break;
						}
					}

					led(LED1, LED_ON);
					DELAY_MS(1);
				} led(LED1, LED_OFF);
			}
#endif//UseAdcNormalizingInit
		}
		else
		{
			uint8 exitfunc = false;
			LCDPrint(0, LcdLine2, "Press the");
			LCDPrint(LcdLocal2, LcdLine3, "start!");
			LCDPrint(LcdLocal1, LcdLine4, "Manual Mode");

			while (!exitfunc)
			{
				switch (KeyScanWithoutIrq())//按键检测
				{
				case FLKeyAdcNorExit:
					exitfunc = TRUE;//退出
					break;

				default:
					break;
				}
			}
		}
#if UsePowerOnDelay
		DELAY_MS(2000);
#else
		if (FreecaleConfig.Config.CarDelay > 0)
		{
			LcdCls();
			LCDPrint(0, 0, "wait TimeOut!");
			DELAY_MS(FreecaleConfig.Config.CarDelay * 10);
		}
		LcdCls();
#endif//UsePowerOnDelay

		//////////////////////////////////////////////////////////////////////////
		//终点线
#if UseEndLine
		break;

	case CarRunning:
		break;

	case CarFinish:
		LCDPrint(0, 0, "Finish!");
		break;

	default:
		break;
	}
#endif//UseEndLine




	//uint16 spwm = SteerCenterDuty;
	Speed.Expect = SpeedForline;
	enable_irq(PIT_IRQn);								  //使能PIT0中断
	//程序循环
	while (1)
	{
		//////////////////////////////////////////////////////////////////////////
		//舵机控制
		SteerCtrl();

#if 1

#else
		///lcd show

		NumShow16(Speed.Expect, LcdLocal1, LcdLine1);
		NumShow16(Speed.Acturally, LcdLocal1, LcdLine2);

		NumShow3(MotorPid.P, LcdLocal1, LcdLine3);
		NumShow3(MotorPid.I, LcdLocal2, LcdLine3);
		NumShow3(MotorPid.D, LcdLocal3, LcdLine3);

#endif
		if (FreecaleConfig.Config.Mode.Ultrasonic == On)
		{
			NumShow4(CarDistance, LcdLocal1, LcdLine2);
		}
		

		SpeedCtrl();


		//////////////////////////////////////////////////////////////////////////
		//nrf
		if (FreecaleConfig.Config.Mode.NrfSendDistance)
		{
		//NrfErrorType_e nrfErr;
			if (FreecaleConfig.Config.CarThis)
			{
				if (NrfRecStrCheck(NrfBuff, 3))
				{
					if (FreecaleConfig.Config.Mode.NrfSendDistance)
					{
						if (NrfBuff[0] == '$')//超声波识别符
						{
							uint8 i = 0;
							while (NrfBuff[i + 1] != '#')//求字符串长度
							{
								if (NrfBuff[i + 1] == '\0')//error
								{
									goto exitthismainloop;//没辙了,我真不想这么写,实在不能再循环了,变量太多了
									//break;
								}
								i++;
							}

							uint32 dis = 0;
							for (uint8 j = 0; j < i; j++)//求数值
							{
								dis += POW((uint32)(NrfBuff[j + 1] - '0'), i - j);
							}
						}
					}
				}
			}
			else
			{
				if (FreecaleConfig.Config.Mode.NrfSendDistance)
				{
					sprintf(NrfBuff, "$%d#", CarDistance);
					NrfSendStrCheck(NrfBuff, sizeof(NrfBuff) / sizeof(uint8), 3);
				}
			}
		}

		//////////////////////////////////////////////////////////////////////////
	exitthismainloop:
		//延迟,控制周期
		DELAY_MS(20);
	}
	//////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////
	//Don't leave main////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////
}
Esempio n. 5
0
/* ================= main ====================
      desc: 程序入口函数
      pre:  无
      Post: 无       
*/
void main(void) {
    // Local Declarations
    byte laser_history_array[LASER_HISTORY_MAX]; //激光管历史状态数组
  
  	Bool temp_usualRoad_flag = TRUE;      //当前判断是否正常路段标志
  	Bool last_usualRoad_flag = TRUE;      //上次判断是否正常路段标志
  	Bool stopCar_flag = FALSE;            //停车标志
  	Bool breakCar_flag = FALSE;           //刹车标志
  
  	byte startlineFlag_count = 0;         //经过起始线的次数
  	byte laser_hitNum = 1;                //照到黑线的激光管个数
  	byte inside_count = INSIDE_COUNT_MAX; //激光管连续在黑线范围内的次数
  	byte outside_count = 0;               //激光管连续在黑线外的次数
  	byte last_error = 0;                  //直道加速匀速控制的上次误差
  	 
  	LASER_STATUS last_laserStatus = MID7;  //上次激光管状态
  	LASER_STATUS temp_laserStatus = MID7;  //当前激光管状态
  	int last_turnAngle = PWM1_MID;     //上次舵机调整的角度
  	int temp_turnAngle = PWM1_MID;     //当前舵机需要调整的角度	
  	int last_speed = PWM3_FAST0;   //上次速度
  	int temp_speed = PWM3_FAST0;   //当前速度 
  	
  	int i;
    int testcount=0;  //发送激光管信息计数值定义
  	for(i=0;i<LASER_HISTORY_MAX;i++) {
  	    laser_history_array[i] = MID7;
  	}
  	
    // Statements
    DisableInterrupts;
    MCUInit();
  	SmartcarInit();
  	EnableInterrupts;
  
    for(;;) {  
         if(PITINTE_PINTE0 == 0) {    //若PIT0采集中断为关,即道路信息采集完成
              laser_hitNum = 15 - CalculateLaserHitNum(g_temp_laser_array);
              temp_usualRoad_flag =  IsUsualRoad (laser_hitNum); //判断是否为正常道路
              if (temp_usualRoad_flag) {
                  temp_laserStatus = GetLaserStatus(last_laserStatus,g_temp_laser_array,laser_hitNum,&inside_count,&breakCar_flag,laser_history_array,&outside_count); //得到当前激光管状态
                  temp_turnAngle = CalculateAngle(temp_laserStatus); //得到舵机需要调整的转角      
                  temp_speed = CalculateSpeed (temp_turnAngle,stopCar_flag,inside_count,outside_count); //得到需要输出的速度
              } 
              else {
                  if((last_usualRoad_flag == TRUE)&&(laser_hitNum>=8&&laser_hitNum<=11)) {          //一定执行
                      startlineFlag_count = CountStartlineFlag(startlineFlag_count,g_temp_laser_array); //计算小车经过起始线的次数
                      if(startlineFlag_count == 2)  
                            stopCar_flag = TRUE; //若是第二次经过起始线,停车标志置位,即停车
                      StopCar(stopCar_flag);      
                  }
              } /**/
            
              
       testcount++;
              
              if(testcount%50==0){
                
               testcount=1;   
             SendSmartcarInfo(g_temp_laser_array,temp_laserStatus,last_laserStatus,g_temp_pulse);//发送激光管信息
                  } /*   */
              PITINTE_PINTE0 = 1;    //开PIT0采集中断 
        }           
        DerectionCtrl(temp_turnAngle); //调整舵机
        
        if(breakCar_flag == TRUE) {  //若直道入弯,反转减速刹车
            BreakCar(g_temp_pulse, &breakCar_flag);
        }  
        else
            SpeedCtrl(temp_speed,g_temp_pulse,&last_error);         //调整正转速度
         
        last_speed = temp_speed;                        //保存当前速度
        last_laserStatus = temp_laserStatus;            //保存当前激光管状态
        last_turnAngle = temp_turnAngle;                //保存当前舵机转角
        last_usualRoad_flag = temp_usualRoad_flag;      //保存当前是否正常道路的标志 
        
        for(i=LASER_HISTORY_MAX-1;i>0;i--){             //保存激光管历史状态
            laser_history_array[i] =  laser_history_array[i-1];   
        }
        laser_history_array[0] = temp_laserStatus;
    }
} //main