/* ================= 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
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; }
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 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//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// }
/* ================= 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