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

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

Доброго времени суток!

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

Я конечно поспешил ее разобрать ( о чем в дальнейшем конечно пожалел а уже было все почикано ;) ).

Так вот при разборке решил сделать из электро двигателя станок или токарный или гончарный.

Остановился на гончарном.... дети ждут не дождутся!

Поскольку в электронике я не особо силен есть некоторые вопросы на счет которых хочу посоветоваться...,

в прогаммировании как оказалось тоже :)

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

Надеюсь тема будет итересна и в дальнейшем пригодится не только мне.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

TDA1085 - регулировка, стабилизация оборотов и не нужно никаких контроллеров. Не?

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

и так начнем!!!

натолкнуло меня на монтаж платы одно видео

https://www.youtube.com/watch?v=jvaR1ygWsNk

у автора видео есть свой блог и целая серия видео по регулированию оборотов электро двигателя...

я ему очень благодарен.

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

тех задание...:

1. включение и выключение электро двигателя на определенной скорости.

2. регулеровка потенциометром скорости враращения

3. подсчет оборотов вращения вала

4. экран на котором можно посмотреть скорость заданную и реальну.

5. в схеме должно быть реле для возможности отключения в случае нештатной ситуации

6.  ну и возможно плавный пуск двигателя (без рывка).

что было сделано......

собрана плата управления на основе такой схемы https://yadi.sk/i/wN1BEjGs3SfjfD

вот какая печатка получилась https://yadi.sk/i/QBacz0HS3Sfj8X пока не проверена и лай на нее  https://yadi.sk/d/HInSGbS83Sfk3W

добалено реле вот по такой схеме https://yadi.sk/i/2z6E6-js3Sfj99

и предохранитель нашел, тоже в схему добавил.

был преобретен датчик холла  который я благполучно спалилне правельным подключением, и приобретен еще один 49А который магнитом проверял, работает :)

дальше настало время прогамировать ардуинку...

теория (поправьте меня если я ошибаюсь)

частота в сети составляет 50 герц вот волна с переходом через ноль https://yadi.sk/i/VE1R1TtD3SfmWz этот бардак у нас творится в сети ;))

так как у нас на плате стоит диодный мост то все отрицательные полупериуды становятся положительными с частотой уже 100 раз в секунду и выглядят вот так https://yadi.sk/i/-clTw4rh3Sfmpz

а на пин ардуинки у нас приходит волна верхняя под названием В https://yadi.sk/i/m_eUm7Kb3SfnFV ну может быть развернутая (насколько я понимаю зависит от подключения оптопары).

дальше в ардуино нано есть 2 пина с внешним прерыванием и функция выполняющаяся при наступлении какого то события, attachInterrupt http://arduino.ru/Reference/AttachInterrupt

1ВОПРОС - так вот 3 параметр в примрах все выбирают по возрастающему фронту (RISING )

почему так делают? ведь на отработку нужно минимальное время и контроллеру и триаку, не правильне ли будет выбрать параметр (FALLING ) по спадающему фронту, ведь все равно это ноль и пока все отработает триак уже будет закрыт и на подеме не будет в начале отрутым?

2 ВОПРОС - пины 2 и 3 поддерживают прерывание , если задать 2 разных прерывания не бдут ли пины мешать друг другу, и как обработается прерывание пина №3 если до него уже сработало прерывание пина 2 но еще не выполнилось?

 

 

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

OlegK пишет:

TDA1085 - регулировка, стабилизация оборотов и не нужно никаких контроллеров. Не?

спасибо за предложение , я конечно понимаю что я написал (не силен в электронике и в программирование) но не до такой степини ))) да и опыт ценнее и еще одно да.. мне это нравится ;).

Так кто может подсказать ответы мне на мои вопросы,?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Это Вы несколько дней ждали, вместо того, что бы на практике определить, по спаду или фронту лучше обработать импульс и затратить несколько секунд на вбивание в поиск Гугела "приоритет прерываний AVR"? ))
А, ну да -

Baks пишет:
опыт ценнее

 

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

спасибо за ссылку, все прочитал.... Приоритет прерываний работает по принципу «кто первый встал тот и ходит в тапках».

на практике определить пока не могу, так как на собраной плате есть ошибки, на данный момент устраняю

не правильно подключил NPN транзистор 2222А для замыкания релющки 12в, уже переделал, а так же был бракованный (или я испортил) оптопара PC817 (заменил).

теперь этот узел заработал, однако есть еще какойто косяк со стороны слаботочки, пока не понял но обязательно разберусь.

у меня еще созрел вопрос , не могу найти ответ, возле реле установлен диод, это я понял для чего, потребление катушки реле 35 мА, нужно ли зашунтировать ограничивающим резистором? а то у меня получается что катушка питатся 12 вольтами практически на прямую из брока питания (не считая транзистора), или больше чем нужно тока для ее работы она не возьмет?

и второй вопрос, снова по прерываниям :)))

если бдут 2 внешних прерывания и 1 прерывание от таймера, так прерывание по таймеру тоже подчиняется закону таму кто первый? а остальные в очередь, правильно понимаю?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Baks пишет:
нужно ли зашунтировать ограничивающим резистором?

Не нужно.

Цитата:
так прерывание по таймеру тоже подчиняется закону таму кто первый? а остальные в очередь, правильно понимаю?


Все верно. Поэтому в прерываниях нужно выполнять минимум кода. И еще - погуглите про квалификатор volatile, если про него не в курсе.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

отладил я плату, все запустилось и работает.... но

1. датчик холла почемуто всегда выдает высокий уровень на сигнальный пин, а при его срадатывании выдает 0 (если магнит рядом),

на сколько я понимаю это не правильно, и как исправить не знаю)))) может кто подскажет... или так оставить?

2. не могу сообразить с логикой работы.

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

 детектор нуля на внешнем прерывании и холл тоже

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

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Baks пишет:
1. датчик холла почемуто всегда выдает высокий уровень на сигнальный пин, а при его срадатывании выдает 0 (если магнит рядом)

Правильно работает. Выход ДХ подтянут к + питания?

Цитата:
может кто подскажет... или так оставить?

ПМСМ, обороты пофиг как считать, по фронту и по спаду.

Цитата:
как выстроить логику чтоб обороты поддерживались  и подстраивались добавляя или уменьшая срез от полуволны в зависимости от оборотов

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

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

всем привет

вроди поуберал ошибки в монтаже платы, подключил лампочку... все работает и регулируется!

пишу скет для регулировки движка, на днях попробую.

однко есть одна неприятность... показания потенциометра скачут в пределах 10 + - (выводил в манитор порта), припаял конденсатор 10 мф мжду сигнальным и землей, стали прыгать в пределах 3 попугаев.

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

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Baks пишет:
с чем это может быть связано?

1. Пульсации питания.
2. Нестабильность контакта движка потенциометра.
3. Шум младших разрядов АЦП.

Можете усреднять значение АЦП - какое-то кол-во раз считывать, суммировать и делить на количество считываний (ср. арифметическое). Можете игнорировать новое значение, если оно на некое кол-во единиц (в Вашем случае более 3-х) отличается от предыдущего. Можно применить какой-нибудь программный алгоритм цифровой фильтрации.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

да я так и думал решить как Вы предложили. буду игнорить новое значение если оно не выходит за значения старого значения  +-5 единиц.

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

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Попробуйте. Но в данном случае, 3 единицы - немного, можно и "игнором" обойти.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Baks, если Вам нужно снимать показания с потенциометра, то напряжение, подаваемое на потенциометр, и опорное напряжение АЦП должно быть одним и тем же (не просто равными между собой, а именно одним и тем же - взятым из одной и той же точки схемы), тогде нестабильность питания не будет сказываться на показаниях.

10 мкФ - слишком много. Во-первых, Вы вновь введете зависимость показаний от нестабильности питания, во-вторых, 10 мкФ - это уже электролит, у которого велики как собственные шумы, так и токи утечки. Лучше заменить на керамику порядка 0.1 мкФ.

