Синхронизация швейной машинки и конвеера

xam777
Offline
Зарегистрирован: 23.02.2017

Добрый день. Собираю конвеер который подключается с швейной машинке. Чем быстрее швейная машинка шьет тем быстрее должен двигаться конвеер с материалом. Делаем пошив больших кусков материи.

Исходные данные: я считываю квадратурные импульсы с двигателя машинки. Энкодер выдает 720 импульсов на полный оборот двигателя с передвижением материала 4 мм. Минимальная частота выходного сигнала с энкодера 1Кгц Максимальная 15Кгц. Максимальная скорость движения материала 10м в минуту.

На конвеер поставил двигатель с редуктром 24В , 3000 об.мин (200 – 250Вт). Понизил вращение до 45 об в минуту. С помощью ардуины считываю длинну импульсов от датчика энкодера со швейной машинки. На осонвании этих импульсов формирую PWM сигнал, который потом выдаю на драйвер двигателя.

В принципе система рабочая, только проблема в том что движение конвеера трудно синхронизовать со скоростью машинки. При разных скоростях конвеер то отстает то убегает. К примеру удается синхронизировать на первых 20% скокрости уходит остальная часть. Либо наоборот.

На ардуине стал делать выборку по входным сигналам на каждом определенном отрезке применяю отдельную формулу для расчета PWM.

Более менее работает, но чувствую как то коряво все исполнено. Установил энкодер на двигатель конвеера, но что то затык произошел как синхронизировать теперь.

Может быть у кого есть в этом опыт буду рад услышать коментарии. 

xam777
Offline
Зарегистрирован: 23.02.2017
Вот исходный код, довольно простой.
 
int pinRead = 7;        // reading pin of pulse lenth
unsigned long duration; // reading pulse lenths from qudrature encoder
int pwm1;               // pwm duty cycle from 0 to 100
int pwm2;
 
void setup()
{
  Serial.begin(9600);
  pinMode(pinRead, INPUT);
 
  pinMode(9, OUTPUT);           // output of PWM
  pinMode(10, OUTPUT);          // output of PWM
  TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode
  // TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A0) | _BV(COM1B0) ;
  //phase/frequency correct mode. SELECT THIS FOR INVERTED OUTPUTS.
  TCCR1B = _BV(WGM13) | _BV(CS11);
// Select mode 8 and select divide by 8 on main clock.
 
}
void loop()
{
  ICR1 = 100;    // 10kHz mode
  duration = pulseIn(pinRead, HIGH);  // read lenths of pulses usualyy duration from 600ms to 32ms
                                      // than shorte duration than faster moving machine is feeding
  Serial.println(duration);           // print value from pin 7 pulse lenths
  
    if (duration>500 or duration == 0 )    // if reading to long no signal out     
    {
        pwm1 =0;
     }
    if (duration<=500 and duration >=370)
    {
        pwm1 = 90 - duration/5.01;
    }
    if (duration<370 and duration >=100)
    {
        pwm1 = 80 - duration/5.01;
    }
    else
    {
        pwm1 = 70 - duration/10;
    }
 
 
  Serial.print("pwm:");
  Serial.println(pwm1);
 
  OCR1B = int(pwm1);    // output pin 9 pulese
  OCR1A = int(pwm1);    // output pin 10 pulses
 
}
xam777
Offline
Зарегистрирован: 23.02.2017

Решил задачу, установил самопальный энкодер, добавил обратную связь в код, добавил свою развязку на энкодер на тригере шмита. Все работает как часы точность 1мм, время отклика на изменения положения основного вала 200мс.