Страница 6 из 8 ПерваяПервая 12345678 ПоследняяПоследняя
Показано с 51 по 60 из 71
  1. #51
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    44
    Сообщений
    82
    Вес репутации
    187

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

    Ребята, перешел на 3 проводную библиотеку работы с ЖК. Не получается выводить переменные на ЖК. Ниже код и фото того что на дисплее. Что за синтаксис должен быть?

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

    #include <Metro.h> //Библиотека регулярных действий по интервалу времени
    #include <LCD3Wire.h>
    #include <avr/pgmspace.h>  //Подключаем макрос PROGMEM

    #define LCD_LINES 2  // number of lines in your display
    #define DOUT_PIN  11  // Dout pin
    #define STR_PIN   12  // Strobe pin
    #define CLK_PIN   10  // Clock pin

    //create object to control an LCD.  
    LCD3Wire lcd LCD3Wire(LCD_LINESDOUT_PINSTR_PINCLK_PIN); 

    ******************* 
    ЛИШНЕЕ УБРАЛ*******************

    //***********************Выводим все что нам нужно на ЖК дисплей
    if (LCDoutMetro.check() == 1){ 
    //  lcd.clear();
      
    lcd.cursorTo(1,0);
      
    lcd.printIn("VLT:");
      
    lcd.cursorTo(1,4);
      
    lcd.print(EngineVoltIn); //Входное напряжение с датчика
      
    lcd.cursorTo(1,8);
      if (
    EngineVoltIn 2.70) {
      
    lcd.printIn("*TMP:");
      
    lcd.cursorTo(1,13);
      
    lcd.printIn("MIN"); //Ниже минимальной точки аппроксимации
      
    }
      else if (
    EngineVoltIn 0.65){
      
    lcd.printIn("*TMP:");
      
    lcd.cursorTo(1,13);
      
    lcd.printIn("MAX"); //Выше максимальной точки аппроксимации
      
    }
      else {
      
    lcd.printIn("*TMP:");
      
    lcd.cursorTo(1,13);
      
    lcd.print(EngineRealTemp); //Аппроксимированная температура
      
    lcd.printIn("  ");    
      }
      
    lcd.cursorTo(2,0);
      
    lcd.printIn("POWER:");
      
    lcd.cursorTo(2,9);
      
    lcd.print(EnginePowerVentPercent); //Мощность вентиляторов
      
    lcd.printIn("  ");  
      
    lcd.cursorTo(2,12);  
      
    lcd.printIn("%");
      
    lcd.cursorTo(2,13);
      
    lcd.print(EngineTargetVentPercent); //Заданная мощность вентиляторов
      
    lcd.printIn("  ");    
    }  


    И такое ощущение.... вернее так и есть... тормозит обработка плавного изменения ШИМ... что за на*?
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	IMG_0199[1].jpg 
Просмотров:	309 
Размер:	146.7 Кб 
ID:	9446  
    С уважением, Дмитрий.
    тел. 8 9I6 855 7Ч 95

  2. #52
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

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

    Там своя кодировка символов. Видимо, цифры имеют нестандартные коды. Найди таблицу символов для своего контроллера.

  3. #53
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    44
    Сообщений
    82
    Вес репутации
    187

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

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Там своя кодировка символов. Видимо, цифры имеют нестандартные коды. Найди таблицу символов для своего контроллера.
    Не согласен с предположением, т.к. в параллельном выводе на дисплей - все выводится нормально. Цифры в текстовом виде тоже выводятся нормально. Вопрос именно в синтаксисе данной библиотеки, как мне кажется, и именно в выводе переменных.
    С уважением, Дмитрий.
    тел. 8 9I6 855 7Ч 95

  4. #54
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

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

    Тогда второе предположение - lcd.print принимает в качестве параметра строку, а не int.

  5. #55
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    44
    Сообщений
    82
    Вес репутации
    187

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

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Тогда второе предположение - lcd.print принимает в качестве параметра строку, а не int.
    Странно. Ладно, буду вечером еще разбираться.
    С уважением, Дмитрий.
    тел. 8 9I6 855 7Ч 95

  6. #56
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    44
    Сообщений
    82
    Вес репутации
    187

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

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

    #include <Metro.h> //Библиотека регулярных действий по интервалу времени
    #include <LCD3Wire.h>
    #include <avr/pgmspace.h>  //Подключаем макрос PROGMEM

    #define LCD_LINES 2  // number of lines in your display
    #define DOUT_PIN  11  // Dout pin
    #define STR_PIN   12  // Strobe pin
    #define CLK_PIN   10  // Clock pin

    //create object to control an LCD.  
    LCD3Wire lcd LCD3Wire(LCD_LINESDOUT_PINSTR_PINCLK_PIN); 

    //*********************Параметры для работы термоконтроля ОЖ двигателя
    #define EngineTemp1Count 14 //Количество точек аппроксимации
    #define DestinationEngineTemp 90        //Определяем нужную температуру двигателя
    #define EngineTempSensorPin 0 // Аналоговый вход для температурного датчика ОЖ ДВС
    #define EnginePowerVentPin 6 //ШИМ выход на вентиляторы основного радиатора ДВС
    //Задаем точки аппроксимации. Первая цифра - р\азность из 1024 и значения на входе от датчика
    //(сделано для того чтобы развернуть график зависимости и сделать так чтобы с ростом температуры значение увеличивалось)
    //не переводил в напряжение чтобы не морочиться и оперировать целыми числами с достаточной точностью;
    //вторая цифра - значение температуры (заранее измеренное) при данном значении на выходе с датчика.
    uint16_t EngineTemp1[EngineTemp1Count][2PROGMEM = {{0,0}, {471,46}, {635,56}, {702,64}, {723,71}, {729,75}, {764,80}, {793,85}, {81190}, {83695}, {862102}, {872110}, {882120}, {890130}};
    //************************Процедуры по таймеру*************************
    Metro PWMengineMetro Metro(10);  //Плавное изменение мощности вентиляторов каждые ХХ миллисекунд 
    Metro LCDoutMetro Metro(10);   //Выводим информацию на ЖК каждые ХХ миллисекунд 

    ....................................................лишнее убрали........................

    //***********************Выводим все что нам нужно на ЖК дисплей
    if (LCDoutMetro.check() == 1){ 
    //  lcd.clear();
      
    lcd.cursorTo(1,0);
      
    lcd.printIn("VLT:");
      
    lcd.cursorTo(1,4);
      
    char buf[10];
      
    lcd.printIn(itoa(EngineVoltInbuf10)); //Входное напряжение с датчика
      
    lcd.cursorTo(1,8);
      if (
    EngineVoltIn 2.70) {
      
    lcd.printIn("*TMP:");
      
    lcd.cursorTo(1,13);
      
    lcd.printIn("MIN"); //Ниже минимальной точки аппроксимации
      
    }
      else if (
    EngineVoltIn 0.65){
      
    lcd.printIn("*TMP:");
      
    lcd.cursorTo(1,13);
      
    lcd.printIn("MAX"); //Выше максимальной точки аппроксимации
      
    }
      else {
      
    lcd.printIn("*TMP:");
      
    lcd.cursorTo(1,13);
      
    lcd.printIn(itoa(EngineRealTempbuf10)); //Аппроксимированная температура
      
    lcd.printIn("  ");    
      }
      
    lcd.cursorTo(2,0);
      
    lcd.printIn("POWER:");
      
    lcd.cursorTo(2,9);
      
    lcd.printIn(itoa(EnginePowerVentPercentbuf10)); //Мощность вентиляторов
      
    lcd.printIn("  ");  
      
    lcd.cursorTo(2,12);  
      
    lcd.printIn("%");
      
    lcd.cursorTo(2,13);
      
    lcd.printIn(itoa(EngineTargetVentPercentbuf10)); //Заданная мощность вентиляторов
      
    lcd.printIn("  ");    
    }  

    Я так понял что этой библиотеке обязательно нужно преобразовать численное значение в символы... маразм... ну все бы ничего, да не могу вывести таким способом переменную EngineVoltIn типа float... вернее он выводит но без десятичных значений - только целое число. Как это победить? И обновляется информация на дисплее крайне медленно... ШИМ набирает с 0 до 100% за 2-3 минуты ))))) хотя должен за 2-3 секунды, а то и быстрее... Если закомментить вывод инфы на ЖК, то так и происходит. Что за грабли?
    С уважением, Дмитрий.
    тел. 8 9I6 855 7Ч 95

  7. #57
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

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

    0. Повесь регулировку ШИМ на таймер.

    Тормозит вывод потому, что:
    1. сдвиговый регистр не очень предназначен для быстрого переключения отдельных выводов. Думаю, что было бы лучше использовать хотя бы 4 ноги для управления индикатором (отдельный вывод для тактовой ноги индикатора, если такая есть).
    2. В торможении видимо ОЧЕНЬ сильно участвует стандартная функция shiftOut, реализованная через стандартную digitalWrite. Запись одного бита в 595-й регистр - это три digitalWrite, каждый из которых выполняется порядка 60 тактов. Запись байта - это 26 вызовов digitalWrite. Запись одной команды в LCD - 6 shiftOut...

    Короче такие тормоза из-за реализации данной библиотеки. Если бы ее просто переписать с использованием более правильных функций управления ногами, ускорилось бы все раз в 20...

  8. #58
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    44
    Сообщений
    82
    Вес репутации
    187

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

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    0. Повесь регулировку ШИМ на таймер.

    Тормозит вывод потому, что:
    1. сдвиговый регистр не очень предназначен для быстрого переключения отдельных выводов. Думаю, что было бы лучше использовать хотя бы 4 ноги для управления индикатором (отдельный вывод для тактовой ноги индикатора, если такая есть).
    2. В торможении видимо ОЧЕНЬ сильно участвует стандартная функция shiftOut, реализованная через стандартную digitalWrite. Запись одного бита в 595-й регистр - это три digitalWrite, каждый из которых выполняется порядка 60 тактов. Запись байта - это 26 вызовов digitalWrite. Запись одной команды в LCD - 6 shiftOut...

    Короче такие тормоза из-за реализации данной библиотеки. Если бы ее просто переписать с использованием более правильных функций управления ногами, ускорилось бы все раз в 20...
    Понял, спасибо. Буду думать. Попробую отдельно протестировать библиотеку на скорость вывода изображения. Из этого буду принимать решение.
    С уважением, Дмитрий.
    тел. 8 9I6 855 7Ч 95

  9. #59
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    44
    Сообщений
    82
    Вес репутации
    187

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

    Полное г** эта библиотека... протестировал скорость вывода на ЖК - разочарован. Думаю при последовательном выводе должно работать быстрее гораздо. Вернулся на параллельное подключение, но освободил ШИМ ноги путем переноса на другие.

    Работа продолжается, поставил стабилизатор на LM2575 и силовой ШИМ на базе IRLU8256.
    Завтра попробую запустить это дело на машине на реальный вентилятор. Побаиваюсь только за макетную плату... выдержит ли ток ампер 10, хотя бы пару минут?
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	IMG_0214[1].jpg 
Просмотров:	353 
Размер:	143.2 Кб 
ID:	9480  
    С уважением, Дмитрий.
    тел. 8 9I6 855 7Ч 95

  10. #60
    Пользователь
    Регистрация
    21.07.2010
    Возраст
    44
    Сообщений
    82
    Вес репутации
    187

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

    Всем привет! Тесты пройдены успешно. Рисую печатную плату под силовые ключи, т.к. их планирую убрать под капот чтобы ничего не свистело в салоне. Думаю, за выходные будет результат.
    С уважением, Дмитрий.
    тел. 8 9I6 855 7Ч 95

Страница 6 из 8 ПерваяПервая 12345678 ПоследняяПоследняя

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

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

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

Ваши права

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