настройка шим по датчику

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

всем доброго времени 

самому в голову ни чего не приходит как добавить 





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

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

yrik8407 пишет:

всем доброго времени 

самому в голову ни чего не приходит как добавить 





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

Mikhail86
Offline
Зарегистрирован: 01.08.2016

1. команда analogRead без программного обработчика - (фильтра усреднения) - полная лажа. Будут прилетать случайные помехи, которые будут портить картину. Рекомендую использовать алгоритм кольцевого буфера. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yrik8407 пишет:

смысл такой 

на mafvih вышло значение например167

форсунка брызнула определенное количество топлива оно сгорело 

датчик liamda померила смесь выхлопа показалнапример 140 

нужно чтоб при следующем цикле на mafvih пришло на 1 меньше тоесть 166

liamda опять мериет показывает 124 

значит опять уберает 1 с mafvih  

или если liamda померила например 60 

то mafvih должен прибавить 1 

и так далее 

я понимаю что для этого надо написать отдельную  функцию которая будет срабатывать по условию liamda

Вы не можете написать на Си ровно потому, что не можете сформулировать, что Вам нужно, по-русски.

Соответственно, и помочь Вам проблематично потому, что непонятно, чего Вы хотите.

Постарайтесь подробно (без всяких "например") написать по русски, как должна работать программа. И после того, как Вы это сделаете, перевести с русского на Си окажется совершенно элементарным делом.

 

PS. И еще: предложения принято начинать с заглавной буквы и заканчивать точкой. Если Вы не измените Ваш крайне неряшливый стиль на что-то более вменяемое, компилятор никогда не сможет понять, чего Вы хотите. Впрочем, окружеющие - тоже.

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

Я понял я,постараюсь сформулировать правильно .
Спасибо .

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016
[code]
//пин считывания датчика расхода воздуха (Д.Р.В.)
//пин считывания датчика кислорода (Д.К.)
//пин выхода корекции (В.К.)
//переменная для хранения сигнала сдатчика расхода воздуха 
//переменная для хранения сигнала датчика кислорода
//переменная для хранения выхода корекции
//померил из (Д.Р.В.) перевел в map
//выдал шим на (В.К.) начало гореть топливо 
//(Д.К.) померил сгоревшее топливо 
//если в отработанных газах топлива мало будет напряжение от 0,02в до 0,45в,нужно добавить на (В.К.) 1 и померить еще раз пока на
(Д.К.) не установится 0,46в
//если в отработанных газах топлива много будет напряжение от 0,5в до 0,98в,нужно убавить на (В.К.) 1 и померить еще раз пока на
(Д.К.) не установится 0,49в  
//если в отработаных газах все в норме напряжение установится от 0,46в до 0,49в ни чего на делаем , а запускаем весь цикл по новой
[/code]

есть вторая часть прибора которая будет регулировать количество топлива в зависимости от сигнала с (В.К.)

должно получится так

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

Доброго времени.

Написал скетч почти всеработает как надо но есть одно но и не пойму что не учел.

[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).

А получается что корекция происходит один раз в момент перехода в большую или меньшую сторону .

Прошу помощи!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Лямбда зонд, (старый, пороговый, циркониевый, бошевский) это источник напряжения (гальванический элемент).
Выдаваемое им напряжение изменяется скачком.
Бедная смесь 0.2 Вольта, богатая 0.9 Вольта.
Поэтому есть смысл использовать компаратор с порогом 0.4-0.5 Вольта с гистерезисом 0.1.
Тогда уходим от аналогового входа на цифровой и пока там единица уменьшаем время впрыска с каким-то шагом, а когда там ноль- увеличиваем.
А диапазон (0,46до 0,49) вы там не установите никогда.
Для этого придумали аналоговый датчик кислорода.

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

Добрый вечер . У меня на лямбде весь диапозон как мне надо
я сегодня проверил

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

Добрый вечер , я учел все что вы мне написали, написал на бумаге что мне нужно по пунктам и вот что получилось .

[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]