Показано с 1 по 10 из 71

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    45
    Сообщений
    82
    Вес репутации
    202

    По умолчанию Как точно вычислить температуру со штатного датчика двигателя?

    Добрый день! Как вычислить точную температуру с термистора на двигателе? Я снял с него параметры падения напряжения с увеличением температуры - они нелинейны. Собственно, об этом говорят и графики зависимости сопротивления от температуры.

    Каким образом (какой формулой) вычислить точное значение температуры в коде ардуины? Линейные приближения дают большую погрешность.
    .................................................. .................................................. ...
    Чтобы вам не читать все, выкладываю здесь результат.
    Подключение к Ардуино ШИМ ключа и остального не рассматриваю, т.к. этого достаточно в других темах. Но если все же будет необходимость - выложу. Система будет затачиваться под мониторинг и регулировку температуры ОЖ, масла ДВС, масла АКПП, масла ГУР и может еще чего.


    PHP код:
    /*
    Программа термоконтроля за системой охлаждения ДВС. Использует плавную регулировку по ШИМ.
    Может применяться и в других проектах, где исходные данные будет выдавать термистор (терморезистор).
    В качестве исходных данных - 1 проводной температурный датчик (термистор(терморезистор))
    двигателя с которого берется информация на штатную приборную панель автомобиля.
    Т.к. датчик имеет нелинейную зависимость сопротивления (падения напряжения),
    то необходима аппроксимация по заранее известным точкам. Чем выше температура,
    тем ниже сопротивление и больше падение напряжения.
    Для достоверной работы программы нужно ввести значения проходящего через датчик напряжения при
    различных температурах, желательно во всем диапазоне его работы.
    За аппроксимацию спасибо SBorovkov.
    */

    #include <MyLiquidCrystalRus.h>
    #include <avr/pgmspace.h>  
    #define Temp1Count 10 //Количество точек аппроксимации
    #define DestinationEngineTemp 90        //Определяем нужную температуру двигателя
    #define EngineTempSensorPin 0 // Аналоговый вход для температурного датчика ОЖ ДВС
    #define PowerVentPin 6 //ШИМ выход на вентиляторы основного радиатора ДВС
    MyLiquidCrystalRus lcd(1211105432); //Используем ЖК дисплей

    //Задаем точки аппроксимации. Первая цифра - разность из 1024 и значения на входе от датчика
    //(сделано для того чтобы развернуть график зависимости и сделать так чтобы с ростом температуры значение увеличивалось)
    //не переводил в напряжение чтобы не морочиться и оперировать целыми числами с достаточной точностью;
    //вторая цифра - значение температуры (заранее измеренное) при данном значении на выходе с датчика.
    uint16_t Temp1[Temp1Count][2PROGMEM = {{0,0}, {471,46}, {655,58}, {713,65}, {772,74}, {775,80}, {850,100}, {864,110}, {874120}, {883130}};

    void setup() {
        
    Serial.begin(9600);
        
    lcd.begin(162);
        
    lcd.setCursor(0,0);
        
    lcd.print("****************");
        
    lcd.setCursor(0,1); 
        
    lcd.print("****************");
        
    delay(1000);
    }

    void loop() {
        
    int i;
        
    int Count 10//Количество значений для усреднения
        
    int In 0//Начальная точка суммирования
        
    int InSrednee//Усредненное значение со входа
        
    int PowerAir;         //Мощность вентиляторов
        
    uint16_t InTemp;  //Входное значение с датчика температуры
        
    uint16_t RealTemp//Расчетное значение реальной температуры
        
    uint16_t InLeftTemp;
        
        
    //Начало цикла усреднения значения
        
    for (0Counti++) {
        
    In In analogRead(EngineTempSensorPin);
        }
        
    //Конец цикла усреднения значения
        
        
    InSrednee In Count//Вычисляем среднее значение

        
    InTemp 1024 InSrednee//Переворачиваем график падения напряжения
        
    i=Temp1Count;
        do
        {
        
    i--;
        
    InLeftTemp=pgm_read_word(&Temp1[i][0]);
        }
        while ((
    i>=0)&&(InTemp<InLeftTemp));
        
    uint16_t InRightTemp=pgm_read_word(&Temp1[i+1][0]);
        
    uint16_t OutLeftTemp=pgm_read_word(&Temp1[i][1]);
        
    uint16_t OutRightTemp=pgm_read_word(&Temp1[i+1][1]);

        
    RealTemp=OutLeftTemp+(OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp); //Вычисление значения реальной температуры

      
    float VoltIn = (5.00 1024.00 InSrednee); //Переводим входные данные к абсолютному значению напряжения для мониторинга
      
      //Если температура входит в определнные значения - запускаем вентиляторы на определенную мощность.
        
    if (RealTemp >= DestinationEngineTemp && RealTemp DestinationEngineTemp 1PowerAir 255 42.50 * (DestinationEngineTemp RealTemp 1);
        else if (
    RealTemp >= DestinationEngineTemp 1PowerAir 255;
        else 
    PowerAir 0;
        
    analogWrite (PowerVentPinPowerAir); //Запускаем выход ШИМ на необходимую мощность    

      
    int PowerVentPercent 100.00/255.00*PowerAir//Вычисляем значение в процентах текущей мощности вентиляторов
      
      //Выводим все что нам нужно на ЖК дисплей
      
    lcd.clear();
      
    lcd.setCursor(0,0);
      
    lcd.print("ВЛТ:");
      
    lcd.setCursor(4,0);
      
    lcd.print(VoltIn); //Входное напряжение с датчика
      
    lcd.setCursor(8,0);
      if (
    VoltIn 2.70) {
      
    lcd.print(" ТМП:");
      
    lcd.setCursor(13,0);
      
    lcd.print("MIN"); //Ниже минимальной точки аппроксимации
      
    }
      else if (
    VoltIn 0.85){
      
    lcd.print(" ТМП:");
      
    lcd.setCursor(13,0);
      
    lcd.print("MAX"); //Выше максимальной точки аппроксимации
      
    }
      else {
      
    lcd.print(" ТМП:");
      
    lcd.setCursor(13,0);
      
    lcd.print(RealTemp); //Аппроксимированная температура
      
    }
      
    lcd.setCursor(0,1);
      
    lcd.print("МОЩНОСТЬ:");
      
    lcd.setCursor(9,1);
      
    lcd.print(PowerVentPercent); //Мощность вентиляторов
      
    lcd.print("%");
      
    delay(250);  

    Код буду постепенно совершенствовать и увеличивать функционал.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	IMG_0274.jpg 
Просмотров:	1873 
Размер:	176.4 Кб 
ID:	9414  
    Последний раз редактировалось paranom; 15.08.2010 в 04:51.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •