ADM00308 / MTS2916A Контроль скорости - PullRequest
0 голосов
/ 22 мая 2018

Я использую плату разработки ADM00308 от MicroChip.На плате установлен процессор PIC16F883.Пример кода можно скачать с их сайта.Я использую нано-шаговый двигатель ST4118m0706 с шагом 1,8 градуса.Я рассчитал максимальную скорость шагового двигателя:

enter image description here

с этого сайта

RPMmax =24 В / (2 0,032 мГц ⋅ 0,5 А) = 3,75 н / с (3,75 ⋅ 60 = 225 об / мин)

Минимальное время на шаг = (2 0,032 м ч ⋅ 0,5) / 24 В= 0,00133 секунды.

Таким образом, теоретически шаговый двигатель должен выдерживать 225 об / мин без колебаний.Теперь программное обеспечение.

Пример кода обеспечивает переменную скорость примерно до 45 об / мин.Это слишком медленно, так как моя цель - 130 об / мин.Вот оригинальный код:

Ширина импульса, Макс. Скорость и сканирование

// Prescale: Must change both values together - PRESCALE Divisor and BIT MASK */
// 1 = 0b00000000, 2 = 0b00010000, 4 = 0b00100000, 8 = 0b00110000
//#define REF_PWM_PRESCALE 8
//#define REF_PWM_PRESCALE_MASK 0b00110000
// The Rollover Count is the period of the timer.
// The timer period = 0 - Rollover Count.
//#define REF_PWM_PERIOD =  ((float) ((1.0 / (((float)_XTAL_FREQ) / 4.0)) * (REF_PWM_PRESCALE * REF_RWM_ROLLOVER_COUNT)))
//#define REF_FREQ ((float) (1.0 / REF_PERIOD) )
// Set minimum speed by (65535 - MAX_SPEED_COUNT) * usec per bit
// 12 msec =
#define MIN_MOTOR_PULSEWIDTH (0.015)
#define MAX_SPEED_COUNT  ((unsigned int) (65535.0 - ((float) ((MIN_MOTOR_PULSEWIDTH / (1.0 / (((float)_XTAL_FREQ) / 4.0))) /  (ROTATION_PRESCALE * 2)))))
#define SPEED_INPUT_SPAN ((unsigned int) 900)
#define SPEED_INPUT_COUNTS_PER_BIT ((unsigned int) (MAX_SPEED_COUNT / SPEED_INPUT_SPAN))

#define ROTATION_ROLLOVER_COUNT (MAX_SPEED_COUNT + 100)
#define ROTATION_PRESCALE 8
#define ROTATION_PRESCALE_MASK 0b00110000
#define ROTATION_PERIOD =  ((float) ((1.0 / (((float)_XTAL_FREQ) / 4.0)) * (ROTATION_PRESCALE * ROTATION_ROLLOVER_COUNT)))
#define ROTATION_FREQ ((float) (1.0 / ROTATION_PERIOD) )

SpeedUpdate

FaultTypeEnum SpeedUpdate(void)
{
  FaultTypeEnum Fault;
  unsigned int Speed;

  Fault = NO_FAULT;
  if (SpeedInput < 65)
  {
    /* open/shorted(GND) speed input */
    Speed = 0;
    Fault = SPEED_INPUT_LOW;
  }
  else if (SpeedInput < 100)
  {
    Speed = 0;
    Fault = NO_FAULT;
  }
  else if (SpeedInput > 950)
  {
    Speed = 0;
    Fault = SPEED_INPUT_HIGH;
  }
  else if (SpeedInput > 900)
  {
    /* open/shorted(VDD) speed input */
    Speed = MAX_SPEED_COUNT;
    Fault = NO_FAULT;
  }
  else
  {
    Speed = (SpeedInput - 100) * SPEED_INPUT_COUNTS_PER_BIT;
    Fault = NO_FAULT;
  }

  RotationTimerRolloverCount = MAX_SPEED_COUNT - Speed;

  /* setup the next timer reload value */
  T1CON = 0b00000000; /* Temporarily pause the PWM timer */
    /* use variables to reload timer faster in interrupt routine */
  RotationTimerReloadHi =  (unsigned )(RotationTimerRolloverCount >> 8);
  RotationTimerReloadLo = (unsigned short) RotationTimerRolloverCount;
  T1CON = 0b00000001 | ROTATION_PRESCALE_MASK; // Re-enable PWM timer, set prescale

  return Fault;
}

Таймер

 /* Rotation Timer.  Must be fast. */
  if (PIR1bits.TMR1IF)
  {
    PIR1bits.TMR1IF = 0;
    TMR1H = RotationTimerReloadHi;
    TMR1L = RotationTimerReloadLo;

    /* Calculate next stepper rotation state */
    /* HOLD switch sets min_rotation_state = max_rotation_state */
    /* SINGLE STEP switch sets min_rotation_state = max_rotation_state */
    if (System.Bits.Stop)
    {
      /* no current output */
      RotationData.All = ROTATION_STOP;
    }
    else
    {
      /* update stepper driver with last calculated data */
      PORTB = ((PORTB & 0b11000000) | RotationData.All);

Мне удалосьчтобы изменить скорость до 146 об / мин, изменив:

#define MIN_MOTOR_PULSEWIDTH (0.015)

на для проверки

#define MIN_MOTOR_PULSEWIDTH (0.006)

Шаговый двигатель вращается со скоростью 98 об / мин с полностью повернутым потенциалом влево.Снижение значения до 0,004 приведет к скорости 146 об / мин с хорошим крутящим моментом на источнике питания 24 В (крутящий момент будет ухудшаться на источнике питания 12 В).Понижение значения еще больше приведет к колебанию двигателя (двигатель слышен, но он больше не вращается).Что странно, поскольку максимальные обороты должны составлять 225 об / мин.Однако главная проблема в том, что я не могу достичь скорости вращения 130. Изменение значения на 0,005, 0,0045 и т. Д. Не увеличивает скорость более чем на 98 до 0,004.Также кажется, что у потенциометра есть какие-то предустановки.Поворачивая потенциометр, он изменяется с 146 об / мин до 98 об / мин, до 73 об / мин и т. Д. Он не меняет скорости плавно, если вы понимаете мою точку зрения.Поэтому я понимаю, что это запрограммировано в пресетах, которые я тоже пытался изменить.

Прошивки и информацию можно скачать на оригинальном сайте

...