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

📄 int_proc.h

📁 本程序为ST公司开发的源代码
💻 H
📖 第 1 页 / 共 5 页
字号:

}
#endm

MACRO init_adjust()
{
#if (1 == OPTIMIZED_INIT)
  /* Nothing to be done, everything is already reset to zero. */
#else
  close = hyst = fe_cmp = fcs_off = ramp_mode = 0;
#endif
}
#endm

/************************************************************************/

MACRO adjust()
{

#if 0
  fraction _dy tempy;     /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
  fraction _dx tempx;     /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
#else
  register fraction tempx at(dx[0]);
  register fraction tempy at(dy[1]);
#endif

  register fraction accu0 at(acc[0]);

  integer i;              /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
  fraction temp1, temp2;  /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */


  i = count16 & 0x03;
  if (i == 0) goto CASE_0;
  if (i == 1) goto CASE_1;
  if (i == 3) goto CASE_3;
  goto END_SWITCH2;
CASE_0:
  /* --------------------------------------- */
  dsp_state = get_clr_ramp_stopped(dsp_state);
  if ((fcrint != 0) || (!(ramp_mode & RAMP_ON)))  /* FD060919 */
  {
    dsp_state = get_set_ramp_stopped(dsp_state);
  }

  if (fcrint == 0)
  {
    if (ramp_mode & RAMP_ON)
    {
      if (ramp_mode & RAMP_UP)
      {
        fcs_off = fcs_off + (fraction) ramp_step;
        if ((int) fcs_off >= (int) ramp_max)
        {
          fcs_off = ramp_max;
          ramp_mode &= RAMP_DOWN;
          if (ramp_mode & SINGLE_RAMP)
          {
            ramp_mode &= RAMP_OFF;
          }
          /* else not needed   ((!(ramp_mode & SINGLE_RAMP)) -> (CONTINUOUS_RAMP)) */
        }
      }
      else   /* ((!(ramp_mode & RAMP_UP) -> (RAMP_DOWN)) */
      {
        fcs_off = fcs_off - (fraction) ramp_step;
        if ((int) fcs_off <= (int) ramp_min)
        {
          fcs_off = ramp_min;
          ramp_mode |= RAMP_UP;
          if (ramp_mode & SINGLE_RAMP)
          {
            ramp_mode &= RAMP_OFF;
          }
          /* else not needed   ((!(ramp_mode & SINGLE_RAMP)) -> (CONTINUOUS_RAMP)) */
        }
      }
    }
    /* else not needed   ((!(ramp_mode & RAMP_ON)) -> (RAMP_OFF)) */
  }
  goto END_SWITCH2;
CASE_1:
  /* --------------------------------------- */

  accu0 = fe_cmp;
  if (ramp_mode & RAMP_UP)
  {
    accu0 -= fedec;
  }
  else
  {
    accu0 += fedec;
  }

  tempy = hyst;
  temp1 = saturate(accu0 + tempy);
  temp2 = saturate(accu0 - tempy);
  if (temp1 < 0)
  {
    close = 1;
  }
  if (temp2 > 0)
  {
    fcrint = (fcrint | (close & fok));
    close = 0;
  }
  goto END_SWITCH2;
CASE_3:
  /* ---- max and min measurement on fe, te, hf ---------------------- */
  if ((adjust_flags & ADJ_FLG_RESET) != 0)
  {
    accu0 = 0x7fff;
    femin = accu0;
    temin = accu0;
    accu0 = 0x8000;
    femax = accu0;
    temax = accu0;
    adjust_flags &= ~ADJ_FLG_RESET;
    adjust_flags |= ADJ_FLG_NOSTAT;
  }
  else
  {
    tempx = temax;
    tempy = tedec;
    accu0 = max(tempx, tempy);
    tempx = temin;
    temax = accu0;
    accu0 = min(tempx, tempy);
    tempx = femax;
    temin = accu0;
    tempy = fedec;
    accu0 = max(tempx, tempy);
    tempx = femin;
    femax = accu0;
    accu0 = min(tempx, tempy);
    femin = accu0;
    adjust_flags &= ~ADJ_FLG_NOSTAT;
  }
END_SWITCH2:
  loop(1);    /* Dummy, will be optimized away. Without this line the compiler complains about an "Expression syntax error". */
}
#endm


MACRO init_misc()
{
#if (1 == OPTIMIZED_INIT)
#else
  oscout = 0;
  vib_gain = 0;
  fok = 0;
  disc_mode = KICK_MODE;
  disc_mode_int = KICK_MODE;            /* MR041215 */
  spindle_kick = 0x0000;
#endif

  clv_ds = 100;
  sw_time = clv_ds;
  counter_def_up = def_tup;
  counter_def_down = def_tdn;


}
#endm

/************************************************************************/

MACRO misc()
{

#if (1 == OPTIMIZED_DEC)
  register fraction pacc at(p);
  register fraction accu0 at(acc[0]);
  register fraction accu1 at(acc[1]);
  register memoryX * ax0 at(ax[0]);
  register memoryY * ay0 at(ay[0]);
  register fraction dx0 at(dx[0]);
  register fraction dx1 at(dx[1]);
  register fraction dy0 at(dy[0]);
  register fraction dy1 at(dy[1]);
  register int dy0_int at(dy[0]);
#else
  register fraction pacc at(p);
  register fraction accu0 at(acc[0]);
  register fraction accu1 at(acc[1]);
  register fraction dx0 at(dx[0]);
#endif

#if 0
  fraction _dy tempy;     /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
  fraction _dx tempx;     /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
#else
  register fraction tempx at(dx[0]);
  register fraction tempy at(dy[1]);
#endif

  fraction * delay;      /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
  memoryY CONST * c;     /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */
  memoryY * agc_ctrl_coeff;
  integer i;             /* TO DO: LOCAL VARIABLE NOT ALLOWED IN INTERRUPT ROUTINE */

  c = coeff_misc;
  delay = delay_misc;


#if (1 == WORKAROUND_SPIKE_BUG)
  dx0 = DEC10;
  dy0 = DEC10;
  if (dx0 != dy0) {      /* Make sure that DEC10 (rate status) not read during the decimation filter update of DEC10. */
    dx0 = DEC10;
  }
#else
  dx0 = DEC10;
#endif

  dsp_state = get_clr_short_jump_stopped(dsp_state);
  if (0 != (dx0 & 0x80))
  {
    dsp_state = get_set_short_jump_stopped(dsp_state);
  }


  i = count16 & 0x03;
  if (i == 0) goto CASE_00;
  if (i == 1) goto CASE_11;
  if (i == 2) goto CASE_22;
  if (i == 3) goto CASE_33;

CASE_00:
  if (gainadj & 0x01)
  {
    if (gainadj & 0x02)
    {
      /* Inject oscillator signal into the tracking loop.      */
      tosc = osc;
      /* Select tracking loop for AGC amplitude measurement,   */
      /* result -> amp1.                                       */
      accu0 = ta2dec * c[0];
    }
    else
    {
      /* Inject oscillator signal into the focus loop.         */
      fosc = osc;
      /* Select focus loop for AGC amplitude measurement,      */
      /* result -> amp1.                                       */
      accu0 = fa2dec * c[0];
    }
    /* Amplitude amp1 is determined in three steps:              */
    /* 1. Filter signal using a notch filter with centre         */
    /*    frequency at controller bandwidth.                     */
    accu1 = accu0 - delay[0] + delay[1] * c[1];
    delay[0] = accu0;
    pacc = c[2] * delay[2];
    accu0 = accu1 + pacc;
    accu0 += pacc;
    delay[1] = delay[2];
    delay[2] = accu0;
    /* 2. Take absolute value of filtered signal.                */
    accu1 = abs(accu0);
    /* 3. Lowpass filter the absolute value.                     */
    accu0 = accu1 * c[3] + amp1 * c[4];
    /* Result: amp1                                              */
    amp1 = accu0;


    /*----------------------------*/
    /* Oscilator that generates a signal wave with the same          */
    /* frequency as the bandwidth of the control loop to be measured.*/
    tempx = oscout;
    tempy = c[6];
    accu1 = round(c[7] * tempx);
    accu1 = tempy - delay[6] + accu1 + accu1 - delay[7];
    delay[6] = tempy;
    oscout = accu1;
    delay[7] = tempx;
    osc = oscout * vib_gain;

  }
  else
  {
    /* No signal injection when AGC procedure is turned off.     */
    tosc = fosc = 0;
    delay[6] = delay[7] = oscout = 0;
  }

  /* downsampling of internal signals */
#if ((1 == OPTIMIZED_DEC) && (1 == HARDWARE_LOOP))

  ax0 = SIGDEC_VAR_ARRAY_ADD;
  ay0 = SIG_ARRAY_ADD;

  dx1 = *ay0++;                 /* sig[0] */
  dy0_int = 0x0002;

  accu0 = dx1 >> dy0_int;       /* sig[0] >> 2 */

  loop(7)
  {
    dx0 = *ax0;                 /* sigdec_var[i] */

    accu0 = accu0 + dx0;        /* sigdec_var[i] + sig[i] >> 2 */
    dx1 = *ay0++;               /* sig[i+1] */

    *ax0++ = accu0;             /* sigdec_var[i] += sig[i] >> 2 */
    accu0 = dx1 >> dy0_int;     /* sig[i+1] >> 2 */
  }
#elif (1 == OPTIMIZED_DEC)
  ax0 = SIGDEC_VAR_ARRAY_ADD;
  ay0 = SIG_ARRAY_ADD;

  dx1 = *ay0++;                 /* sig[0] */
  dy0_int = 0x0002;

  accu0 = dx1 >> dy0_int;       /* sig[0] >> 2 */

  /***** i = 0 *****/
  dx0 = *ax0;                   /* sigdec_var[i] */

  accu0 = accu0 + dx0;          /* sigdec_var[i] + sig[i] >> 2 */
  dx1 = *ay0++;                 /* sig[i+1] */

  *ax0++ = accu0;               /* sigdec_var[i] += sig[i] >> 2 */
  accu0 = dx1 >> dy0_int;       /* sig[i+1] >> 2 */

  /***** i = 1 *****/
  dx0 = *ax0;                   /* sigdec_var[i] */

  accu0 = accu0 + dx0;          /* sigdec_var[i] + sig[i] >> 2 */
  dx1 = *ay0++;                 /* sig[i+1] */

  *ax0++ = accu0;               /* sigdec_var[i] += sig[i] >> 2 */
  accu0 = dx1 >> dy0_int;       /* sig[i+1] >> 2 */

  /***** i = 2 *****/
  dx0 = *ax0;                   /* sigdec_var[i] */

  accu0 = accu0 + dx0;          /* sigdec_var[i] + sig[i] >> 2 */
  dx1 = *ay0++;                 /* sig[i+1] */

  *ax0++ = accu0;               /* sigdec_var[i] += sig[i] >> 2 */
  accu0 = dx1 >> dy0_int;       /* sig[i+1] >> 2 */

  /***** i = 3 *****/
  dx0 = *ax0;                   /* sigdec_var[i] */

  accu0 = accu0 + dx0;          /* sigdec_var[i] + sig[i] >> 2 */
  dx1 = *ay0++;                 /* sig[i+1] */

  *ax0++ = accu0;               /* sigdec_var[i] += sig[i] >> 2 */
  accu0 = dx1 >> dy0_int;       /* sig[i+1] >> 2 */

  /***** i = 4 *****/
  dx0 = *ax0;                   /* sigdec_var[i] */

  accu0 = accu0 + dx0;          /* sigdec_var[i] + sig[i] >> 2 */
  dx1 = *ay0++;                 /* sig[i+1] */

  *ax0++ = accu0;               /* sigdec_var[i] += sig[i] >> 2 */
  accu0 = dx1 >> dy0_int;       /* sig[i+1] >> 2 */

  /***** i = 5 *****/
  dx0 = *ax0;                   /* sigdec_var[i] */

  accu0 = accu0 + dx0;          /* sigdec_var[i] + sig[i] >> 2 */
  dx1 = *ay0++;                 /* sig[i+1] */

  *ax0++ = accu0;               /* sigdec_var[i] += sig[i] >> 2 */

⌨️ 快捷键说明

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