ARDUINO Управление оборотами двигателя

Electronic_Arts

✩✩✩✩✩✩✩
16 Мар 2019
6
0
Народ всем привет,

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


А вот скетч на ардуино от Алекса.
C++:
#define dimPin 4
#define zeroPin 2
#include <CyberLib.h> // шустрая библиотека для таймера
volatile int tic, Dimmer;

void setup() {
  pinMode(dimPin, OUTPUT);
  digitalWrite(dimPin, 0);
  pinMode(zeroPin, INPUT);                 // настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  attachInterrupt(0, detect_up, FALLING);  // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
  StartTimer1(timer_interrupt, 40);        // время для одного разряда ШИМ
  StopTimer1();                            // остановить таймер
}

void loop() {
  // раскомментировать для управления потенциометром (аналоговый А0)
 Dimmer = map(analogRead(0), 0, 1023, 240, 0);
}

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
void timer_interrupt() {       // прерывания таймера срабатывают каждые 40 мкс
  tic++;                       // счетчик
  if (tic > Dimmer)            // если настало время включать ток
    digitalWrite(dimPin, 1);   // врубить ток
}

void  detect_up() {    // обработка внешнего прерывания на пересекание нуля снизу
  tic = 0;                                  // обнулить счетчик
  ResumeTimer1();                           // перезапустить таймер
  attachInterrupt(0, detect_down, RISING);  // перенастроить прерывание
}

void  detect_down() {  // обработка внешнего прерывания на пересекание нуля сверху
  tic = 0;                                  // обнулить счетчик
  StopTimer1();                             // остановить таймер
  digitalWrite(dimPin, 0);                  // вырубить ток
  attachInterrupt(0, detect_up, FALLING);   // перенастроить прерывание
}
Двигатель не реагирует на потенциометр! Как бы по задумке она должна при повороте ручки потенциометра плавно повышать обороты но в реале двигатель либо не крутится вообще либо же начинает крутится на максимальных оборотах не реагируя на положение потенциометра.

За любой совет буду очень благодарен.
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,002
406
Москва
wan-derer.ru
@Electronic_Arts, надо смотреть не только наскетч от Алекса, но и принцип работы этой схемы. А также принцип работы двигателя и способ регулирования оборотов двигателя конкретного типа.
 

Electronic_Arts

✩✩✩✩✩✩✩
16 Мар 2019
6
0
@Electronic_Arts, надо смотреть не только наскетч от Алекса, но и принцип работы этой схемы. А также принцип работы двигателя и способ регулирования оборотов двигателя конкретного типа.
Двигатель коллекторный обычный. Вот с помощью этого модуля двигатель работает нормально, обороты регулируются без проблем.


Но вот через ардуино что то не получается это сделать.
Такое ощущение что симистор все время остается в открытом состоянии.

Переход через нуля проверил подключив к схеме дисплей и выводил на него результаты. Все ок 50 раз в секунду.
Потенциометр тоже выдает от 0 - 1023

Единственное это в схеме стоит симистор BT12 которого у меня нет я поставил BT137. Подключение 100 раз проверял все ок.

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

Gekso

✩✩✩✩✩✩✩
29 Май 2019
7
0
У меня тоже такая проблема, все сделал по схеме все проверил скеч залил, не получается управлять яркостью лампочки.
на пин симистора подал +5 лампочка горит.
Кто столкнулся с подобной ситуации, помогите разбираться. (Спасибо!)
 

Electronic_Arts

✩✩✩✩✩✩✩
16 Мар 2019
6
0
На иностранных форумах жалуются на китайские MOC3021. Как только сам разберусь что к чему сразу отпишусь.
 

Electronic_Arts

✩✩✩✩✩✩✩
16 Мар 2019
6
0
Если они с АлиЭкспресс то стоит их проверять потому что бывает из 10ти только 2 рабочие а бывает вообще живих не бывает все пробитые.
 

Gekso

✩✩✩✩✩✩✩
29 Май 2019
7
0
они куплены с Китая (с ХанДжоу) по качеству не знаю китаец говорил высокое качество
Еще одну вещь заметил когда подам 5 вольт на пин диммера лампочка горит. Это же может означать, что схема и компоненты рабочие ?
для страховки соберу несколько вдруг заработает)))
 

Electronic_Arts

✩✩✩✩✩✩✩
16 Мар 2019
6
0
Такая же беда у меня - диммирование не работает - двигатель либо крутиться на полных оборотах либо вообще не крутится.
 

Gekso

✩✩✩✩✩✩✩
29 Май 2019
7
0
День добрый. У сайта есть модератор - может он спросит у автора (Алекса) и даст нам ответ (решение проблем). ???
 

Gekso

✩✩✩✩✩✩✩
29 Май 2019
7
0
@Electronic_Arts Здравствуйте, у вас что не будь получился ? у меня нет(. Как раньше разные скеч нашел залил не как не работает.
несколько сайтов нашел где подобная схема, но код разное, посмотрите может вы лучше поймете а том мой мозг уже устал наверное))).
Если че пишите не забудьте))).
http://cyber-place.ru/showthread.php?t=1068
http://arduinolab.pw/index.php/2015/12/01/setevoj-dimmer-upravlyaemyj-arduino/
http://arduinotehniq.blogspot.com/2014/10/ac-light-dimmer-with-arduino.html
готовый модуль на али
https://ru.aliexpress.com/item/AC-L...b9e7ae0840d2de5e1&onelink_page_to=ITEM_DETAIL
 

Electronic_Arts

✩✩✩✩✩✩✩
16 Мар 2019
6
0
Я заказал себе нормальный осцилограф - получу его посмотрю в чем беда потому что один и тот же скетчь у одного работает а у другого нет. Я весь интернет обошел даже иностранные сайте везьде схема подключения и скетчь один и тот же но почему то они у меня не хотят работать.
 

selevo

✩✩✩✩✩✩✩
25 Апр 2020
15
3
автор уже получил осциллограф ?
Чем закончилось исследование ?
 

djsasmaster

✩✩✩✩✩✩✩
23 Май 2020
2
1
Есть Программное решение проблемы:
/*
Диммер переменки на Arduino. 7 каналов для Каменки
Диммеры 1,2 Фаза A . Диммеры 3,4 Фаза B . Диммеры 5,6,7 Фаза C.
1-4 Основные Тэны, 5-6 Тэны Парогенератора, 7 Насос Парогенератора.
Измеряет потребление тэнами , Тестирует на обрыв цепи.
в коде кусок передачи параметров по i2c адрес 7
*/

// подключаем кучу выходов на симисторы
#define zeroPin 2 // 32- Я НОГА ATMEL328 SMD
/*Обязательно защитите от помех Лучше в Экранированный провод!
*/

#define dimPin1 4 // 2-Я НОГА ATMEL328 SMD
#define dimPin2 5 // 9-Я НОГА ATMEL328 SMD
#define dimPin3 6 // 10-Я НОГА ATMEL328 SMD
#define dimPin4 7 // 11-Я НОГА ATMEL328 SMD
#define dimPin5 8 // 12-Я НОГА ATMEL328 SMD
#define dimPin6 9 // 13-Я НОГА ATMEL328 SMD
#define dimPin7 10 // 14-Я НОГА ATMEL328 SMD
#define zero 10 // TIMER RESET
#define tok1 A0 // curent power 23-Я НОГА ATMEL328 SMD
#define tok2 A1 // curent power 24-Я НОГА ATMEL328 SMD
#define tok3 A2 // curent power 25-Я НОГА ATMEL328 SMD
// A3 датчик температуры испарителя.термопара
// A6 датчик наличия отсутствия воды низкое сопротивление
// A7 датчики превышения критической температуры низкий уровень без пара высокий с паром

#include <Wire.h> // Библиотека I2C
#include <CyberLib.h> // шустрая библиотека для таймера
//Параметры диммера. максимальное значение 205 для одной фазы
// 0-180 плавная регулировка
// 18Х-235 сбойный участок - регулируется рывками и перестаёт выключаться
// 236-250 выключение
// больше 250 переход на второй круг
volatile byte tic, Dimmer1 = 20, Dimmer2 = 69, Dimmer3 = 103, Dimmer4 = 149, Dimmer5 = 2, Dimmer6 = 19, Dimmer7 = 120;
/*при подключении датчика к фазе А

*/
int x1 = 255, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0, x7 = 0;
int iz = 5 ;// TIMER sens RESET
int fb = 0 ;// Корректировка угла фазы B - возможно не сработает
int fc = 0 ;// Корректировка угла фазы c - возможно не сработает

int t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0; // Сброс значений тока
void receiveEvent();
void detect_up();
void timer_interrupt();

void setup() {
Wire.begin(7); // join i2c bus with address #7
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
//Dimmer1 = x1;
//Serial.begin(9600);

pinMode(dimPin1, OUTPUT);
digitalWrite(dimPin1, 0);
pinMode(dimPin2, OUTPUT);
digitalWrite(dimPin2, 0);
pinMode(dimPin3, OUTPUT);
digitalWrite(dimPin3, 0);
pinMode(dimPin4, OUTPUT);
digitalWrite(dimPin4, 0);
pinMode(dimPin5, OUTPUT);
digitalWrite(dimPin5, 0);
pinMode(dimPin6, OUTPUT);
digitalWrite(dimPin6, 0);
pinMode(dimPin7, OUTPUT);
digitalWrite(dimPin7, 0);
pinMode(zeroPin, INPUT); // настраиваем порт на вход для отслеживания прохождения сигнала через ноль
attachInterrupt(0, detect_up, FALLING); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень

StartTimer1(timer_interrupt, 40); // время для одного разряда ШИМ
StopTimer1(); // остановить таймер
}

void loop() {

// Wire.onReceive(receiveEvent);
// раскомментировать для ввода числа диммирования чеерез монитор порта
// while (Serial.available()) {
//Dimmer1 = Serial.parseInt();
// Serial.println(Dimmer1);
//}

}

//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ --------------------------
void timer_interrupt() { // прерывания таймера срабатывают каждые 40 мкс
tic++; // счетчик
if (tic > Dimmer1) // если настало время включать ток
digitalWrite(dimPin1, 1); // врубить ток
if (tic == Dimmer1 + iz) { // если настало время измерять ток
t1 = analogRead(tok1); // прочитать потребление энергии фазы A(используется модуль токовая катушка с диодом).
return t1;
}
if (tic > Dimmer1 + zero) // если настало время выключать ток
digitalWrite(dimPin1, 0); // отключить управление от симистора чтобы при переходе тока через 0 он отключил цепь.
if (tic > Dimmer2) // если настало время включать ток
digitalWrite(dimPin2, 1); // врубить ток
if (tic == Dimmer2 + iz) { // если настало время измерять ток
t1 = analogRead(tok1); // прочитать потребление энергии фаза A
return t2;
}
if (tic > Dimmer2 + zero) // если настало время выключать ток
digitalWrite(dimPin2, 0); // отключить управление от симистора чтобы при переходе тока через 0 он отключил цепь.
if (tic > Dimmer3 + fb) // если настало время включать ток
digitalWrite(dimPin3, 1); // врубить ток
if (tic == Dimmer3 + iz + fb) { // если настало время измерять ток
t3 = analogRead(tok2); // прочитать потребление энергии фаза B
return t3;
}
if (tic > Dimmer3 + zero + fb) // если настало время выключать ток
digitalWrite(dimPin3, 0); // отключить управление от симистора чтобы при переходе тока через 0 он отключил цепь.
if (tic > Dimmer4 + +fb) // если настало время включать ток
digitalWrite(dimPin4, 1); // врубить ток
if (tic == Dimmer4 + iz + fb) { // если настало время измерять ток
t4 = analogRead(tok2); // прочитать потребление энергии фаза B
return t4;
}
if (tic > Dimmer4 + zero + fb) // если настало время выключать ток
digitalWrite(dimPin4, 0); // отключить управление от симистора чтобы при переходе тока через 0 он отключил цепь.
if (tic > Dimmer5 + fc) // если настало время включать ток
digitalWrite(dimPin5, 1); // врубить ток
if (tic == Dimmer5 + iz + fc) { // если настало время измерять ток
t5 = analogRead(tok3); // прочитать потребление энергии фаза С
return t5;
}
if (tic > Dimmer5 + zero + fc) // если настало время выключать ток
digitalWrite(dimPin5, 0); // отключить управление от симистора чтобы при переходе тока через 0 он отключил цепь.
if (tic > Dimmer6 + fc) // если настало время включать ток
digitalWrite(dimPin6, 1); // врубить ток
if (tic == Dimmer6 + iz + fc) { // если настало время измерять ток
t6 = analogRead(tok3); // прочитать потребление энергии фаза С
return t6;
}
if (tic > Dimmer6 + zero + fc) // если настало время выключать ток
digitalWrite(dimPin7, 0); // отключить управление от симистора чтобы при переходе тока через 0 он отключил цепь.
if (tic > Dimmer7 + fc) // если настало время включать ток
digitalWrite(dimPin7, 1); // врубить ток
if (tic == Dimmer7 + iz + fc) { // если настало время измерять ток
t7 = analogRead(tok3); // прочитать потребление энергии фаза С
return t7;
}
if (tic > Dimmer7 + zero + fc) // если настало время выключать ток
digitalWrite(dimPin7, 0); // отключить управление от симистора чтобы при переходе тока через 0 он отключил цепь.
}

void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
int x1 = Wire.read(); // receive byte as an integer
int x2 = Wire.read(); // receive byte as an integer
int x3 = Wire.read(); // receive byte as an integer
int x4 = Wire.read(); // receive byte as an integer
int x5 = Wire.read(); // receive byte as an integer
int x6 = Wire.read(); // receive byte as an integer
int x7 = Wire.read(); // receive byte as an integer

Serial.println(x1), (x2), (x3), (x4), (x5), (x6), (x7); // print the integer
Dimmer1 = x1, Dimmer2 = x2, Dimmer3 = x3, Dimmer4 = x4, Dimmer5 = x5, Dimmer6 = x6, Dimmer7 = x7;
return Dimmer1, Dimmer2, Dimmer3, Dimmer4, Dimmer5, Dimmer6, Dimmer7;
}
void detect_up() { // обработка внешнего прерывания на пересекание нуля снизу
tic = 0; // обнулить счетчик
digitalWrite(dimPin1, 0); // вырубить ток
digitalWrite(dimPin2, 0); // вырубить ток
digitalWrite(dimPin3, 0); // вырубить ток
digitalWrite(dimPin4, 0); // вырубить ток
digitalWrite(dimPin5, 0); // вырубить ток
digitalWrite(dimPin6, 0); // вырубить ток
digitalWrite(dimPin7, 0); // вырубить ток
ResumeTimer1(); // перезапустить таймер
attachInterrupt(0, detect_down, RISING); // перенастроить прерывание
}

void detect_down() { // обработка внешнего прерывания на пересекание нуля сверху
tic = 0; // обнулить счетчик
StopTimer1(); // остановить таймер
//Serial.println(t);
digitalWrite(dimPin1, 0); // вырубить ток
digitalWrite(dimPin2, 0); // вырубить ток
digitalWrite(dimPin3, 0); // вырубить ток
digitalWrite(dimPin4, 0); // вырубить ток
digitalWrite(dimPin5, 0); // вырубить ток
digitalWrite(dimPin6, 0); // вырубить ток
digitalWrite(dimPin7, 0); // вырубить ток
attachInterrupt(0, detect_up, FALLING); // перенастроить прерывание
}
//----------------------ОБРАБОТЧИКИ ПРЕРЫВАНИЙ--------------------------
//----------------------ОБРАБОТЧИК ПРИЁМА ДАННЫХ ----------------------
 

Николядзэ

✩✩✩✩✩✩✩
17 Сен 2020
1
0
Функции digitalWrite() и digitalRead() медленные - выполняются за большое количество циклов контроллера. Для ускорения нужно напрямую писать в порты микроконтроллера.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
357
564
День добрый. У сайта есть модератор - может он спросит у автора (Алекса) и даст нам ответ (решение проблем). ???
Если на видео всё работает, значит всё работает. Ищите ошибки в собранной схеме и бракованные/убитые компоненты
 
  • Лойс +1
Реакции: Roden

ТехнарьКто

★★★★★✩✩
13 Янв 2020
273
435
@Electronic_Arts,

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

PS Зако́н Ме́рфи (англ. Murphy's law) — шутливый философский принцип, который формулируется следующим образом: Всё, что может пойти не так, пойдёт не так.
 
  • Лойс +1
Реакции: Nikanor