Управление вентилятором

Слава325

✩✩✩✩✩✩✩
15 Апр 2022
1
0
Добрый день.Идея управлять вентилятором охлаждения ВАЗ 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);
}
 

bym34rus

✩✩✩✩✩✩✩
20 Май 2022
1
0
Данная тема для меня очень актуальна. Почему вы берете температуру с АЦП? Если брать напрямую с К линии и в зависимости от полученных данных запускать реле?
 

rGlory

★✩✩✩✩✩✩
11 Май 2021
200
20
А почему реле? Если поставить мосфет, то вентилятором можно управлять плавно, чтобы не шумел без надобности.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
531
131
Ради такого дела, можно прикинуть "пару" проводов к отдельному терморезистору, читать показания с него и управлять вентилятором, как писалось выше, через полевик на две( как везде), а может и больше скоростей. В общем, тут полет фантазии безграничный. Читай: каждый кодит, как он хочет.

Если брать напрямую с К линии
Только вот кто возьмётся за написание программы общения ардуино и января?
 
Изменено: