Стабилизация скорости вращения моторчика, нужен совет/помощь

Всем привет. Нужна помощь со стабилизацией скорости моторчика. Имеется магнитофон орель 101, полностью отремонтировал, поставил новую головку и провёл профилактику и настройку всех узлов. Пишет и воспроизводит шикарно. Но детонации составляют около 0,5 процентов. Хотел бы их как то уменьшить. Для этой задачи решил собрать управление на базе ардуины. Управление мотором будет шим сигналом. Считывать скорость будем оптическим датчиком с маховика тон вала. На маховик надену насадку с 3 стойками, которая перекрывает датчик (то есть вызывает прерывание на мк). МК по каждому прерыванию получает пройденное время от стойки до стойки, затем сравнивает текущее время прохождения с заданным (задаётся потенциометром). Написал два варианта изменения скорости. В первом просто прибавляем/убаляем частоту шим на 1 при каждом прерывании, во втором рассчитываем конкретно, на сколько нужно изменить шим. Пока в сам магнитофон не вставлял систему, экспериментировал на моторчике (есть мощный моторчик от старого советского плеера, на него просто приклеил сверху полоску из картона для вращения вокруг датчика). Обороты не быстрые, датчик успевает нормально реагировать. Но вот стабилизация пока не очень. В первом варианте скорость вращения немного плавает, во втором сильно. Может у кого то будут идее по улучшению? Скетч, схему и фото предполагаемой насадки на маховик прилагаю.

// Пины
#define PIN_Tachometer 2 // Пин датчика скорости
#define PIN_SpeedMotor 3 // Пин управления мотором
#define PIN_SpeedController A0 // Пин подстроечного резистора для установки скорости

// Настройки
#define maxTimeRisk 100 // Максимальное время прохожения между рисками
#define minMototPWM 50 // 
#define maxMototPWM 150 // 

// Для ускорение АЦП
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// Переменные
unsigned long timeOld = 0; // Предыдущее время срабатывания прерывания
unsigned long timeRisk = 0; // Время прохождения от риски до риски
unsigned long timeReferenceRisk = 35; // Заданная скорость резистором
uint8_t signalToTheMotor = 100; // Выдаваемый сигнал на управление мотором
bool canUpdateSpeed = false;

void updateTime()
{
  timeRisk = millis() - timeOld; 
  timeOld = millis();
  canUpdateSpeed = true;
}

void setup() 
{
  // set prescale to 16
  sbi(ADCSRA,ADPS2) ;
  cbi(ADCSRA,ADPS1) ;
  cbi(ADCSRA,ADPS0) ;

  TCCR2B = 0b00000001;  // x1
  TCCR2A = 0b00000001;  // fast pwm

  pinMode(PIN_Tachometer, INPUT);
  pinMode(PIN_SpeedMotor, OUTPUT);
  pinMode(PIN_SpeedController, INPUT);

  Serial.begin(115200);

  analogWrite(PIN_SpeedMotor, signalToTheMotor);
  attachInterrupt(digitalPinToInterrupt(PIN_Tachometer), updateTime, FALLING);

  // Убрать
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  digitalWrite(A1, HIGH);
  digitalWrite(A2, LOW);
  digitalWrite(A3, HIGH);
}

void loop() 
{
  timeReferenceRisk = map(analogRead(PIN_SpeedController), 0, 1023, 0, maxTimeRisk);

  if (canUpdateSpeed)
  {
    updateSpeed_v1();
    //updateSpeed_v2();
    canUpdateSpeed = false;

    // Лог
    Serial.print(timeRisk);
    Serial.print(F("/"));
    Serial.println(timeReferenceRisk);
  }
}

void updateSpeed_v1()
{
  if (timeRisk > timeReferenceRisk && signalToTheMotor < maxMototPWM)
    signalToTheMotor++;
  else if (timeRisk < timeReferenceRisk && signalToTheMotor > minMototPWM)
    signalToTheMotor--;

  analogWrite(PIN_SpeedMotor, signalToTheMotor);
}

