Вложений: 1
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_LINES, DOUT_PIN, STR_PIN, CLK_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(" ");
}
}
И такое ощущение.... вернее так и есть... тормозит обработка плавного изменения ШИМ... что за на*?
Re: Как точно вычислить температуру со штатного датчика двигателя?
Там своя кодировка символов. Видимо, цифры имеют нестандартные коды. Найди таблицу символов для своего контроллера.
Re: Как точно вычислить температуру со штатного датчика двигателя?
Цитата:
Сообщение от
SBorovkov
Там своя кодировка символов. Видимо, цифры имеют нестандартные коды. Найди таблицу символов для своего контроллера.
Не согласен с предположением, т.к. в параллельном выводе на дисплей - все выводится нормально. Цифры в текстовом виде тоже выводятся нормально. Вопрос именно в синтаксисе данной библиотеки, как мне кажется, и именно в выводе переменных.
Re: Как точно вычислить температуру со штатного датчика двигателя?
Тогда второе предположение - lcd.print принимает в качестве параметра строку, а не int.
Re: Как точно вычислить температуру со штатного датчика двигателя?
Цитата:
Сообщение от
SBorovkov
Тогда второе предположение - lcd.print принимает в качестве параметра строку, а не int.
Странно. Ладно, буду вечером еще разбираться.
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_LINES, DOUT_PIN, STR_PIN, CLK_PIN);
//*********************Параметры для работы термоконтроля ОЖ двигателя
#define EngineTemp1Count 14 //Количество точек аппроксимации
#define DestinationEngineTemp 90 //Определяем нужную температуру двигателя
#define EngineTempSensorPin 0 // Аналоговый вход для температурного датчика ОЖ ДВС
#define EnginePowerVentPin 6 //ШИМ выход на вентиляторы основного радиатора ДВС
//Задаем точки аппроксимации. Первая цифра - р\азность из 1024 и значения на входе от датчика
//(сделано для того чтобы развернуть график зависимости и сделать так чтобы с ростом температуры значение увеличивалось)
//не переводил в напряжение чтобы не морочиться и оперировать целыми числами с достаточной точностью;
//вторая цифра - значение температуры (заранее измеренное) при данном значении на выходе с датчика.
uint16_t EngineTemp1[EngineTemp1Count][2] PROGMEM = {{0,0}, {471,46}, {635,56}, {702,64}, {723,71}, {729,75}, {764,80}, {793,85}, {811, 90}, {836, 95}, {862, 102}, {872, 110}, {882, 120}, {890, 130}};
//************************Процедуры по таймеру*************************
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(EngineVoltIn, buf, 10)); //Входное напряжение с датчика
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(EngineRealTemp, buf, 10)); //Аппроксимированная температура
lcd.printIn(" ");
}
lcd.cursorTo(2,0);
lcd.printIn("POWER:");
lcd.cursorTo(2,9);
lcd.printIn(itoa(EnginePowerVentPercent, buf, 10)); //Мощность вентиляторов
lcd.printIn(" ");
lcd.cursorTo(2,12);
lcd.printIn("%");
lcd.cursorTo(2,13);
lcd.printIn(itoa(EngineTargetVentPercent, buf, 10)); //Заданная мощность вентиляторов
lcd.printIn(" ");
}
}
Я так понял что этой библиотеке обязательно нужно преобразовать численное значение в символы... маразм... ну все бы ничего, да не могу вывести таким способом переменную EngineVoltIn типа float... вернее он выводит но без десятичных значений - только целое число. Как это победить? И обновляется информация на дисплее крайне медленно... ШИМ набирает с 0 до 100% за 2-3 минуты ))))) хотя должен за 2-3 секунды, а то и быстрее... Если закомментить вывод инфы на ЖК, то так и происходит. Что за грабли?
Re: Как точно вычислить температуру со штатного датчика двигателя?
0. Повесь регулировку ШИМ на таймер.
Тормозит вывод потому, что:
1. сдвиговый регистр не очень предназначен для быстрого переключения отдельных выводов. Думаю, что было бы лучше использовать хотя бы 4 ноги для управления индикатором (отдельный вывод для тактовой ноги индикатора, если такая есть).
2. В торможении видимо ОЧЕНЬ сильно участвует стандартная функция shiftOut, реализованная через стандартную digitalWrite. Запись одного бита в 595-й регистр - это три digitalWrite, каждый из которых выполняется порядка 60 тактов. Запись байта - это 26 вызовов digitalWrite. Запись одной команды в LCD - 6 shiftOut...
Короче такие тормоза из-за реализации данной библиотеки. Если бы ее просто переписать с использованием более правильных функций управления ногами, ускорилось бы все раз в 20...
Re: Как точно вычислить температуру со штатного датчика двигателя?
Цитата:
Сообщение от
SBorovkov
0. Повесь регулировку ШИМ на таймер.
Тормозит вывод потому, что:
1. сдвиговый регистр не очень предназначен для быстрого переключения отдельных выводов. Думаю, что было бы лучше использовать хотя бы 4 ноги для управления индикатором (отдельный вывод для тактовой ноги индикатора, если такая есть).
2. В торможении видимо ОЧЕНЬ сильно участвует стандартная функция shiftOut, реализованная через стандартную digitalWrite. Запись одного бита в 595-й регистр - это три digitalWrite, каждый из которых выполняется порядка 60 тактов. Запись байта - это 26 вызовов digitalWrite. Запись одной команды в LCD - 6 shiftOut...
Короче такие тормоза из-за реализации данной библиотеки. Если бы ее просто переписать с использованием более правильных функций управления ногами, ускорилось бы все раз в 20...
Понял, спасибо. Буду думать. Попробую отдельно протестировать библиотеку на скорость вывода изображения. Из этого буду принимать решение.
Вложений: 1
Re: Как точно вычислить температуру со штатного датчика двигателя?
Полное г** эта библиотека... протестировал скорость вывода на ЖК - разочарован. Думаю при последовательном выводе должно работать быстрее гораздо. Вернулся на параллельное подключение, но освободил ШИМ ноги путем переноса на другие.
Работа продолжается, поставил стабилизатор на LM2575 и силовой ШИМ на базе IRLU8256.
Завтра попробую запустить это дело на машине на реальный вентилятор. Побаиваюсь только за макетную плату... выдержит ли ток ампер 10, хотя бы пару минут? :)
Re: Как точно вычислить температуру со штатного датчика двигателя?
Всем привет! Тесты пройдены успешно. Рисую печатную плату под силовые ключи, т.к. их планирую убрать под капот чтобы ничего не свистело в салоне. Думаю, за выходные будет результат.