⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_cmd_alternate.c

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 C
字号:
//
// File Description:
// This file contains an alternate implementation of c_cmd for testing purposes.
// It implements the minimal standard interface for the module, and serves as
//  an example of output module control via C code.
//

void      cCmdInit(void* pHeader)
{
  pHeaders        = pHeader;

  IOMapCmd.Awake = TRUE;

  dTimerInit();
  IOMapCmd.Tick = dTimerRead();

  return;
}

//Test: Start at speed 100 when enter is pressed; then progressively ramp down every half second until -100.
void      cCmdCtrl(void)
{
  static UBYTE State = 0;
  static ULONG MyTick = 0;

  if (pMapButton->State[BTN1] & PRESSED_EV)
  {
    pMapButton->State[BTN1] &= ~PRESSED_EV;

    //Coast both motors
    pMapOutPut->Outputs[0].Mode = MOTORON;
    pMapOutPut->Outputs[1].Mode = MOTORON;

    pMapOutPut->Outputs[0].Speed = 0;
    pMapOutPut->Outputs[0].TachoLimit = 0;
    pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_IDLE;
    pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_IDLE;

    pMapOutPut->Outputs[1].Speed = 0;
    pMapOutPut->Outputs[1].TachoLimit = 0;
    pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_IDLE;
    pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_IDLE;

    pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED;
    pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED;

    //Drop out of ongoing state machine
    State = 255;
  }

  switch(State)
  {
    case 0:
    {
      //Initialize
      pMapOutPut->Outputs[0].Flags = UPDATE_RESET_COUNT;
      pMapOutPut->Outputs[1].Flags = UPDATE_RESET_COUNT;
      pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_IDLE;
      pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_IDLE;

      State++;
    }
    break;

    case 1:
    {
      //Kick off further states only if Enter button is pressed
      if ((pMapButton->State[BTN4] & PRESSED_EV))
      {
        //Clear pressed event so UI doesn't re-use it.
        pMapButton->State[BTN4] &= ~PRESSED_EV;

        pMapOutPut->Outputs[0].Mode = MOTORON | BRAKE | REGULATED;
        pMapOutPut->Outputs[1].Mode = MOTORON | BRAKE | REGULATED;

        pMapOutPut->Outputs[0].Speed = 50;
        pMapOutPut->Outputs[0].TachoLimit = 1152;
        pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_RUNNING;
        pMapOutPut->Outputs[0].SyncTurnParameter = 25;
        //pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SPEED;
        pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SYNC;

        pMapOutPut->Outputs[1].Speed = 50;
        pMapOutPut->Outputs[1].TachoLimit = 1152;
        pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_RUNNING;
        //pMapOutPut->Outputs[1].SyncTurnParameter = -7;
        //pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SPEED;
        pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SYNC;

        pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;
        pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;

        State++;
      }
    }
    break;

    case 2:
    {
      if (pMapOutPut->Outputs[0].RunState == MOTOR_RUN_STATE_IDLE)
      {
        pMapOutPut->Outputs[0].Mode = MOTORON;
        pMapOutPut->Outputs[1].Mode = MOTORON;

        pMapOutPut->Outputs[0].Speed = 0;
        pMapOutPut->Outputs[0].TachoLimit = 0;
        pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_IDLE;
        pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_IDLE;

        pMapOutPut->Outputs[1].Speed = 0;
        pMapOutPut->Outputs[1].TachoLimit = 0;
        pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_IDLE;
        pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_IDLE;

        pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED;
        pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED;
        State++;
      }
    }
    break;

    case 3:
    {
        pMapOutPut->Outputs[0].Mode = MOTORON | BRAKE | REGULATED;
        pMapOutPut->Outputs[1].Mode = MOTORON | BRAKE | REGULATED;

        pMapOutPut->Outputs[0].Speed = 50;
        pMapOutPut->Outputs[0].TachoLimit = 1152;
        pMapOutPut->Outputs[0].RunState = MOTOR_RUN_STATE_RUNNING;
        //pMapOutPut->Outputs[0].SyncTurnParameter = 5;
        //pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SPEED;
        pMapOutPut->Outputs[0].RegMode = REGULATION_MODE_MOTOR_SYNC;

        pMapOutPut->Outputs[1].Speed = 50;
        pMapOutPut->Outputs[1].TachoLimit = 1152;
        pMapOutPut->Outputs[1].RunState = MOTOR_RUN_STATE_RUNNING;
        //pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SPEED;
        pMapOutPut->Outputs[1].RegMode = REGULATION_MODE_MOTOR_SYNC;

        pMapOutPut->Outputs[0].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;
        pMapOutPut->Outputs[1].Flags = UPDATE_MODE | UPDATE_SPEED | UPDATE_TACHO_LIMIT;

        State = 2;
    }
    break;

    default:
      break;
  };

  //Busy loop to ensure return on 1ms boundary
  BUSY_WAIT_NEXT_MS;

  IOMapCmd.Tick = dTimerRead();
  MyTick++;

  return;
}

void      cCmdExit(void)
{
  return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -