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

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.

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

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

А также здесь

01pinMode (8, INPUT); // вход сигнала ICP( №8 only для atmega328)
02  //настройка 16 бит таймера-счётчика 1
03  TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
04  TIMSK1 = (1 << ICIE1) | (1 << TOIE1); //создавать прерывание от сигнала на пине ICP1
05  TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS10); //div 1
06 
07 
08}
09  
10 
11ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
12 
13  tic = ((uint32_t)int_tic << 16) | ICR1 ; //подсчёт тиков
14 
15  ICR1 = 0; int_tic = 0; TCNT1 = 0;
16 
17  sp = sp + 1 ; // для подсчёта оборотов в минуту.
18 
19  holl = holl + 1;
20 
21}   // после каждого срабатывания датчика холл+1
22 
23  
24 
25  
26 
27ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
28 
29  int_tic++; //считать переполнения через 65536 тактов
30 
31  if (int_tic > t) {
32 
33    tic = 0;  //если на входе пусто более минимального времени то обнулить счётчики
34 
35    int_tic = 0;
36 
37  }
38 
39  if (int_tic > 500) {
40 
41    dimming = 130; // если стоим 2 секунды, то сбрасываем напряжение.
42 
43  }
44 
45}
46 
47  
48 
49// the interrupt function must take no parameters and return nothing
50 
51void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
52 
53{
54 
55  time = micros();
56 
57  
58 
59}

 

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

dimax пишет:

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

01volatile unsigned int int_tic;
02volatile unsigned long tic;
03void setup(){
04Serial.begin(9600);
05pinMode (8,INPUT); // вход сигнала ICP( №8 only для atmega328)
06//настройка 16 бит таймера-счётчика 1
07TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
09TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
10}
11 
12ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
13tic= ((uint32_t)int_tic<<16)|TCNT1 ; //подсчёт тиков
14ICR1=0; int_tic=0; TCNT1=0;  }
15 
16ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
17int_tic++; //считать переполнения через 65536 тактов
18if (int_tic > (F_CPU/65536)) {tic=0; int_tic=0;} //если на входе пусто более секунды
19}                                                 //то обнулить счётчики
20   
21void loop(){
22Serial.println((float)F_CPU/tic);
23}

Здесь переменная 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, для регулировки симистора таким образом:

1void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
2{
3  time = micros();
4 
5}

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

1int dimtime = (75 * dimming);               // For 60Hz =>65
2  tims = micros();                            // считываем время, прошедшее с момента запуска программы
3  if (tims >= (time + dimtime)) {             //если время больше или равно времени срабатывания нуля + время задержки
4 
5    digitalWrite(AC_LOAD, HIGH);              // открываем симистор
6    delayMicroseconds(10);                   // задержка 10 микросекунд (для 60Hz = 8.33)
7    digitalWrite(AC_LOAD, LOW);              // выключаем сигнал на симистор.
8  }

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

Не может оказаться так, что в тот момент когда частота счётчика оборотов приближается к 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

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

01volatile uint16_t  int_tic;
02volatile uint32_t  tic;
03void setup(){
04Serial.begin(9600);
05pinMode (8,INPUT_PULLUP); // вход сигнала ICP( №8 only для atmega328)
06//настройка 16 бит таймера-счётчика 1
07TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
09TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
10}
11 
12ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
13TCNT1=0;
14if (TIFR1&(1<<TOV1)){ TIFR1|=1<<TOV1; if (ICR1<100) { int_tic++;} }
15 tic= ((uint32_t)int_tic<<16)| ICR1 ;  //подсчёт тиков
16  int_tic=0;
17}
18 
19ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
20int_tic++; //считать переполнения через 65536 тактов
21 if (int_tic > 244) //если на входе пусто более секунды
22     {tic=0; int_tic=0;}  //то обнулить счётчики 
23     }                                               
24void loop(){
25Serial.println(tic);
26 
27}

 

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

dimax пишет:

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

01volatile uint16_t  int_tic;
02volatile uint32_t  tic;
03void setup(){
04Serial.begin(9600);
05pinMode (8,INPUT_PULLUP); // вход сигнала ICP( №8 only для atmega328)
06//настройка 16 бит таймера-счётчика 1
07TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
09TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
10}
11 
12ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
13TCNT1=0;
14if (TIFR1&(1<<TOV1)){ TIFR1|=1<<TOV1; if (ICR1<100) { int_tic++;} }
15 tic= ((uint32_t)int_tic<<16)| ICR1 ;  //подсчёт тиков
16  int_tic=0;
17}
18 
19ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
20int_tic++; //считать переполнения через 65536 тактов
21 if (int_tic > 244) //если на входе пусто более секунды
22     {tic=0; int_tic=0;}  //то обнулить счётчики 
23     }                                               
24void loop(){
25Serial.println(tic);
26 
27}

 

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

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 раза в секунду. И в это время происходят какие то задержки и симистор открывается не правильно.

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

001#include <LiquidCrystal.h>      // библиотека экрана
002 
003LiquidCrystal lcd(3,4,5,9,10,11);   // пины экрана
004 
005float kImp = 120;          //ввести кол-во импульсов на 10 оборотов
006 
007int AC_LOAD = 17;    // пин управления симистором
008volatile int dimming = 120;  // время задержки от нуля   7 = максимально, 120 = минимально
009 
010volatile unsigned long time; // время в микросекундах срабатывания датчика нуля
011unsigned long tims;           // переменная показаний времени
012        
013unsigned long currentTime;     //временные переменные для таймера экрана
014unsigned long loopTime;
015 
016 
017 
018volatile int holl = 0;    //переменная  срабатываня датчика
019 
020volatile int sp = 0;           //переменная суммы срабатываний датчика
021 
022volatile unsigned int int_tic;    //переменные для подсчёта времени между импульсами.
023volatile unsigned long tic;
024volatile int t = 0;               //минимальное время импульсов +1
025int r1 = 18;//  Реле  на А1
026int r2 = 19;//   реле  на А2
027 
028 
029void setup()
030{
031 pinMode(r1, OUTPUT);// Назначаем выходом
032  pinMode(r2, OUTPUT);//назначаем выходом
033  digitalWrite(r1, LOW);// Оставляем невключеным
034  digitalWrite(r2, LOW);//оставляем невключенным
035 
036   
037  pinMode(AC_LOAD, OUTPUT);        // назначаем выходом
038  attachInterrupt(0, zero_crosss_int, RISING);  // прерывание по пину 2
039    
040  lcd.begin(16, 2);          //дисплей 16символов 2строчки
041  lcd.setCursor(0,0);
042 
043lcd.write("Si:");  //в верхней строке выводим время задержки
044 
045lcd.setCursor(0,1); 
046 
047lcd.write("Re:");  // В нижней выводим показания датчика
048 
049lcd.setCursor(9,1); 
050 
051lcd.write("S:");  // В нижней выводим фактичесские обороты
052 
053pinMode (8,INPUT); // вход сигнала ICP( №8 only для atmega328)
054//настройка 16 бит таймера-счётчика 1
055TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
056TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
057TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
058}
059 
060ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
061tic= ((uint32_t)int_tic<<16)|TCNT1 ; //подсчёт тиков
062ICR1=0; int_tic=0; TCNT1=0;
063sp = sp +1 ;  // для подсчёта оборотов в минуту.
064holl =holl+ 1;}   // после каждого срабатывания датчика холл+1
065 
066ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
067int_tic++; //считать переполнения через 65536 тактов
068if (int_tic > t) {tic=0; int_tic=0;} //если на входе пусто более минимального времени то обнулить счётчики
069if (int_tic > 500) {dimming =130;}    // если стоим 2 секунды, то сбрасываем напряжение.
070}                                                
071 
072// the interrupt function must take no parameters and return nothing
073void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
074{
075  time = micros();
076   
077}
078 
079void loop()  {
080 
081   
082 int val = analogRead(A0);
083 
084if (val > 0){                  //   если регулятор больше 0
085 digitalWrite(r1, HIGH);
086 dimming =map(val, 0, 1023, 120, 7);
087}
088    else {
089       dimming =120;      //Если регулятор на 0 то время задержки 120
090       digitalWrite(r1,LOW );
091      }
092      
093    dimming = constrain(dimming,7,120) ; //  Следим чтоб время задержки было не меньше 7 и не больше 130
094    int dimtime = (75*dimming);    // For 60Hz =>65   
095    tims = micros();                           // считываем время, прошедшее с момента запуска программы
096  if(tims >= (time + dimtime)){       //если время больше или равно времени срабатывания нуля + время задержки
097   
098  digitalWrite(AC_LOAD, HIGH);   // открываем симистор
099  delayMicroseconds(10);         // задержка 10 микросекунд (для 60Hz = 8.33)
100  digitalWrite(AC_LOAD, LOW);    // выключаем сигнал на симистор.
101  }
102  else {}
103 
104   
105     
106     
107      // Для вывода значений на дисплей 2 раз в секунду
108       
109   currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
110  if(currentTime >= (loopTime + 500)){              // сравниваем текущий таймер с переменной loopTime + 0,5 секунд
111     
112        // выводим показания датчика
113     
114    lcd.setCursor(3,0);
115    lcd.print(dimming);
116    lcd.print("  ");     // выводим время задержки на экран.
117 
118    lcd.setCursor(3,1);
119    lcd.print(val);
120    lcd.print("  ");
121 
122      
123     lcd.setCursor(11,1);
124     
125lcd.print (int (sp*(1200/kImp)));     // выводим средние обороты на экран.
126lcd.print("       ");
127sp = 0;
128 
129    loopTime = currentTime;                         // в loopTime записываем новое значение
130  }
131}

 

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

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

01#include <CyberLib.h>
02 
03void setup()
04{
05  Serial.begin (115200);
06  D13_Out;
07  StartTimer1(Led_Blink, 1000000);        // раз в секунду
08}
09 
10void Led_Blink()
11{
12  D13_Inv;
13  Serial.println ( millis() / 1000);
14}
15 
16void loop()  {
17 
18  Serial.println ( "    delay start");
19  delay (10000);                             //  10 секунд
20  Serial.println ( "    delay end");
21  
22 
23}

 

Гриша
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

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