Добрый день.Идея управлять вентилятором охлаждения ВАЗ 2115 по каналу ацп датчика блока управления январь 7.2.Эксперементальным путем удалось выяснить,что показания датчика сильно шумят.Решено было применить упрощенное уравнение Калмана .Включение вентилятора получилось приблизительно на 118 единицах ацп.Получилься непредвиденный эффект,если машина холодная,при включении ардуино ацп начинает счет с нуля и реле включаеться на несколько секунд.Какие бывают методы задержать включение реле пока программа запускаеться.У меня ничего неполучилось единственное что выяснил что это из-за уравнения Калмана,который начинает отсчет с 0, что и являеться как будто двигатель горячий. Подставить переменным первоначальные значение не удается.
C++:
//Управление вентилятором ВАЗ-2115
#include "GyverRelay.h"
#include <Wire.h> //библиотека протокола i2c
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
GyverRelay regulator(NORMAL);// установка, гистерезис, направление регулирования
//переменные дл калмана
float varVolt = 25;// среднее отклонение
float varProcess = 0.001;//скорость реакции
float Pc = 0.0;
float G = 0.0;
float P = 1.0;
float Xp = 0.0;
float Zp = 0.0;
float Xe = 0.0;
int acp = 0;//переменная ацп температуры
boolean vent = 0;//переменная реле включения вентилятора охлаждения
void setup() {
Wire.begin();
delay(10);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
pinMode(3, INPUT);
pinMode(8,OUTPUT);
regulator.setpoint = 118; // установка (буду регулировать по ацп температуры ваз2114 январь 7.2)
regulator.hysteresis = 3; // ширина гистерезиса
regulator.k = 0; // коэффициент обратной связи (подбирается по факту)
}
void loop() {
acp = analogRead(A3);
int filtered_acp = filter(acp);
boolean vent = digitalRead (8);
regulator.input = filtered_acp; // сообщаем регулятору текущую температуру
digitalWrite(8, regulator.getResult()); // отправляем на реле (ОС работает по своему таймеру)
//lcd.setCursor(7,0);
//lcd.print(acp);
//if(acp<1000)lcd. print(" ");
lcd.setCursor(7,0);
lcd.print(filtered_acp);
if(filtered_acp<1000)lcd. print(" ");
lcd.setCursor(7,1);
if(vent<1)lcd.print("ON ");
else lcd.print("OFF");
}
float filter(float val){// функция фильтрации
Pc = P + varProcess;
G = Pc/(Pc + varVolt);
P = (1-G)*Pc;
Xp = Xe;
Zp = Xp;
Xe = G*(val-Zp)+Xp;// фильтрованное значение
return (Xe);
}