Я использую плату разработки ADM00308 от MicroChip.На плате установлен процессор PIC16F883.Пример кода можно скачать с их сайта.Я использую нано-шаговый двигатель ST4118m0706 с шагом 1,8 градуса.Я рассчитал максимальную скорость шагового двигателя:
с этого сайта
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 об / мин и т. Д. Он не меняет скорости плавно, если вы понимаете мою точку зрения.Поэтому я понимаю, что это запрограммировано в пресетах, которые я тоже пытался изменить.
Прошивки и информацию можно скачать на оригинальном сайте