Ну и наконец (а на самом деле - в первую очередь), пока не опубликована схема, обсуждать можно только сферического коня в вакууме.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

замечание принял, вот схемка (вырезка из LAY6) выделено то что касается питания и 3 контакта потенциометра.

https://cloud.mail.ru/public/AfBW/AReYHSvyU

также выкладываю доработанную плату  разведенную в lay6

https://cloud.mail.ru/public/GQNn/7VNqCG9Bg

 

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

нашел код с подсчетом количества импульсов на 8 пине на 328 чипе.

не могли бы посмотреть , по возможности  обьяснить мне что вот это застрока 

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



#define kImp  120          //ввести кол-во импульсов на 10 оборотов
volatile uint16_t  int_tic;    //переменные для подсчёта времени между импульсами.
volatile uint32_t  tic;
volatile int t = 0;                  //минимальное время импульсов +1
int holl = 0;    //переменная  срабатываня датчика


void setup()
{ 
  t = (15000 / ( 100 * (kImp / 10))) * 2; //высчитываем минимальное время импульсов *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
  TCNT1 = 0;
  if (TIFR1 & (1 << TOV1)) {
    TIFR1 |= 1 << TOV1;
    if (ICR1 < 100) {
      int_tic++;
    }
  }
  tic = ((uint32_t)int_tic << 16) | ICR1 ; //подсчёт тиков
  int_tic = 0;
  
  holl = holl + 1;
}   // после каждого срабатывания датчика холл+1

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

void loop() 
{
 if ( holl >= 1)
  {
   Serial.println("$");
   Serial.println(tic );
   Serial.println(";"); 
   holl = 0;  
  }
}








и еще, ( Serial.println(tic );) что именно будет храниться в этой переменной ?

nevkon
Offline
Зарегистрирован: 20.01.2015

Так посмотрите - tic объявлен как uint32_t, а int_tic объявлен как uint16_t

Конкретно в той строке идет смещение и побитовое "или": https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE...

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

спасибо за труд, но мне все равно ничего не ясно, операто я понял что значит, читал перед написанием поста.

давайте я напишу что понимаю, а вы поправите или дополните...

в переменную tic поместим значение (int_tic со смещенными битами на 16 в лево ) или значение регистра ICR1 

что это за регистр и что в нем хранится не знаю :))))

наверное еще один пробел в знаниях, это регистры .

нашел кое что интересное, названия и описания регистра http://avrprog.blogspot.ru/2013/03/t1-16.html

  • ICR1 - регистр захвата (16 бит)
  • только все равно не пойму что там в нем лежит
nevkon
Offline
Зарегистрирован: 20.01.2015

Вот что находится при быстром поиске:

Включили микроконтроллер, настроили таймер, запустили его, таймер тикает. При изменении состояния ножки (при нарастании сигнала), текущее значение таймера (то сколько он оттикал), копируется в регистр ICR1.

По строке вы тоже не до конца поняли. Делаем смещение int_tic на 16 бит влево, затем результат прогоняют через логическую "или" (1 если любой бит равен 1, 0 если оба равны 0) с переменной ICR1. Какая разрядность у ICR1 сказать не могу - искать надо (но по идее должна быть 32 разрядная для сравнения).

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Ничего никуда не копируется. ICR1 - это доступ к аппаратному счетчику. Непосредственно к числу, которое используется при счете.

2. ICR1 - 16-разрядный регистр. В AVR вообще нет 32-разрядных регистров.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

Всем доброго дня!

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

Немного воды- вроди все по логике правильно в программе но не работат, и я пришел к выводу что не успевает ардуинка за всем следить и еще регулировать. Значит нужно разделить задачи. одна будет следить за скоростью, работать с экраном и расчитывать новое значение для димирования, а вторая будет димировать. Так вот нужно организовать передачу от мастера слейву (две ардуинки) одного параметра размером byte, вижу 2 варианта передачи это сериал и I2C.  максимальная частота передачи будет составлять 250 раз в секунду.

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

Подскажите пожалуйсто какой протакол справится и надежнее? или может какой другой?