Регулятор оборотов двигателя с обратной связью

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Zeyzey пишет:

Ладно попробую начать сам .Я так понимаю что основная проблемма это отсутствие у меги вывода модуля захата ICP1, остальные пины вроде как соответствуют пинам ардуины мини. Как можно реализовать эту функцию в меге??? Хочу сказать сразу что в програмировании я не сильно силен, но стремление огромное)

Обратитесь напрямую к dimax   Это он посоветовал использовать данный способ расчёта. Он должен знать.

Zeyzey
Offline
Зарегистрирован: 04.04.2017

К сожелению не могу найти как отправить личное сообщение(

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Zeyzey пишет:

К сожелению не могу найти как отправить личное сообщение(


здесь нет лички, пишите прямо здесь

Zeyzey
Offline
Зарегистрирован: 04.04.2017

В общем после продолжительного гугла понял что у меги есть ICP только на 4-м тайтере.Попробую изменить

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Zeyzey, судя по схеме и с пятого тоже выведен. 

Zeyzey
Offline
Зарегистрирован: 04.04.2017

Вот нашел https://docs.google.com/spreadsheets/d/16MIFE4ITEisEDUBh3H4A7WZga1Sm1Pm-igS3r0A58L8/pub?gid=0#

Только здесь приводится разница с UNO. Так вот там есть строка Functions not available on Mega.

Трудность думаю вся в переделке єтого кода заключается в нескольких участках кода.

 pinMode(AC_LOAD, OUTPUT);        // назначаем выходом
040
  attachInterrupt(0, zero_crosss_int, RISING);  // прерывание по пину 2

А также здесь

 pinMode (8, INPUT); // вход сигнала ICP( №8 only для atmega328)
  //настройка 16 бит таймера-счётчика 1
  TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
  TIMSK1 = (1 << ICIE1) | (1 << TOIE1); //создавать прерывание от сигнала на пине ICP1
  TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS10); //div 1


}
 

ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1

  tic = ((uint32_t)int_tic << 16) | ICR1 ; //подсчёт тиков

  ICR1 = 0; int_tic = 0; TCNT1 = 0;

  sp = sp + 1 ; // для подсчёта оборотов в минуту.

  holl = holl + 1;

}   // после каждого срабатывания датчика холл+1

 

 

ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint

  int_tic++; //считать переполнения через 65536 тактов

  if (int_tic > t) {

    tic = 0;  //если на входе пусто более минимального времени то обнулить счётчики

    int_tic = 0;

  }

  if (int_tic > 500) {

    dimming = 130; // если стоим 2 секунды, то сбрасываем напряжение.

  }

}

 

// the interrupt function must take no parameters and return nothing

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light

{

  time = micros();

 

}

 

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

nevkon, да, 12 тыщ в минуту и в секунду совсем разные величины, я тоже не обратил на это внимание.  Получается 12000/60 =200 оборотов в секунду, и *12 = 2400Гц  Значит можно другой скетч использовать, т.к. для частот до 1-2 кГц есть ещё способ с  быстрым измерением (время измерения от начала первого импульса до начала второго). И там не нужно 2 таймера. Достаточного одного.

volatile unsigned int int_tic;
volatile unsigned long tic;
void setup(){
Serial.begin(9600);
pinMode (8,INPUT); // вход сигнала ICP( №8 only для atmega328)
//настройка 16 бит таймера-счётчика 1 
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
}

ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
tic= ((uint32_t)int_tic<<16)|TCNT1 ; //подсчёт тиков
ICR1=0; int_tic=0; TCNT1=0;  }

ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
int_tic++; //считать переполнения через 65536 тактов
if (int_tic > (F_CPU/65536)) {tic=0; int_tic=0;} //если на входе пусто более секунды
}                                                 //то обнулить счётчики
  
void loop(){
Serial.println((float)F_CPU/tic);
}

Здесь переменная tic -это количество тактов процессора, совершённых за 1 период входного сигнала.  Если tic * (1/F_CPU) то будет время периода в секундах. Если F_CPU/tic -будет частота в герцах.

dimax,  использую ваш совет и всё работает почти отлично. сигнал хороший на всём диапозоне. Но есть одно НО.   В одном месте, примерно на 1200 об\мин. происходит "провал".Датчик у меня выдаёт 12 импульсов на 1 оборот. 

На ютубе в комментариях сказали что "таймер был рядом с предельным значением (65535)" и посоветовали: "Попробуйте просто заменить TCNT1 на ICR1"

После замены ситуация улучшилась, но до конца не пропала. Провалы продолжаются. С разными импульсами на 1 оборот на разных оборотах. Например на 8 импульсов  на 1800, 6 импульсов на 2400, 18импульсов 800оборотов.   Тоесть всё привязано ко времени между импульсами.  

Как с этим можно бороться?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед  и после глюка.(когда нормально просчиталось).?  Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед  и после глюка.(когда нормально просчиталось).?  Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?

tic - точно сказать сейчас не готов. чтото около 66666  Подумаю, как можно это определить.

Насчёт помех, я сомневаюсь. так как подобное происходит на разных станках, с разными ардуинками, с разными двигателями в разных концах разных стран. Единственное что это всё объединяет один скетч и одинаковый tic во время сбоя.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch, кстати про то, что бы поменять TCNT1 на ICR1 -это правильно, а то TCNT1 счёлкает и после входа в перерывание, и может случиться переполнение в ненужный момент.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

sany_sch, кстати про то, что бы поменять TCNT1 на ICR1 -это правильно, а то TCNT1 счёлкает и после входа в перерывание, и может случиться переполнение в ненужный момент.

Спасибо. Скажите, dimax, у меня ещё в скетче, отслеживается переход сети через 0, для регулировки симистора таким образом:

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  time = micros();

}

прерывание на D2.    А затем открытие симистора происходит так:

int dimtime = (75 * dimming);               // For 60Hz =>65
  tims = micros();                            // считываем время, прошедшее с момента запуска программы
  if (tims >= (time + dimtime)) {             //если время больше или равно времени срабатывания нуля + время задержки

    digitalWrite(AC_LOAD, HIGH);              // открываем симистор
    delayMicroseconds(10);                   // задержка 10 микросекунд (для 60Hz = 8.33)
    digitalWrite(AC_LOAD, LOW);              // выключаем сигнал на симистор.
  }

Теперь даже не знаю как правильно сформулировать вопрос.

Не может оказаться так, что в тот момент когда частота счётчика оборотов приближается к tic=65535, то сбой происходит не именно в подсчёте оборотов, а в отслеживании 0 или в открытии симистора. Это даже скорее будет давать подобные "провалы" и рывки.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch, не вижу взаимосвязи tic и приведёненого фрагмента. Глючить может всё что угодно, для начала нужно всё убрать кроме изначального измерителя длины импульса. Выводить tic , будет ли глюк? Какое значение tic будет во время глюка? У моего скетча есть одно слабое место - случай, если прерывание ICP и OVF сработают одновременно, тогда первым выполнится ICP и выдаст значение tic на 65535 меньше чем нужно. Вероятность что всё это произойдёт крайне низка. Поэтому я и спрашиваю точное значение tic, если младшие два байта "глючного" значения будут пустые -значит есть вероятность, что не успел прибавиться счётчик переполнения OVF, и нужно будет в прерывании ICP проверять флаг TOV1, и менять дальнейший алгоритм. Если не пустые -то проблема к таймерам и их прерываниям точно не имеет отношения.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

sany_sch, не вижу взаимосвязи tic и приведёненого фрагмента. Глючить может всё что угодно, для начала нужно всё убрать кроме изначального измерителя длины импульса. Выводить tic , будет ли глюк? Какое значение tic будет во время глюка? У моего скетча есть одно слабое место - случай, если прерывание ICP и OVF сработают одновременно, тогда первым выполнится ICP и выдаст значение tic на 65535 меньше чем нужно. Вероятность что всё это произойдёт крайне низка. Поэтому я и спрашиваю точное значение tic, если младшие два байта "глючного" значения будут пустые -значит есть вероятность, что не успел прибавиться счётчик переполнения OVF, и нужно будет в прерывании ICP проверять флаг TOV1, и менять дальнейший алгоритм. Если не пустые -то проблема к таймерам и их прерываниям точно не имеет отношения.

Вывел значения ТИК на график. Посмотрите, если не сложно. 1,5 минуты.  Как узнать в цифрах не знаю. Не подскажете?

В видео говорю "тик уменьшается." имел в виду увеличивается.  

https://youtu.be/YMcAFNU2Uts

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

sany_sch, мне импульсы на оборот ни о чём не говорят. Какое значение tic в момент глюка, и какое значение бывает перед  и после глюка.(когда нормально просчиталось).?  Подозреваю, что это помехи, наводимые на МК, не рассматривали такой вариант?

Вот, нашел, может так понятней. Хоть цифры видно.  Тик увеличивается вдвое. На некоторые симистор не успевает отреагировать, а некоторые "отрабатывает" и получается резкий уход графика вниз. Посмотрите, сбой почти всегда начинается с чуть больше 65000  и уходит вверх. Т иолько один раз в другом месте и вниз. Но это похоже на случайность.

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

volatile uint16_t  int_tic;
volatile uint32_t  tic;
void setup(){
Serial.begin(9600);
pinMode (8,INPUT_PULLUP); // вход сигнала ICP( №8 only для atmega328)
//настройка 16 бит таймера-счётчика 1 
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
}

ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
TCNT1=0;
if (TIFR1&(1<<TOV1)){ TIFR1|=1<<TOV1; if (ICR1<100) { int_tic++;} } 
 tic= ((uint32_t)int_tic<<16)| ICR1 ;  //подсчёт тиков
  int_tic=0;
}

ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
int_tic++; //считать переполнения через 65536 тактов
 if (int_tic > 244) //если на входе пусто более секунды
     {tic=0; int_tic=0;}  //то обнулить счётчики  
     }                                                
void loop(){
Serial.println(tic);

}

 

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

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

volatile uint16_t  int_tic;
volatile uint32_t  tic;
void setup(){
Serial.begin(9600);
pinMode (8,INPUT_PULLUP); // вход сигнала ICP( №8 only для atmega328)
//настройка 16 бит таймера-счётчика 1 
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
}

ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
TCNT1=0;
if (TIFR1&(1<<TOV1)){ TIFR1|=1<<TOV1; if (ICR1<100) { int_tic++;} } 
 tic= ((uint32_t)int_tic<<16)| ICR1 ;  //подсчёт тиков
  int_tic=0;
}

ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
int_tic++; //считать переполнения через 65536 тактов
 if (int_tic > 244) //если на входе пусто более секунды
     {tic=0; int_tic=0;}  //то обнулить счётчики  
     }                                                
void loop(){
Serial.println(tic);

}

 

Спасибо, помогло!!!

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

Доброго дня, уважаемые форумчане, кто сталкивался с двигателями SIEMENS от СМА ?  Опознать по надписям на торце движка - сложно

По словам продавца -  движок коллекторный+асинхронный, стоял на машине 6 кг  отжим 800 об.

Отключил разъёмы от щёток, прозвонил - получилось так:

Подозрение вызывает 4 и 5 контакты - звонятся накоротко - может термопредохранитель? но в инете есть похожий движок - 

у него 4 и 5 - обмотка >> http://monitor.espec.ws/section44/topic197135.html

Непонятно как-то...

 

 

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

Подключил к сети через утюг - 5 и 2 - крутит оборотов 300 - останавливается рукой. 5 и 3 тоже самое.

Что-то я упускаю.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Aleks_neofit пишет:

Доброго дня, уважаемые форумчане, кто сталкивался с двигателями SIEMENS от СМА ?  Опознать по надписям на торце движка - сложно

 

По словам продавца -  движок коллекторный+асинхронный, стоял на машине 6 кг  отжим 800 об.

Отключил разъёмы от щёток, прозвонил - получилось так:

 

Подозрение вызывает 4 и 5 контакты - звонятся накоротко - может термопредохранитель? но в инете есть похожий движок - 

у него 4 и 5 - обмотка >> http://monitor.espec.ws/section44/topic197135.html

 

Непонятно как-то...

 

 

 

 

А у вас нету фото вашего статора без якоря? Что-то мне подсказывает, что это не обычные полюсные катушки...

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

В разобраном виде

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Aleks_neofit пишет:

 

В разобраном виде

 

встречал в сети такие движки, но в руках не держал. Это не обычный движок. а как бы 2 в одном. Но вот как его подключить я не знаю. По моему где то на чипмейкере такие обсуждались.

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

Спасибо, Александр за участие - пробую на чипмейкере.

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

Нашёл, что я упускаю:

Сопротивление между контактами

1-3  4,5Ом

1-2  4,5Ом

2-3  4Ом - (вместо предпологаемых 9 Ом) - значит ещё одна обмотка 

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

Приделал костыль, попробуйте:

Снова обращаюсь к вам за помощю.

Регулятор доведён до конца и есть уже в двух вариантах. Но и всё же меня не до конца устраивает.

Постараюсь пояснить. На пине Д2 идёт прерывание - отслеживаем переход сети через ноль. В момент перехода выполняется команда "time = micros();" и всё.   А далее в основном цыкле мы просто проверяем пора или не пора открывать симистор "if(tims >= (time + dimtime))"

И всё происходит хорошо в регуляторе без экрана. Но у нас есть экран и мы выводим на него информацию 2 раза в секунду. И в это время происходят какие то задержки и симистор открывается не правильно.

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

#include <LiquidCrystal.h>      // библиотека экрана

LiquidCrystal lcd(3,4,5,9,10,11);   // пины экрана

float kImp = 120;          //ввести кол-во импульсов на 10 оборотов

int AC_LOAD = 17;    // пин управления симистором
volatile int dimming = 120;  // время задержки от нуля   7 = максимально, 120 = минимально

volatile unsigned long time; // время в микросекундах срабатывания датчика нуля
unsigned long tims;           // переменная показаний времени
       
unsigned long currentTime;     //временные переменные для таймера экрана
unsigned long loopTime;



volatile int holl = 0;    //переменная  срабатываня датчика 

volatile int sp = 0;           //переменная суммы срабатываний датчика 

volatile unsigned int int_tic;    //переменные для подсчёта времени между импульсами.
volatile unsigned long tic;
volatile int t = 0;               //минимальное время импульсов +1
int r1 = 18;//  Реле  на А1
int r2 = 19;//   реле  на А2 


void setup()
{
 pinMode(r1, OUTPUT);// Назначаем выходом
  pinMode(r2, OUTPUT);//назначаем выходом
  digitalWrite(r1, LOW);// Оставляем невключеным
  digitalWrite(r2, LOW);//оставляем невключенным

  
  pinMode(AC_LOAD, OUTPUT);        // назначаем выходом
  attachInterrupt(0, zero_crosss_int, RISING);  // прерывание по пину 2
   
  lcd.begin(16, 2);          //дисплей 16символов 2строчки
  lcd.setCursor(0,0);

lcd.write("Si:");  //в верхней строке выводим время задержки

lcd.setCursor(0,1);  

lcd.write("Re:");  // В нижней выводим показания датчика

lcd.setCursor(9,1);  

lcd.write("S:");  // В нижней выводим фактичесские обороты

pinMode (8,INPUT); // вход сигнала ICP( №8 only для atmega328)
//настройка 16 бит таймера-счётчика 1 
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
}

ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
tic= ((uint32_t)int_tic<<16)|TCNT1 ; //подсчёт тиков
ICR1=0; int_tic=0; TCNT1=0;
sp = sp +1 ;  // для подсчёта оборотов в минуту.
holl =holl+ 1;}   // после каждого срабатывания датчика холл+1

ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
int_tic++; //считать переполнения через 65536 тактов
if (int_tic > t) {tic=0; int_tic=0;} //если на входе пусто более минимального времени то обнулить счётчики
if (int_tic > 500) {dimming =130;}    // если стоим 2 секунды, то сбрасываем напряжение.
}                                                 

// the interrupt function must take no parameters and return nothing
void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  time = micros();
  
}

void loop()  {

  
 int val = analogRead(A0);

if (val > 0){                  //   если регулятор больше 0 
 digitalWrite(r1, HIGH); 
 dimming =map(val, 0, 1023, 120, 7); 
} 
    else {
       dimming =120;      //Если регулятор на 0 то время задержки 120
       digitalWrite(r1,LOW );
      }
     
    dimming = constrain(dimming,7,120) ; //  Следим чтоб время задержки было не меньше 7 и не больше 130
    int dimtime = (75*dimming);    // For 60Hz =>65    
    tims = micros();                           // считываем время, прошедшее с момента запуска программы
  if(tims >= (time + dimtime)){       //если время больше или равно времени срабатывания нуля + время задержки
  
  digitalWrite(AC_LOAD, HIGH);   // открываем симистор
  delayMicroseconds(10);         // задержка 10 микросекунд (для 60Hz = 8.33)
  digitalWrite(AC_LOAD, LOW);    // выключаем сигнал на симистор.
  }
  else {}

  
    
    
      // Для вывода значений на дисплей 2 раз в секунду
      
   currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
  if(currentTime >= (loopTime + 500)){              // сравниваем текущий таймер с переменной loopTime + 0,5 секунд
    
        // выводим показания датчика
    
    lcd.setCursor(3,0);
    lcd.print(dimming);
    lcd.print("  ");     // выводим время задержки на экран.

    lcd.setCursor(3,1);
    lcd.print(val);
    lcd.print("  "); 

     
     lcd.setCursor(11,1);
    
lcd.print (int (sp*(1200/kImp)));     // выводим средние обороты на экран.
lcd.print("       "); 
sp = 0;

    loopTime = currentTime;                         // в loopTime записываем новое значение
  }
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Возможно этот пример вам поможет:

#include <CyberLib.h>

void setup()
{
  Serial.begin (115200);
  D13_Out;
  StartTimer1(Led_Blink, 1000000);        // раз в секунду
}

void Led_Blink()
{
  D13_Inv;
  Serial.println ( millis() / 1000);
}

void loop()  {

  Serial.println ( "    delay start");
  delay (10000);                             //  10 секунд
  Serial.println ( "    delay end");
 

}

 

Гриша
Offline
Зарегистрирован: 27.04.2014

sany_sch пишет:

И всё происходит хорошо в регуляторе без экрана. Но у нас есть экран и мы выводим на него информацию 2 раза в секунду. И в это время происходят какие то задержки и симистор открывается не правильно.

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

Скоро буду собирать подобное устройство, уже вагончик прочитал - все слабовато. В общем для себя решил использовать 2 контроллера. Один рулит, другой управляет и показывает. Даром, что устройство не серийное и ценник не сверх меры. Пока обдумываю вариант с быстрым обменом данных 2 или 4 байта. Поделиться нечем, кроме как идеей.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

trembo пишет:

Возможно этот пример вам поможет:

Спасибо, попробую.

UFO 007
UFO 007 аватар
Offline
Зарегистрирован: 11.01.2018

nevkon пишет:

зы. Прошу не писать про покупку готового регулятора - это не спортивно и не интересно получить сразу железку которая будет работать при первом же включении.

Очень даже согласен и более чем солидарен: не важен результат - важен сам процесс. Хотя если логически умозаключить, то - основной физической силой, движущей весь процесс, как раз и является сам результат.

Sergey198
Offline
Зарегистрирован: 08.01.2021

Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы . Я по входу ICP измеряю длинну импульса от HIGH  до LOW. Потом в прерывании по зеро заряжаю таймер для открытия симистора , под нагрузкой работает нормально , без , плавает .

rkit
Offline
Зарегистрирован: 23.11.2016

Sergey198 пишет:

Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы . Я по входу ICP измеряю длинну импульса от HIGH  до LOW. Потом в прерывании по зеро заряжаю таймер для открытия симистора , под нагрузкой работает нормально , без , плавает .

А где обратная связь?

Sergey198
Offline
Зарегистрирован: 08.01.2021

Использую мегу16 , отладка JTAGICE в студии . Сигнал от тахо идет на ICP(PD6) , ZERO на INT0(PD2) , выход на симистор PB3 . В прерывании захвата измеряю длинну импульса , в прерывании по зеро заряжаю таймер 0 на открытие симистора , все числа 8 бит .

Sergey198
Offline
Зарегистрирован: 08.01.2021

Расчет времени открытия симистора я так понимаю можно делать хоть в main , хоть в обработчиках ZERO или ICP .

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Sergey198 пишет:

Всем привет , тема еще живая ? Тоже долбаюсь с регулятором для мотора от стиралки на семисторе . Прочитал всю тему , нет ни где алгоритма работы ..

А чем не устраивает готовый, рабочий вариант?

https://www.youtube.com/watch?v=TEBklpEF-HA&t=635s

Sergey198
Offline
Зарегистрирован: 08.01.2021

Как готовое устройство мне не интересно , я бы купил его да и все . Просто хочу разобраться с пид регулированием , нахождение ошибки и тд. , интересен сам алгоритм , последовательность так сказать . Сама формула и какие измерения времени в нее вставлять , и регулятор не понятно то ли ПИД то ли просто ПД . Разобравшись с этим можно применять к другим моторам , инверторным например , их от стиралок тоже много , он и компактней и тише и мощнее .

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

Кто-нибудь сможет внести ясность? Если управлять коллекторным двигателем со щетками от стиральной машины, при выпрямлении тока после диодного нужно ставить высоковольтный электролит или нет? И на что повлияет его установка, кроме как повышения действующего значения напряжения?

DIVGENY
Offline
Зарегистрирован: 23.08.2016

Vlad1m1r пишет:
Кто-нибудь сможет внести ясность?
Это смотря как управлять..

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

Шим сигналом через полевик

Sergey198
Offline
Зарегистрирован: 08.01.2021

Зачем полевик и конденсатор , можно просто одним симистором .

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

Зачем вообще писать не по существу

Sergey198
Offline
Зарегистрирован: 08.01.2021

Просто я не видел в платах от стиральных машин полевика и конденсатора .

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

Это же не означает, что таких схем управления не существует

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Vlad1m1r пишет:
Кто-нибудь сможет внести ясность? Если управлять коллекторным двигателем со щетками от стиральной машины, при выпрямлении тока после диодного нужно ставить высоковольтный электролит или нет? И на что повлияет его установка, кроме как повышения действующего значения напряжения?

Тебе нужно официально разрешение его не ставить, потому, что тебе лень его заказать, а дома нет? ;))

Сорян, у меня печать в стирке, официального разрешения дать не могу. Но на словах - разрешаю, если ШИМ у тебя выше 500Гц. (вот тока не надо спрашивать: "поче-мууу?" Ответ: "поче-кря".)

(Ппц, какие остроумные вопросы пошли! Я ху..ю, без баяна!)

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

Конденсатор то есть. И заказывать не нужно даже. А вот поче-муууу ставить или не ставить очень интересно.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

а какие параметры конденсатора, который у тебя в наличии..?

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

450V 470uF

DIVGENY
Offline
Зарегистрирован: 23.08.2016

он будет эффективен при нагрузке до 300 Ватт. на обмотку двигателя будет будет поступать действующее напряжение около 300 В. Мосфет нужен вольт на 800. и это только теория, на практике все это может недолго проработать...

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

На обмотке действующее напряжение 60-70 вольт. Оно растет при приложении нагрузки на двигатель. Мне просто вот интересно в чем заключается эффективность электролита, сама физика процесса.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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

без емкости на малых оборотах сильно упадет момент на валу двигателя. 

Vlad1m1r
Vlad1m1r аватар
Offline
Зарегистрирован: 08.06.2019

Вот такая схема. Электролит сейчас поставил на выход диодного моста, соответственно. Но каких либо изменений, чтобы прям вау, нету. 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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