Плавный запуск и остановка мотора.
- Войдите на сайт для отправки комментариев
Чт, 26/11/2015 - 18:26
Привет специалисты. Нужна ваша помощь. Есть скетч
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);
}
}
Здесь цикл for из функции "void Run_Motor()" запускает мотор (кулер от компьютера) через транзистор. Раскрутка происходит в течении 3 секунд до полной мощности и затем кулер останавливается и опять запускается. С принципом работы цикла все понятно. Вопрос такой как сделать чтобы мотор работал длительное время, (без delay), а останавливался например при каком либо условии (if... else). Условие я напишу сам (типо если температура с датчика такая та, то мотор останавлиается). Спасибо заранее большое
объявить переменную-флаг boolean motorRun
строка 13 - если температура больше И !motorRun -> Run_Motor()
елзе температура меньше И motorRun -> Stop_Motor()
строка 21А - motorRun = true ;
строка 30А - motorRun = false ;
intmotor = 9;лучше заменить на#define motor 9
Сделал все как Вы написали. Но проблема осталась та же. Конечно можно сделать по другому - просто в условии поставить строку 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); } }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; - при запуске не стартанёт кулер , дальше всё в лупе решится - запускать кулер или нет
при размещении кода здесЯ - ставь ещё галочку и в чек-боксе "свернуть код" :)
Конечно можно сделать по другому - просто в условии поставить строку digitalWrite(9,1) запуск моторов, либо остановку digitalWrite(9,0).
можно.... и будет МК на каждом проходе лупа включать включенный или выключать выключенный кулер более 1000....4000 раз в секунду.... зачем ?
это про
if(valT<600 && !motorRun)опять жеСпасибо большое. Все работает. Я недавно начал заниматься ардуино. Нехватает нзаний. Поэтому обратился за помощью сюда. Читаю книгу, смотрю примеры разные, в том числе здесь
Кстати книга которую читаю Изучаем ардуино, автор Джереми Блум. Как думаете на пользу пойдет в изучении ардуино??
пожста , удачи ! :)
Кстати книга которую читаю Изучаем ардуино, автор Джереми Блум. Как думаете на пользу пойдет в изучении ардуино??
не читал...
любая книга - на пользу пойдет в изучении ардуино !!!!!!
что лучше ? может быть здесь кто ответит , нет - создайте тему и спросите....
в этом - я скорее антисоветчик :) , ничёНеСоветчик
весь код крайний - сюда , пожста - ещё замечание есть
Какой весь код крайний сюда?
рабочий код твоей программки , крайняя версия
который Все работает.
#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); } }Рабочий код.)))
раскачка системы....
< 600 - включить кулер
> 600 - выключить кулер
три контролируемых диапазона
- 0...599
- 600...600
- 601...1023
можно попасть в режим раскачки системы - вкл. , выкл. , вкл. , выкл. , вкл. , выкл. , .........
лечение - ввод гистерезиса ( читать отдельно )
три НОВЫХ контролируемых диапазона
- 0...550
- 551...650
- 651...1023
петля гистерезиса = 100 , подбирается чуйкой или на практике.... раскачки не будет
ессссстессссно , код просто поправить надо
ого !
intmaxRPM;- задумал не вкл/выкл кулера , а обороты в зависимости от температуры ? Удачи ! :)но - лучше совместить сразу определение и инициализацию переменной
intmaxRPM = 140;, а строку 10 выкинуть :)Рабочий код.)))
Падравляю ! :)
boolean motorRun =false;я бы так тоже сделал.... хотя бы для обозначения работоспособности кулера при запуске устройства....
<600 или >600 эти параметры ради эксперимента. На самом деле хочу сделать частотный преобразователь. У нас на фабрике по переработке каменной соли чстотники есть на конвейерах, они также плавно запускают двигатели и скорсть их работы зависит от цифровых данных введенные в компьютер . Вот решил идею на ардуине ввоплотить. За советы по раскачке и про гистерезис спасибо
на счет строки 10 это я думал как сделать входные данные для изменения параметром цикла, т.е. задать минимальную или максимальную скорость , а время раскрутки двигателя - для delay тоже задать переменную можно
тогда я тибя расстрою....
управление кулером от компа - это одно , "частотник" - это совсем другое управление и другим ( по типу ) мотором :(
Да. я знаю. просто хотел попрововать сделать это все по принципу работы частотника
не по принципу....
это слабая имитация работы частотника , внешняя , визуальная....
Да. я знаю. просто хотел попрововать сделать это все по принципу работы частотника
Ну что Вы... Частотник это совсем другое... В принципе. : ))) Там очень, подчеркиваю, очень серьезная математика, которую в темпе полуволны питающего напряжения считает сигнальный процессор. Своими силами вполне можно сделать устройство плавного пуска (УПП) (софт-стартер). Часто по жизни этого оказывается достаточным, а начинка УПП на порядок проще, чем у ЧРП. Вполне работоспособными могут оказаться самодельные привода постоянного тока (ППТ) для промышленных коллекторных двигателей. Там тоже все гораздо проще, чем в ЧРП. Прикиньте, может имеет смысл сосредоточиться на таких устройствах?