Помогите с сервоприводом.
- Войдите на сайт для отправки комментариев
Ср, 28/10/2015 - 16:38
Здраствуйте, решил сделать автоматический подсос на карбюратор автомобильного двигателя, написал программу но мне не нравиться что в ней присутствуют концевики и обычный мотор. у меня имеется сервопривод, но как его подключить не знаю, суть в общем такая, допустим if (обороты > 1500) servaminus; вот что то похожее было...
#define RPMpin 2 // датчик Холла
long microsold = 0;
int rpm = 0;
int con_open = 7; // концевик полностью открытой заслонки
int con_clos = 4; // концевик полностью закрытой заслонки
int temp = A3; // датчик температуры
int gercon = 11; // геркон на мкпп
int out1 = 5; //выход на любой мотор
int out2 = 6; // выход на любой мотор
int knopka_high = 8;
int knopka_low = 9;
int knopka_avtomat = 10;
void setup()
{
Serial.begin(9600);
digitalWrite(RPMpin, 1);
attachInterrupt(0, RPM1, FALLING);
// объявляем входом
pinMode(con_open, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм
pinMode(temp, INPUT);
pinMode(con_clos, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм
pinMode(knopka_avtomat, INPUT);
pinMode(knopka_low, INPUT);
pinMode(knopka_high, INPUT);
// объявляем выходом
pinMode(out1, OUTPUT);
digitalWrite(out1, LOW);
pinMode(out2, OUTPUT);
digitalWrite(out2, LOW);
}
void loop()
{
Serial.print("rpm");
Serial.println(rpm, DEC);
delay(500);
if (digitalRead(knopka_avtomat)==1)
{
if (digitalRead(gercon)==0)
{
avtomat();
}
}
else
{
manual();
}
}
void avtomat()
// сама программа
{
if (analogRead(temp) <= 5)
{
if (rpm > 100)//если ни одно не верно то запускаем программу управления по температуре
{
chek_serva3();// вторая программа управления моторчиком
}
}
else if ((analogRead(temp) <= 30) && (rpm > 100)) // если температура меньше 30 и двигатель не заглушен то управлять первым режимом управления моторчиком
{
chek_serva();// первая программа управления моторчиком
}
else if ((analogRead(temp) <= 60) && (rpm > 100))// если температура меньше 60 и двигатель не заглушен то управлять первым режимом управления моторчиком
{
chek_serva2();// вторая программа управления моторчиком
}
else //если ни одно не верно то запускаем программу управления по температуре
{
chek_temp(); // программа управления по температуре
}
// тут ми считываем показания с датчиков что бы настроить под машину задержки нам не мешают, даже помогают, что бы моторчик бешано не крутился постоянно
Serial.print("temp");
Serial.println(analogRead(temp));
}
void chek_serva()// первая программа управления моторчиком
{
if(rpm >= 1500) // если обороты больше 1500 то провернуть моторчик с небольшой задержкой в одну сторону( сами выберете в какую)
{
digitalWrite(out1, HIGH);
delay(50);
digitalWrite(out1, LOW);
}
else if ((rpm <= 1200)&&(digitalRead(con_clos)==0)) // если обороты больше 1200 то провернуть моторчик в обратную сторону
{
digitalWrite(out2, HIGH);
delay(50);
digitalWrite(out2, LOW);
}
}
void chek_serva2() // вторая программа управления моторчиком аналогичная только для диапазона от 1300 до 1100( потому что двигатель более менее уже устоялся.
{
if(rpm >= 1300)
{
digitalWrite(out1, HIGH);
delay(50);
digitalWrite(out1, LOW);
}
else if ((rpm <= 1100)&&(digitalRead(con_clos)==0))
{
digitalWrite(out2, HIGH);
delay(50);
digitalWrite(out2, LOW);
}
}
void chek_serva3()
{
if(rpm >= 1800)
{
digitalWrite(out1, HIGH);
delay(50);
digitalWrite(out1, LOW);
}
else if ((rpm <= 1350)&&(digitalRead(con_clos)==0))
{
digitalWrite(out2, HIGH);
delay(50);
digitalWrite(out2, LOW);
}
}
void chek_temp() // сюда попадаем если двигатель заглушен
{
if ((digitalRead(con_open) ==0) && (analogRead(temp) > 60)) // если концевик еще не включен(т.е. если заслонка еще не <ОТКРЫЛАСЬ> полностью) а температура <БОЛЬШЕ> 60градусов то <ОТКРЫВАЕМ> на максимум заслонку
{
digitalWrite(out1, HIGH);
delay(100);
digitalWrite(out1, LOW);
}
else if ((digitalRead(con_clos) ==0) && (analogRead(temp) <60) ) // если концевик еще не включен(т.е. если заслонка еще не <ЗАКРЫЛАСЬ> полностью) а температура <МЕНЬШЕ> 60градусов то <ЗАКРЫВАЕМ> на максимум заслонку
{
digitalWrite(out2, HIGH);
delay(100);
digitalWrite(out2, LOW);
}
}
void manual()
{
if((digitalRead(knopka_high)==1) && (digitalRead(con_open)!=1))
{
digitalWrite(out1, HIGH);
digitalWrite(out2, LOW);
}
else if ((digitalRead(knopka_low)==1)&&(digitalRead(con_clos) != 1))
{
digitalWrite(out2, HIGH);
digitalWrite(out1, LOW);
}
else
{
digitalWrite(out2, LOW);
digitalWrite(out1, LOW);
}
}
void RPM1 (){
rpm = (1000000.0/(micros() - microsold))*60;
microsold = micros();
if (rpm <300)
{
rpm = 0;
}
if (microsold > micros())
{
microsold = 0;
}
microsold = micros();
}
#define RPMpin 2 // датчик Холла long microsold = 0; int rpm = 0; int con_open = 7; // концевик полностью открытой заслонки int con_clos = 4; // концевик полностью закрытой заслонки int temp = A3; // датчик температуры int gercon = 11; // геркон на мкпп int out1 = 5; //выход на любой мотор int out2 = 6; // выход на любой мотор int knopka_high = 8; int knopka_low = 9; int knopka_avtomat = 10; void setup() { Serial.begin(9600); digitalWrite(RPMpin, 1); attachInterrupt(0, RPM1, FALLING); // объявляем входом pinMode(con_open, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм pinMode(temp, INPUT); pinMode(con_clos, INPUT); // подтяжку к минусу реализуем аппаратно резистором в 10кОм pinMode(knopka_avtomat, INPUT); pinMode(knopka_low, INPUT); pinMode(knopka_high, INPUT); // объявляем выходом pinMode(out1, OUTPUT); digitalWrite(out1, LOW); pinMode(out2, OUTPUT); digitalWrite(out2, LOW); } void loop() { Serial.print("rpm"); Serial.println(rpm, DEC); delay(500); if (digitalRead(knopka_avtomat)==1) { if (digitalRead(gercon)==0) { avtomat(); } } else { manual(); } } void avtomat() // сама программа { if (analogRead(temp) <= 5) { if (rpm > 100)//если ни одно не верно то запускаем программу управления по температуре { chek_serva3();// третья программа управления моторчиком } } else if ((analogRead(temp) <= 30) && (rpm > 100)) // если температура меньше 30 и двигатель не заглушен то управлять первым режимом управления моторчиком { chek_serva();// первая программа управления моторчиком } else if ((analogRead(temp) <= 60) && (rpm > 100))// если температура меньше 60 и двигатель не заглушен то управлять первым режимом управления моторчиком { chek_serva2();// вторая программа управления моторчиком } else //если ни одно не верно то запускаем программу управления по температуре { chek_temp(); // программа управления по температуре } // тут ми считываем показания с датчиков что бы настроить под машину задержки нам не мешают, даже помогают, что бы моторчик бешано не крутился постоянно Serial.print("temp"); Serial.println(analogRead(temp)); } void chek_serva()// первая программа управления моторчиком { if(rpm >= 1500) // если обороты больше 1500 то провернуть моторчик с небольшой задержкой в одну сторону( сами выберете в какую) { digitalWrite(out1, HIGH); delay(50); digitalWrite(out1, LOW); } else if ((rpm <= 1200)&&(digitalRead(con_clos)==0)) // если обороты больше 1200 то провернуть моторчик в обратную сторону { digitalWrite(out2, HIGH); delay(50); digitalWrite(out2, LOW); } } void chek_serva2() // вторая программа управления моторчиком аналогичная только для диапазона от 1300 до 1100( потому что двигатель более менее уже устоялся. { if(rpm >= 1300) { digitalWrite(out1, HIGH); delay(50); digitalWrite(out1, LOW); } else if ((rpm <= 1100)&&(digitalRead(con_clos)==0)) { digitalWrite(out2, HIGH); delay(50); digitalWrite(out2, LOW); } } void chek_serva3() { if(rpm >= 1800) { digitalWrite(out1, HIGH); delay(50); digitalWrite(out1, LOW); } else if ((rpm <= 1350)&&(digitalRead(con_clos)==0)) { digitalWrite(out2, HIGH); delay(50); digitalWrite(out2, LOW); } } void chek_temp() // сюда попадаем если двигатель заглушен { if ((digitalRead(con_open) ==0) && (analogRead(temp) > 60)) // если концевик еще не включен(т.е. если заслонка еще не <ОТКРЫЛАСЬ> полностью) а температура <БОЛЬШЕ> 60градусов то <ОТКРЫВАЕМ> на максимум заслонку { digitalWrite(out1, HIGH); delay(100); digitalWrite(out1, LOW); } else if ((digitalRead(con_clos) ==0) && (analogRead(temp) <60) ) // если концевик еще не включен(т.е. если заслонка еще не <ЗАКРЫЛАСЬ> полностью) а температура <МЕНЬШЕ> 60градусов то <ЗАКРЫВАЕМ> на максимум заслонку { digitalWrite(out2, HIGH); delay(100); digitalWrite(out2, LOW); } } void manual() { if((digitalRead(knopka_high)==1) && (digitalRead(con_open)!=1)) { digitalWrite(out1, HIGH); digitalWrite(out2, LOW); } else if ((digitalRead(knopka_low)==1)&&(digitalRead(con_clos) != 1)) { digitalWrite(out2, HIGH); digitalWrite(out1, LOW); } else { digitalWrite(out2, LOW); digitalWrite(out1, LOW); } } void RPM1 (){ rpm = (1000000.0/(micros() - microsold))*60; microsold = micros(); if (rpm <300) { rpm = 0; } if (microsold > micros()) { microsold = 0; } microsold = micros(); }вообщем надо создать переменные servoplus и servominus и что бы я их просто вставлял в когда и куда угодно и оно работало)) перепробовал кучу вариантов, никакой так и не подошел... или что то может не так делаю... подскажите пожалуйста..... вообщем пока условие верно что бы действие выполнялось. если не верно до детач, нефиг ей дребезжать. и еще что бы серва выпоняла 1 шаг, прям чуть чуть дергалась и останавливалась..
А не рискуете влезая в отработанную систему управления мотором? Ну как серве на обгоне приспичит карбюратор регулировать?
для этого я геркон на нейтраль поставлю, что бы когда включена скорость , серва ничего не делала и еще кнопку на всякий случай что бы автоматический режим отключался, автоподсос в основном нужен что бы автозапуск поставить, и когда машина стоит и греется. а сяду в машину и могу выключить автоматику и переделать на ручное управление
такое элементарное помочь никто не может?... ну не хватает пока на это мозгов((
AP
Понял, спасибо всем
d13lider, как получилось перейти от сервы к шаговику? можно пример)