Плавный запуск и остановка мотора.

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

Привет специалисты. Нужна ваша помощь. Есть скетч

int motor = 9;
//int temp = A0;


void setup() {
   pinMode(motor, OUTPUT);
 //  pinMode(temp, INPUT);
 //  Serial.begin(9600);
}

void loop(){
//  int valT =analogRead(temp);
 // Serial.println(valT);
  Run_Motor();
 }
 
 
 
void Run_Motor(){
 for (int i=70; i<=255; i++)
 {
analogWrite(motor, i);
delay(30);

  }
 }
 
 void Stop_Motor(){
 for (int i=255; i>=0; i--)
 {
analogWrite(motor, i);
delay(20);
 }
}

 

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

Здесь цикл for из функции "void Run_Motor()" запускает мотор (кулер от компьютера) через транзистор. Раскрутка происходит в течении 3 секунд до полной мощности и затем кулер останавливается и опять запускается. С принципом работы цикла все понятно. Вопрос такой как сделать чтобы мотор работал длительное время, (без delay), а останавливался например при каком либо условии (if... else). Условие я напишу сам (типо если температура с датчика такая та, то мотор останавлиается). Спасибо заранее большое

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

объявить переменную-флаг boolean motorRun
строка 13 - если температура больше И !motorRun -> Run_Motor()
                   елзе температура меньше И motorRun -> Stop_Motor()

строка 21А - motorRun = true ;

строка 30А - motorRun = false ;

 

int motor = 9;  лучше заменить на
#define motor 9

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

Сделал все как Вы написали. Но проблема осталась та же. Конечно можно сделать по другому - просто в условии поставить строку digitalWrite(9,1)  запуск моторов, либо остановку digitalWrite(9,0). Но мне нужно мотор плавно раскручивать во время запуска . Вот исходник как я изменил его по Вашему. Может что то я не правильно сделал

#define motor  (9)
int temp = A0;
boolean motorRun;


void setup() {
   pinMode(motor, OUTPUT);
   pinMode(temp, INPUT);
   Serial.begin(9600);
}

void loop(){
  int valT =analogRead(temp);
  Serial.println(valT);
if (valT<600){ 
  Run_Motor();
}

if (valT>600){ 
  Stop_Motor();
 }
 
}
void Run_Motor(){
 for (int i=70; i<=255; i++)
 {
 motorRun=true; 
analogWrite(motor, i);
delay(30);


  }
 }
 void Stop_Motor(){
 for (int i=255; i>=0; i--)
 {
   motorRun=false;
analogWrite(motor, i);
delay(20);
 }
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

01 - #define motor 9  
02 - 
#define temp A0  
03 - 
boolean motorRun = false; 

01 , 02 - прописать в скетче ОДИН-В-ОДИН !!!! ( и почитать про #define ХХХХ хххх   )

Сделал все как Вы написали.

всё , да не всё....

1 - сравни if (valT<600) и if (valT<600 && !motorRun ) 
2 - сравни if (valT>600) и if (valT<600 && motorRun ) 

1 часть 2 - сработает когда ( перегрев И мотор выкл )
2 часть 2 - сработает когда ( переохл И мотор вкл )

03 - boolean motorRun = false;   - чтобы при запуске сразу стартовал кулер , дальше всё в лупе решится - крутить дальше кулер или остановить , но после раскрутки до 100%
03 - boolean motorRun = true;   - при запуске не стартанёт кулер , дальше всё в лупе решится - запускать кулер или нет

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при размещении кода здесЯ - ставь ещё галочку и в чек-боксе "свернуть код" :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Конечно можно сделать по другому - просто в условии поставить строку digitalWrite(9,1)  запуск моторов, либо остановку digitalWrite(9,0).
можно.... и будет МК на каждом проходе лупа включать включенный или выключать выключенный кулер более 1000....4000 раз в секунду.... зачем ?
это про if (valT<600 && !motorRun )  опять же

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

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

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

Кстати книга которую читаю Изучаем ардуино, автор Джереми Блум. Как думаете на пользу пойдет в изучении ардуино??

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

пожста , удачи ! :)

Кстати книга которую читаю Изучаем ардуино, автор Джереми Блум. Как думаете на пользу пойдет в изучении ардуино??
не читал...
любая книга - на пользу пойдет в изучении ардуино !!!!!!
что лучше ? может быть здесь кто ответит , нет - создайте тему и спросите....
в этом - я скорее антисоветчик :) , ничёНеСоветчик

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

весь код крайний - сюда , пожста - ещё замечание есть

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

Какой весь код крайний сюда?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

рабочий код твоей программки , крайняя версия

который Все работает.

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015
#define motor  (9)
#define temp  A0
boolean motorRun =false;
int maxRPM;

void setup() {
   pinMode(motor, OUTPUT);
   pinMode(temp, INPUT);
   Serial.begin(9600);
   maxRPM=140;
}

void loop(){
  int valT =analogRead(temp);
  Serial.println(valT);
if (valT<600 && !motorRun){ 
  Run_Motor();
   
}

if (valT>600 && motorRun){ 
  Stop_Motor();
 }
 
}
void Run_Motor(){
 for (int i=70; i<=maxRPM; i++)
 {
  motorRun=true;
analogWrite(motor, i);
delay(30);


  }
 }
 void Stop_Motor(){
 for (int i=255; i>=0; i--)
 {
   motorRun=false;
analogWrite(motor, i);
delay(20);
 }
}

 

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

Рабочий код.)))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

раскачка системы....
< 600 - включить кулер
> 600 - выключить кулер

три контролируемых диапазона
- 0...599
- 600...600
- 601...1023

можно попасть в режим раскачки системы - вкл. , выкл. , вкл. , выкл. , вкл. , выкл. , .........
лечение - ввод гистерезиса ( читать отдельно )

три НОВЫХ контролируемых диапазона
- 0...550
- 551...650
- 651...1023

петля гистерезиса = 100 , подбирается чуйкой или на практике.... раскачки не будет
ессссстессссно , код просто поправить надо

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ого !
int maxRPM; - задумал не вкл/выкл кулера ,  а обороты в зависимости от температуры ? Удачи ! :)
но - лучше совместить сразу определение и инициализацию переменной
int maxRPM = 140; , а строку 10 выкинуть :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Timofei-Iridium пишет:

Рабочий код.)))

Падравляю ! :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

boolean motorRun = false;
я бы так тоже сделал.... хотя бы для обозначения работоспособности кулера при запуске устройства....

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

<600 или >600 эти параметры ради эксперимента. На самом деле хочу сделать частотный преобразователь. У нас на фабрике по переработке каменной соли чстотники есть на конвейерах, они также плавно запускают двигатели и скорсть их работы зависит от цифровых данных введенные в компьютер . Вот решил идею на ардуине ввоплотить. За советы по раскачке  и про гистерезис спасибо

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

на счет строки 10 это я думал как сделать входные данные для изменения параметром цикла, т.е. задать минимальную или максимальную скорость , а  время раскрутки двигателя - для delay тоже задать переменную можно

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

тогда я тибя расстрою....
управление кулером от компа - это одно , "частотник" - это совсем другое управление и другим ( по типу ) мотором :(

Timofei-Iridium
Offline
Зарегистрирован: 20.11.2015

Да. я знаю. просто хотел попрововать сделать это все по принципу работы частотника

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не по принципу....
это слабая имитация работы частотника , внешняя , визуальная....

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Timofei-Iridium пишет:

Да. я знаю. просто хотел попрововать сделать это все по принципу работы частотника


Ну что Вы... Частотник это совсем другое... В принципе. : ))) Там очень, подчеркиваю, очень серьезная математика, которую в темпе полуволны питающего напряжения считает сигнальный процессор. Своими силами вполне можно сделать устройство плавного пуска (УПП) (софт-стартер). Часто по жизни этого оказывается достаточным, а начинка УПП на порядок проще, чем у ЧРП. Вполне работоспособными могут оказаться самодельные привода постоянного тока (ППТ) для промышленных коллекторных двигателей. Там тоже все гораздо проще, чем в ЧРП. Прикиньте, может имеет смысл сосредоточиться на таких устройствах?