void updateSpeed_v2()
{
  signalToTheMotor = signalToTheMotor / timeRisk * timeReferenceRisk;

  if (signalToTheMotor < maxMototPWM)
    signalToTheMotor = maxMototPWM;
  else if (signalToTheMotor > minMototPWM)
    signalToTheMotor = minMototPWM;

  analogWrite(PIN_SpeedMotor, signalToTheMotor);
}


Скорее всего на самом лмп магнитофона всё будет постабильнее за счёт маховика, но пока не пробовал на практике.

1 лайк

не будет

Upd. Замени или отшлифуй резиновый прижимной ролик и почисти и смажь подающий узел, но без фанатизма

2 лайка

Почему нет? Маховик же и служит для стабилизации скорости. Детонации же должны быть поменьше.

Это уже всё сделано. Тут дело не в ролике и смазке. Детонации идут от самого моторчика + пассик китайский. Штатная схема собрана на операционном усилителе. Там просто при большей нагрузке возрастает напряжение, подаваемое на моторчик. В катушечниках высшего класса ставили двигатели с обратной связью, где на микросхемой логике был расчёт стабилизации скорости. Вот хотел бы что то подобное сделать в кассетном магнитофоне.

Думаю, что дело по большей степени связанно с этим. Штатная схема просто не знает, с какой точно скоростью вращается движок.

Пассик с маховиком сама по себе эффективный демпфер. А вот электрически убрать детонацию вала мотора это не реальные планы. Нет метода стабилизации скорости вращения у движка с малым количеством полюсов в пределах одного оборота. Шаговый движок с большим количеством шагов на оборот может поможет? Не зря их ставят во всякие критические с точки зрения детонации изделия.

1 лайк

Тоже думал про них. Но есть пару проблем с ними. Настолько быстрые обороты, как у простых моторчиков, на нём вроде не реализовать. А ещё они по габаритам больше, внутри просто физически под них нет места.

смотрим параметры твоего магнитофона:
Коэффициент детонации - ±0,15 %;
Может всё стоковое восстановить?

на практике он коэффициент побольше. Всё таки хочется довести до ума свою систему.

ШИМ это для мотора кувалда, как ты думаешь если по мотору молотить коэффициент детонации уменьшится?

Тут даже никакая ПИД-регулировка не поможет, а уж

тем более.
Эти меры приведут к обратному эффекту.
Ищи и устраняй причину в штатной кибениматики.
В крайнем случае только энкодер на самом моторе.

Детонация ЛПМ - проблема сугубо механическая. Как правило, связана с эксцентриситетом тонвала.
Пытаться решить ее схемотехникой - безыдейно. Нужно либо чинить, либо менять тонвал.

Хи хи :rofl: Объяснишь как на одном обороте мотора можно отрегулировать? Учитывая что момент на валу не постоянный и плавает в зависимости от положения ротора относительно магнитов статора.

А то!:smile:
Инерционность всё таки сгладит. Это раз.
А разве там такой мотор? Я встречал только такие, где никаких дёрганий. Это два.
А что значит на одном обороте?

Испробовал три варианта. В общем, с реализацией пид регулятора детонация на удивление больше, чем с вариантом ±1 шим сигнала. По замерам получил слудующее:
Штатная схема: детонация примерно 0,35%
Мой вариант схемы с ±1: детонация примерно 0,4%
С пид регулятором: 1 с копейками %

Такое ощущение, что всё это микроконтроллерное управление того не стоит.

2 лайка

Какие дёргания? Всё плавно усреднённо инерцией. Вот только под нагрузкой можно заметить. Зажми пальцами ось на грани остановки вращения и почувствуешь как пульсирует жизнь мотора.

А то! Это не волшебная таблетка. Надо уметь настраивать, основываясь на свойствах управляемого объекта.

“Ардуино это просто!”))))
Только Ардуино это маленький бедный слабенький камушек. А вот ракетой ли управлять, данные с Пензы в Тайланд слать ли и как качественно, решает человек)

Я тебе об этом говорил прямо в #3 сообщении

И я в #6.

1 лайк

И я того же мнения. Иа.