настройка шим по датчику
- Войдите на сайт для отправки комментариев
Вс, 09/09/2018 - 01:33
всем доброго времени
самому в голову ни чего не приходит как добавить
int mafvih = 9; // выход
int mafvhod = 3; // потенциометр подключен к выходу 3
int val = 0; // переменная для хранения значения входного сигнала маф
int liamda =2; // вход лябды
int valL = 0; // переменная для хранения сигнала лямбды
void setup()
{
pinMode(mafvhod, INPUT); // установка порта на выход
}
void loop()
{
val = analogRead(mafvhod); // считываем значение с порта, подключенному к потенциометру
analogWrite(mafvih, val / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
valL = analogRead(liamda); // считываем значение с порта лямбды
if (valL <= 82)
{
}
else if (valL >= 123)
{
}
else
{
}
}
смысл такой
на mafvih вышло значение например167
форсунка брызнула определенное количество топлива оно сгорело
датчик liamda померила смесь выхлопа показалнапример 140
нужно чтоб при следующем цикле на mafvih пришло на 1 меньше тоесть 166
liamda опять мериет показывает 124
значит опять уберает 1 с mafvih
или если liamda померила например 60
то mafvih должен прибавить 1
и так далее
я понимаю что для этого надо написать отдельную функцию которая будет срабатывать по условию liamda
всем доброго времени
самому в голову ни чего не приходит как добавить
int mafvih = 9; // выход int mafvhod = 3; // потенциометр подключен к выходу 3 int val = 0; // переменная для хранения значения входного сигнала маф int liamda =2; // вход лябды int valL = 0; // переменная для хранения сигнала лямбды void setup() { pinMode(mafvhod, INPUT); // установка порта на вход } void loop() { val = analogRead(mafvhod); // считываем значение с порта, подключенному к потенциометру analogWrite(mafvih, val / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255 valL = analogRead(liamda); // считываем значение с порта лямбды if (valL <= 82) { } else if (valL >= 123) { } else { } }смысл такой
на mafvih вышло значение например167
форсунка брызнула определенное количество топлива оно сгорело
датчик liamda померила смесь выхлопа показалнапример 140
нужно чтоб при следующем цикле на mafvih пришло на 1 меньше тоесть 166
liamda опять мериет показывает 124
значит опять уберает 1 с mafvih
или если liamda померила например 60
то mafvih должен прибавить 1
и так далее
я понимаю что для этого надо написать отдельную функцию которая будет срабатывать по условию liamda
1. команда analogRead без программного обработчика - (фильтра усреднения) - полная лажа. Будут прилетать случайные помехи, которые будут портить картину. Рекомендую использовать алгоритм кольцевого буфера.
смысл такой
на mafvih вышло значение например167
форсунка брызнула определенное количество топлива оно сгорело
датчик liamda померила смесь выхлопа показалнапример 140
нужно чтоб при следующем цикле на mafvih пришло на 1 меньше тоесть 166
liamda опять мериет показывает 124
значит опять уберает 1 с mafvih
или если liamda померила например 60
то mafvih должен прибавить 1
и так далее
я понимаю что для этого надо написать отдельную функцию которая будет срабатывать по условию liamda
Вы не можете написать на Си ровно потому, что не можете сформулировать, что Вам нужно, по-русски.
Соответственно, и помочь Вам проблематично потому, что непонятно, чего Вы хотите.
Постарайтесь подробно (без всяких "например") написать по русски, как должна работать программа. И после того, как Вы это сделаете, перевести с русского на Си окажется совершенно элементарным делом.
PS. И еще: предложения принято начинать с заглавной буквы и заканчивать точкой. Если Вы не измените Ваш крайне неряшливый стиль на что-то более вменяемое, компилятор никогда не сможет понять, чего Вы хотите. Впрочем, окружеющие - тоже.
Я понял я,постараюсь сформулировать правильно .
Спасибо .
есть вторая часть прибора которая будет регулировать количество топлива в зависимости от сигнала с (В.К.)
должно получится так
Доброго времени.
Написал скетч почти всеработает как надо но есть одно но и не пойму что не учел.
[code] int DRVPin = A0; // пин считывания датчика расхода воздуха (Д.Р.В.) int DKPin = A1; // пин считывания датчика кислорода (Д.К.) int VKPin = 9; // пин выхода корекции (В.К.) int valDRV = 0; // переменная для хранения сигнала сдатчика расхода воздуха int valDK = 0; // переменная для хранения сигнала датчика кислорода void setup() { Serial.begin(9600); pinMode(DRVPin, INPUT); //назначаю вход pinMode(DKPin, INPUT); //назначаю вход pinMode(VKPin, OUTPUT); //назначаю выход } void loop() { valDRV = analogRead(DRVPin); // считываю напряжение с (Д.Р.В.) valDRV = map(valDRV,0,1023,0,255); // перевел в map float newVK = valDRV + valVK(); // расчет выходного сигнала на (В.К.) analogWrite (VKPin,newVK); //выдал шим на (В.К.) начало гореть топливо valDK = analogRead(DKPin); //считываю напряжение с (Д.К.) "померил сгоревшее топливо" проверяю все ли сгорело или нет Serial.print("dachikRV = "); Serial.print(valDRV); Serial.print("\t vihod_kor = "); Serial.print(newVK); Serial.print("\t dachikO2 = "); Serial.println(valDK); delay(500); } int valVK() // функция добавления и вычитания { if(valDK < 93) // если в отработанных газах топлива мало будет напряжение от 0,02в до 0,45в,нужно добавить на (В.К.) 1 и померить еще раз пока на(Д.К.) установится 0,46в { return 1; } else if(valDK > 106) // если в отработанных газах топлива много будет напряжение от 0,5в до 0,98в,нужно убавить на (В.К.) 1 и померить еще раз пока на(Д.К.) не установится 0,49в { return -1; } else // если в отработаных газах все в норме напряжение установится от 0,46в до 0,49в ни чего на делаем , а запускаем цикл по новой { return 0; } } [/code]По моему замыслу корекция должна происходить до тех пор пока не установится диапозон напряжения на Датчике Кислорода (0,46до 0,49).
А получается что корекция происходит один раз в момент перехода в большую или меньшую сторону .
Прошу помощи!
Лямбда зонд, (старый, пороговый, циркониевый, бошевский) это источник напряжения (гальванический элемент).
Выдаваемое им напряжение изменяется скачком.
Бедная смесь 0.2 Вольта, богатая 0.9 Вольта.
Поэтому есть смысл использовать компаратор с порогом 0.4-0.5 Вольта с гистерезисом 0.1.
Тогда уходим от аналогового входа на цифровой и пока там единица уменьшаем время впрыска с каким-то шагом, а когда там ноль- увеличиваем.
А диапазон (0,46до 0,49) вы там не установите никогда.
Для этого придумали аналоговый датчик кислорода.
Добрый вечер . У меня на лямбде весь диапозон как мне надо
я сегодня проверил
Добрый вечер , я учел все что вы мне написали, написал на бумаге что мне нужно по пунктам и вот что получилось .
[code] int DRVPin = A0; // пин считывания датчика расхода воздуха (Д.Р.В.) int DKPin = A1; // пин считывания датчика кислорода (Д.К.) int VKPin = 9; // пин выхода корекции (В.К.) int valDRV = 0; // переменная для хранения сигнала сдатчика расхода воздуха int valDK = 0; // переменная для хранения сигнала датчика кислорода int valVK = 1; int x =1; void setup() { Serial.begin(9600); pinMode(DRVPin, INPUT); //назначаю вход pinMode(DKPin, INPUT); //назначаю вход pinMode(VKPin, OUTPUT); //назначаю выход } void loop() { valDRV = analogRead(DRVPin); // считываю напряжение с (Д.Р.В.) valDRV = map(valDRV,0,1023,0,255); // перевел в map int newVK = valDRV + valVK;// расчет выходного сигнала на (В.К.) newVK = constrain(newVK,0,255); analogWrite (VKPin,newVK); //выдал шим на (В.К.) начало гореть топливо valDK = analogRead(DKPin); //считываю напряжение с (Д.К.) "померил сгоревшее топливо" if(valDK < 93) // если в отработанных газах топлива мало будет напряжение от 0,02в до 0,45в,нужно добавить на (В.К.) 1 и померить еще раз пока на(Д.К.) установится 0,46в { valVK= ++x ; } else if(valDK > 106) // если в отработанных газах топлива много будет напряжение от 0,5в до 0,98в,нужно убавить на (В.К.) 1 и померить еще раз пока на(Д.К.) не установится 0,49в { valVK= --x ; } else // если в отработаных газах все в норме напряжение установится от 0,46в до 0,49в ни чего на делаем , а запускаем цикл по новой { } Serial.print("dachikRV = "); Serial.print(valDRV); Serial.print("\t vihod_kor = "); Serial.print(newVK); Serial.print("\t dachikO2 = "); Serial.println(valDK); } [/code]