Роторный компрессометр своими руками |
Здравствуйте, гость ( Вход | Регистрация )
Роторный компрессометр своими руками |
9.9.2014, 12:40
Сообщение
#81
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 13 Регистрация: 27.3.2014 Пользователь №: 5780 |
Всем спасибо за разъяснения!
По ссылке результаты замеров на трех машинах RX-8. https://drive.google.com/folderview?id=0B9q...amp;usp=sharing P.s. не понял в чем вопрос про подключение к обд... |
|
|
9.9.2014, 6:27
Сообщение
#82
|
|
Team member Группа: Пользователи Сообщений: 390 Регистрация: 17.7.2013 Из: Красноярск Пользователь №: 5398 |
потому что надо было внимательнее прочитать второе сообщение в теме. Самая последняя строчка: Формула: rpm = 180 / t. откуда взялась цифра 60? 180/0.852 = 211 оборотов в минуту. очевидно же что RX-8. 60/т если измерять время между соседними пиками(секциями камеры) 180/т если мерим время между 1 и 4 пиком (т.е. все три секции) |
|
|
9.9.2014, 4:25
Сообщение
#83
|
|
GOLD Группа: Пользователи Сообщений: 1604 Регистрация: 9.1.2011 Из: vl Пользователь №: 4086 |
время (сек)_______6.217_____7.069 подсчет оборотов 60/(7.069-6.217)=60/0.852=70 об/мин, как-то маловато Собираем авто и пробуем выполнить замер оборотов по OBD, получается 210 об/мин. Теперь вопрос: В чем трабл, почему по графику такие обороты? Я не правильно рассчитал обороты или что-то не так в замере? файл замера: https://drive.google.com/file/d/0B9qWdrDLHR...dit?usp=sharing потому что надо было внимательнее прочитать второе сообщение в теме. Самая последняя строчка: Формула: rpm = 180 / t. откуда взялась цифра 60? 180/0.852 = 211 оборотов в минуту. к ОБД чем подключаетесь?! очевидно же что RX-8. Сообщение отредактировал vl-alexander - 9.9.2014, 4:25 |
|
|
8.9.2014, 12:49
Сообщение
#84
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 13 Регистрация: 27.3.2014 Пользователь №: 5780 |
Надеюсь за флуд не сочтут. Подключение к OBDII китайским адаптером на ELM327 + телефон на андройд с программой Torque
|
|
|
8.9.2014, 11:15
Сообщение
#85
|
|
GOLD Группа: Пользователи Сообщений: 1032 Регистрация: 8.2.2009 Из: Красноярск Пользователь №: 2857 |
Приветствую! Провел на днях замер на авто, и возник вопрос. По графику определяю давление в секциях ________________1-я пика___4-я пика давление (кг/см2)__6.619_____6.777 время (сек)_______6.217_____7.069 подсчет оборотов 60/(7.069-6.217)=60/0.852=70 об/мин, как-то маловато Собираем авто и пробуем выполнить замер оборотов по OBD, получается 210 об/мин. Теперь вопрос: В чем трабл, почему по графику такие обороты? Я не правильно рассчитал обороты или что-то не так в замере? файл замера: https://drive.google.com/file/d/0B9qWdrDLHR...dit?usp=sharing к ОБД чем подключаетесь?! |
|
|
8.9.2014, 9:30
Сообщение
#86
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 13 Регистрация: 27.3.2014 Пользователь №: 5780 |
Приветствую!
Провел на днях замер на авто, и возник вопрос. По графику определяю давление в секциях ________________1-я пика___4-я пика давление (кг/см2)__6.619_____6.777 время (сек)_______6.217_____7.069 подсчет оборотов 60/(7.069-6.217)=60/0.852=70 об/мин, как-то маловато Собираем авто и пробуем выполнить замер оборотов по OBD, получается 210 об/мин. Теперь вопрос: В чем трабл, почему по графику такие обороты? Я не правильно рассчитал обороты или что-то не так в замере? файл замера: https://drive.google.com/file/d/0B9qWdrDLHR...dit?usp=sharing |
|
|
13.8.2014, 21:55
Сообщение
#87
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 13 Регистрация: 27.3.2014 Пользователь №: 5780 |
Приветствую!
Пробный замер выполнен. Результаты во вложении (может кому интересно), правда акум сел. На первой секции (второй замер) уже еле крутил. https://www.dropbox.com/s/572tc7snk39gyy8/c...on_13.25.24.msl https://www.dropbox.com/s/vjvi3h9veim7pxd/c...on_13.54.50.msl |
|
|
6.8.2014, 2:17
Сообщение
#88
|
|
GOLD Группа: Пользователи Сообщений: 1604 Регистрация: 9.1.2011 Из: vl Пользователь №: 4086 |
Приветствую! Собрал схему из первого поста этой темы. Прошил ардуино, запустил процессинг, подключил ардуино к компу, запустил скетч из 51 сообщения и вот тут незадача выскакивает ошибка, окно записи зависает и нечего не происходит ( Кто может подсказать что сделано не так? Заранее благодарен! P.S. Ноутбук, виндовс 7 64 бит, ардруино http://www.aliexpress.com/snapshot/6049728348.html, датчик http://www.aliexpress.com/snapshot/316059559.html. Надо было всю тему прочитать обсуждалось. Винда не разрешает использовать знак двоеточия в названиях файлов. Цитата У кого под виндой прога написанная в процессинге не работает поменяйте строку
output = createWriter("compression_" + str(hour()) + ":" + str(minute()) + ":" + str(second()) + ".msl"); на output = createWriter("compression_" + str(hour()) + "_" + str(minute()) + "_" + str(second()) + ".msl"); У меня выдало ошибку при создании файла - не могу создать такой файл. Проблема в разделителе ":" после замены на "_" все ОК Сообщение отредактировал vl-alexander - 6.8.2014, 2:19 |
|
|
5.8.2014, 19:23
Сообщение
#89
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 13 Регистрация: 27.3.2014 Пользователь №: 5780 |
Приветствую! Собрал схему из первого поста этой темы. Прошил ардуино, запустил процессинг, подключил ардуино к компу, запустил скетч из 51 сообщения
Далее всё просто - нажимаем на клавиатуре кнопку "S" и вот тут незадача________________________.png ( 218.41 килобайт ) Кол-во скачиваний: 31 выскакивает ошибка, окно записи зависает и нечего не происходит ( Кто может подсказать что сделано не так? Заранее благодарен! P.S. Ноутбук, виндовс 7 64 бит, ардруино http://www.aliexpress.com/snapshot/6049728348.html, датчик http://www.aliexpress.com/snapshot/316059559.html. |
|
|
12.7.2014, 11:39
Сообщение
#90
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 7 Регистрация: 9.5.2010 Пользователь №: 3750 |
добрый день. сижу, читаю про копрессометр на ардуино. не нашел схему. ткните пожалуйста.
спасибо |
|
|
1.7.2014, 20:26
Сообщение
#91
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 13 Регистрация: 27.3.2014 Пользователь №: 5780 |
Приветствую! Собрал все как описано в первом посте, ардруино прошил, но при запуске проги для замера, выскакивает ошибка. В чем проблема?
Вопрос решен сам собой - обновил программу Сообщение отредактировал Alarmistt - 1.7.2014, 20:39
Прикрепленные файлы
|
|
|
19.6.2014, 16:09
Сообщение
#92
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 12 Регистрация: 27.1.2014 Пользователь №: 5724 |
Отловлено несколько багов, связанных с крайне низком объёмом памяти у АТМеги и большим разбросом параметров кнопок на LCD Keypad.
Версия 0.14. Главные изменения: - Между пином 3 и землёй повешена кнопка калибровки. - С пина 2 убрана кнопка выбора типа датчика - теперь тип переключается по нажатию "вверх-вниз" до замера - При первом включении после заливки скетча обязательна калибровка кнопок LCD keypad, также калибровку можно выполнить, зажав кнопку калибровки при подаче питания на компрессометр. - Мерить можно только одну секцию за один раз. датчик на аналоговом входе 1, можно менять. - Замер останавливается через заданный таймаут (по умолчанию 30 секунд), а не по нажатию кнопки. Просьба оттестировать и сообщить, если будут баги. Модеров прошу потереть старый пост, чтоб не было проблем с использованием старого скетча.. Код // Компрессометр by PCDeath
char ver[6] = "v0.14"; /* Версия 0.14 Для Arduino Uno R3 с LCD keypad shield. На других платформах не проверялось. Мерит обычные поршневые двигатели 4Т/2Т или РПД. В связи с большим разбросом значений кнопок у разных производителей LCD keypad Shield добавлена возможность калибровки кнопок. Для калибровки необходимо прицепить тактовую кнопку между цифр.пином 3 и массой. Датчик давления 5В, при атм.давлении возвращают 0,5В (102), при макс.давлении - 4,5В (922), погрешность не более +/-10% Верхний предел давления регулируемый, можно использовать 2 различных типа датчиков, в моём варианте 10,5 кгс/см2 и 14 кгс/см2. Установлены 2 порога давления - 20% и 30% от показаний датчика, для чёткого разделения по секциям Датчик подключается к аналоговому входу Arduino, по умолчанию 1, можно менять. Рекомендуется питать компрессометр от отдельного батарейного источника питания +8...+12В, во избежание помех и ошибок из-за просадки напряжения при прокрутке двигателя стартером. Управление: Калибровка кнопок: Если при включении нажата кнопка на цифр.пине 3, или ПО только что залито в контроллер, компрессометр переходит в режим калибровки. При калибровке требуется нажать кнопку, которая запрошена на экране, затем нажать кнопку калибровки. После записи значений на экране появится приглашение отпустить кнопку калибровки. Отпускаем сначала кнопку калибровки, затем - кнопку на keypad shield, которую откалибровали, и переходим к калибровке следующей кнопки. По окончании калибровки требуется перезагрузить компрессометр До замера: "ВВЕРХ" переходит к типу датчика 2 "ВНИЗ" переходит к типу датчика 1 "ВПРАВО" переводит к следующему типу измерения "ВЛЕВО" переводит к предыдущему типу измерения По нажатию кнопки "SELECT" стартует процесс измерения, останавливается через заданное время. При старте происходит десятикратный опрос датчиков с интервалом в 50 мс. Если показания на входе имеют погрешность более 10% от заявленного значения, (датчик отсутствует или замкнут), на экран выводится предупреждение с указанием, в какую сторону погрешность Во время роторного замера на экране сырые значения на аналоговом входе для всех камер. Во время поршневого замера на экране сырые значения. После роторного замера: "ВВЕРХ" показывает скорректированные значения "ВНИЗ" возвращается к истинным значениям Если хотя бы у одной из камер давление ниже порога или обороты двигателя слишком низкие - выдаётся предупреждение о низких оборотах или вылете секции. После поршневого замера на кнопки не реагирует. Если во время замера было достигнуто предельное давление, на которое рассчитан датчик, то при отображении результатов поршневого или роторного замера без коррекции информация об этом выводится на экран. При отображении результатов роторного замера с коррекцией полученные значения приводятся к эталонным оборотам Приятного использования. PCDeath P.S. Если захотите поблагодарить создателя, это можно сделать: 1. Добрым словом где-нибудь на форумах 2. Запчастями от РПД ВАЗа и RX-7 3. Деньгами на QIWI-кошелёк +79053834132 Коммерческое распространение кода без согласования с автором запрещено */ /********************************************************************** Четыре параметра ниже требуется поправить под используемые Вами датчики ***********************************************************************/ int MAX_SENS1 = 105; // Макс.показания датчика 1 типа в кгс/см2 * 10 int MAX_SENS2 = 140; // Макс.показания датчика 2 типа в кгс/см2 * 10 byte TRESHOLD1 = 20; // Порог 1 в процентах от диапазона датчика. Рекомендуется не менее 2 атм. // При падении давления ниже порога 1 компрессометр считает замер камеры завершённым. byte TRESHOLD2 = 30; // Порог 2 в процентах от диапазона датчика. Рекомендуется не менее 1,5 от порога 1. // При возрастании давления выше порога 2 компрессометр начнёт замер следующей камеры. /********************************************************************* Всё, что дальше, менять не стоит, если Вы не знаете точно, что делаете **********************************************************************/ int MINS = 102; // Показания датчика на аналоговом входе при атмосферном (нулевом) давлении int MAXS = 922; // Показания датчика на аналоговом входе при макс.давлении byte MODE = 0; // Режим работы. 0 - роторный, 1 - поршневой 4Т, 2 - поршневой 2Т int CORRPM = 250; // Обороты, к которым приводится компрессия при коррекции int MINRPM = 170; // Мин.допустимые для измерения обороты, не менее 2/3 от CORRPM byte Z_FIRST = 6; // Оборот, с которого начинается подсчёт RPM byte Z_LAST = 9; // Оборот, на котором заканчивается подсчёт RPM, не менее Z_FIRST + 3, не более Z_FIRST + 15 byte TIMER = 2; // Периодичность замера в миллисекундах, не более 30. byte TIMEOUT = 30; // Время, отведённое на замер после нажатия SELECT #define SENSPIN 1 // Аналоговый пин, на котором висит датчик #define btnCAL 3 // Цифровой пин, на котором висит кнопка калибровки /******************************** БОЛЬШЕ НАСТРАИВАТЬ НИЧЕГО НЕ НАДО ********************************/ /******************************* ОБЪЯВЛЯЕМ ПЕРЕМЕННЫЕ *******************************/ int CALIBRE, // Для калибровки "нуля" датчика и установки порогов измерения TRESHLOW, TRESHHIGH, // Для вычисления пороговых значений KGSCOMPR[3], // Итоговые значения компрессии, приведённые к кгс/см2 * 10 RPM, // Частота вращения вала. CORRVAL, // Значение множителя коррекции bUP, bDN, bLT, bRT, bSL; // Переменные для значений кнопок byte i, // Счётчики для калибровки датчиков ERRORCODE, // Коды ошибок BTN[6]; // Массив для калибровки кнопок boolean START, CORR, RPMCOUNT, // Флаги старта, коррекции, подсчёта оборотов ERR, OUT, // Флаг ошибки датчика, флаг вывода на экран MAX[3]; // Массив флагов информирования о достижении предельного давления volatile int DIGCOMPR[3], // Максимальные значения компрессии, сырые CURRCNT, Z_TMP, CNT[16];// Счётчик "тиков" таймера и массив для расчёта оборотов volatile byte CH, Z; // Номер камеры для расчётов, номер оборота volatile boolean STOP, UP; // Флаги остановки и движения к ВМТ int MAX_SENS = MAX_SENS1; // Устанавливаем начальное значение в тип 1 unsigned int T_OUT = TIMEOUT / TIMER * 1000; // Счётчик "тиков" для таймаута замера unsigned int FREQ = 2000 * TIMER; // Предельное значение для таймера. 1 мсек = 2000 тактов при делителе /8 unsigned int MAXCNT = 60000 / TIMER / MINRPM; // Максимальное зачение счётчика для мин.оборотов long DIVRPM = 60000 / TIMER * (Z_LAST - Z_FIRST); // Делитель для подсчёта RPM. /******************************************** ЦКПЛЯЕМ БИБЛИОТЕКИ И УЧИМ РАБОТАТЬ С КНОПКАМИ ********************************************/ #include <EEPROM.h> // Прицепляем EEPROM для калибровки кнопок #include <LiquidCrystal.h> // Прицепляем LCD LiquidCrystal lcd(8, 9, 4, 5, 6, 7); byte lcd_key = 0; int adc_key_in = 0; #define btnNONE 0 #define btnSELECT 1 #define btnLEFT 2 #define btnUP 3 #define btnDOWN 4 #define btnRIGHT 5 // Обработка кнопок int read_LCD_buttons() { adc_key_in = analogRead(0); // Читаем значение нопок. if (adc_key_in > bSL +10 ) return btnNONE; if (adc_key_in < bRT) return btnRIGHT; if (adc_key_in < bUP) return btnUP; if (adc_key_in < bDN) return btnDOWN; if (adc_key_in < bLT) return btnLEFT; if (adc_key_in < bSL) return btnSELECT; return btnNONE; // Если "всё не так" - считаем. что никакая кнопка не нажата. } void setup() { lcd.begin(16, 2); // Запускаем библиотеку LCD ERR = 1; // Ставим датчику признак высокого уровня на входе /****************************************** РИСУЕМ СПЛЕШ-СКРИН С ВЫВОДОМ ВЕРСИИ ******************************************/ lcd.setCursor(0,0); lcd.print(" ROTARY C-METER "); lcd.setCursor(0,1); lcd.print(" BY PCDeath"); lcd.setCursor(0,1); lcd.print(ver); delay (3000); /***************************************** НАСТРАИВАЕМ ТАЙМЕР НА НАЧАЛЬНЫЕ ЗНАЧЕНИЯ *****************************************/ TCCR1A = 0; TIMSK1 = 0; // Сбрасываем на всякий эти регистры TCCR1B = 0; // Мало ли что arduino IDE туда записало TCNT1 = 0; // Сбрасываем счетный регистр таймера 1 OCR1A = 0; // Отключаем таймер TCCR1B |= ((1 << CS11) | (1 << WGM12)); // Настраиваем таймер на делитель /8, режим CTC /***************************************** ОБРАБАТЫВАЕМ КАЛИБРОВОЧНУЮ КНОПКУ *****************************************/ pinMode(btnCAL, INPUT); // Назначаем цифр.пину 3 режим входа digitalWrite(btnCAL, HIGH); // Устанавливаем высокий уровень сигнала по умолчанию if (digitalRead(btnCAL) == 0) // Если нажата кнопка калибровок EEPROM.write(0, 0); // Снимаем флаг выполнения калибровки BTN[0] = EEPROM.read(0); // Читаем значение флага калибровки if (BTN[0] != 1) { // Если необходима калибровка, ERRORCODE = 5; // Выносим в обработку ошибки OUT = 1; // Настраиваем флаг записи CURRCNT = analogRead(0); // Калибруем отсутствие нажатия } else { bSL = int(EEPROM.read(1) * 4); // Читаем значение для кнопки "SELECT" bLT = int(EEPROM.read(2) * 4); // Читаем значение для кнопки "ВЛЕВО" bUP = int(EEPROM.read(3) * 4); // Читаем значение для кнопки "ВВЕРХ" bDN = int(EEPROM.read(4) * 4); // Читаем значение для кнопки "ВНИЗ" bRT = int(EEPROM.read(5) * 4); // Читаем значение для кнопки "ВПРАВО" } } void loop() { /*************************************** ОБРАБОТКА ОШИБОК ***************************************/ if (ERRORCODE > 0){ TIMSK1 &= (0 << OCIE1A); // Запрещаем генерацию прерывания таймера 1 OCR1A = 0; // И останавливаем таймер if (ERRORCODE == 5) CALIBER(); // Если требуется калибровка, входим в режим калибровки кнопок /************************************ ОШИБКА НИЗКИХ ОБОРОТОВ ИЛИ ВЫЛЕТА ************************************/ if (ERRORCODE == 3) { lcd.setCursor(0,0); lcd.print("LOW RPM!"); // Выводим на экран ошибку lcd.setCursor(0,1); lcd.print("OR CHAMBER DOWN"); ERRORCODE ++; } /******************************************** ОШИБКА ОТСУТСТВИЯ ИЛИ НЕИСПРАВНОСТИ ДАТЧИКА ********************************************/ if (ERRORCODE == 1){ lcd.setCursor(0,0); lcd.print(" SENSOR ERROR! "); // Выводим на экран ошибку lcd.setCursor(0,1); if (ERR == 0) // Если собранные значения ниже заявленных более чем на 10% lcd.print(" VALUE TOO LOW "); // Информируем о слишком низком значении else lcd.print(" VALUE TOO HIGH "); // Иначе информируем о слишком высоком значении ERRORCODE ++; } return; } /*************************************************************** ЕСЛИ НЕ ПРОИЗВОДИТСЯ ЗАМЕР КОМПРЕССИИ, ОБРАБАТЫВАЕМ КНОПКИ ***************************************************************/ if (START - STOP == 0 ) { lcd_key = read_LCD_buttons(); // Обрабатываем нажатие кнопки на LCD Shield if (lcd_key > 0) BUTTON(); // Если что-то нажато, идём в функцию обработки кнопок } /*************************************************** ВЫВОД НА ЭКРАН ДО ЗАМЕРА ***************************************************/ if (START == 0 && OUT == 0) { // Если замер не выполнялся и сброшен флаг вывода lcd.setCursor(0,0); lcd.print("MAX = ATMs"); // Отображаем верхний предел выбранного типа датчиков lcd.setCursor(6,0); lcd.print((float)MAX_SENS / 10.0); if (MODE == 0) { lcd.setCursor(0,1); lcd.print("ROTARY "); // Отображаем тип замера: роторный } else { lcd.setCursor(0,1); // Или поршневой lcd.print("PISTON T"); lcd.setCursor(14,1); if (MODE == 1) lcd.print("4"); // Четырёхтактный else lcd.print("2"); // Или двухтактный } OUT = 1; // Ставим флаг вывода, чтоб не мерцал экран return; } /************************* ВО ВРЕМЯ ЗАМЕРА *************************/ if (START == 1 && STOP == 0) { // Если выполняется замер lcd.begin(16,2); lcd.print("WAIT SECONDS"); // Выводим на экран обратный отсчёт lcd.setCursor(5,0); lcd.print((T_OUT - CURRCNT) / (1000 / TIMER)); lcd.setCursor(0,1); // и текущие сырые значения компрессии lcd.print(DIGCOMPR[0]); if (MODE == 0) { // Если режим роторный lcd.setCursor(6,1); // Выводим текущие сырые значения по камерам 2 и 3 lcd.print(DIGCOMPR[1]); lcd.setCursor(12,1); lcd.print(DIGCOMPR[2]); } delay(1000); return; } /**************************************************** ПОСЛЕ ЗАМЕРА ****************************************************/ if (STOP == 1 && OUT == 0) { // Если сброшен флаг вывода lcd.begin(16,2); // Очищаем экран. begin поставлен, т.к.иногда во время замера вывод на экран из-за прерывания ломается /**************************************************** ОРГАНИЗУЕМ ПОДСЧЁТ ОБОРОТОВ ****************************************************/ if (RPMCOUNT == 0) { // Если подсчёт не выполнялся for (Z_TMP = 0; Z_TMP <= Z_LAST - Z_FIRST; Z_TMP ++) { // Проверяем на низкие обороты и вылет секции if (CNT[Z_TMP+1] - CNT[Z_TMP] > MAXCNT && MODE == 0) // Если частота обновления ниже минимального порога и режим замера - роторный ERRORCODE = 3; // Ставим флаг низких оборотов } RPM = DIVRPM / (CNT[Z_LAST - Z_FIRST] - CNT[0]); // Считаем обороты в минуту if (MODE == 1) RPM *= 2; // Если тип замера поршневой 4-тактный, умножаем обороты на 2 RPMCOUNT = 1; // Ставим флаг выполнения подсчёта } /************************************************ ПОКАЗЫВАЕМ ОБОРОТЫ ИЛИ ИНФО О КОРРЕКЦИИ ************************************************/ if (MODE == 0 && CORR == 1) { // Если мерился роторный двигатель и установлен флаг коррекции CORRVAL = 1000 + (CORRPM - RPM) * 3; // рассчитываем значение для множителя х 1000 lcd.setCursor(9,0); // Информируем о коррекции lcd.print("CORR"); lcd.setCursor(13,0); lcd.print(CORRPM); } else { CORRVAL = 1000; // Иначе ставим множитель в единицу х 1000 lcd.setCursor(9,0); // И выводим обороты, при которых производился замер lcd.print("RPM= "); lcd.setCursor(13,0); lcd.print(RPM); } /****************************************************** ПЕРЕВОДИМ КОМПРЕССИЮ ИЗ ПОПУГАЕВ В КГС/СМ2 ******************************************************/ for (CH = 0; CH <= 2; CH ++) { // Для каждой камеры if (DIGCOMPR[CH] > MAXS + 3) // Если превышены макс.показания + погрешность MAX[CH] = 1; // Ставим флаг достижения максимального порога давления KGSCOMPR[CH] = // Мапим показания датчика из сырых в кгс/см2 х 10 // map((long)DIGCOMPR[CH] * CORRVAL / 1000, MINS, MAXS, 0, MAX_SENS); // без учёта начальной калибровки map((long)DIGCOMPR[CH] * CORRVAL / 1000, CALIBRE, MAXS, 0, MAX_SENS); // с учётом начальной калибровки } /***************************************************** ПОКАЗЫВАЕМ НА ЭКРАН, ЧЕГО ТАМ НАМЕРИЛИ *****************************************************/ if (MODE == 0){ // Если режим роторный lcd.setCursor(0,0); lcd.print("ROTARY"); // Выводим на экран тип замера for (CH = 0; CH <= 2; CH ++){ // И итоговые значения компрессии по камерам lcd.setCursor(CH * 6,1); if (MAX[CH] == 1 && CORR == 0) // Если нет флага коррекции и достигнут макс.порог измерения - информируем об этом lcd.print("MAX!"); else lcd.print((float)KGSCOMPR[CH] / 10.0); } } else { // Если режим поршневой lcd.setCursor(0,0); lcd.print("PISTON"); // Выводим на экран инфо о поршневом замере lcd.setCursor(0,1); // И итоговые значения компрессии if (MAX[0] == 1) { // Если достигнут макс.порог измерения - информируем об этом lcd.print("MAX! >"); lcd.print((float)KGSCOMPR[0] / 10.0); } else lcd.print((float)KGSCOMPR[0] / 10.0); } OUT = 1; } } /****************************************************** ФУНКЦИЯ ОБРАОТКИ НАЖАТИЯ ******************************************************/ void BUTTON(){ switch (lcd_key) // Производим действие, в зависимости от нажатой кнопки { case btnRIGHT: // Кнопка "ВПРАВО" { OUT = 0; // Сбрасываем флаг вывода для обновления экрана if (START == 0) {MODE ++; // Если замер не выполнялся, переключаем режим MODE = min(MODE, 2); // Ограничиваем номер режима } break; } case btnLEFT: // Кнопка "ВЛЕВО" { OUT = 0; // Сбрасываем флаг вывода для обновления экрана if (START == 0) {MODE --; // Если замер не выполнялся, переключаем режим if (MODE != 1) MODE = 0; // Ограничиваем номер режима } break; } case btnUP: // Кнопка "ВВЕРХ" { OUT = 0; // Сбрасываем флаг вывода для обновления экрана if (START == 0) MAX_SENS = MAX_SENS2; // Переключаем на тип датчика 2 if (STOP == 1 && MODE == 0) CORR = 1; // Если роторный замер завершён, ставим флаг коррекции break; } case btnDOWN: // Кнопка "ВНИЗ" { OUT = 0; // Сбрасываем флаг вывода для обновления экрана if (START == 0) MAX_SENS = MAX_SENS1; // Переключаем на тип датчика 1 if (STOP == 1 && MODE == 0) CORR = 0; // Если роторный замер завершён, убираем флаг коррекции break; } case btnSELECT: // Кнопка "SELECT" { if (START == 0){ // Если замер остановлен START = 1; // Ставим флаг запуска OUT = 0; // Сбрасываем флаг вывода для обновления экрана lcd.clear(); // Очищаем экран for (i=0; i < 10; i++) { // Проверяем датчики на отсутствие/замыкание/большую погрешность CALIBRE += analogRead(SENSPIN); // С интервалом 50 мс 10 раз читаем показания delay(50); } if (CALIBRE > 11 * MINS || CALIBRE < 9 * MINS) { // Если отсутствует/неисправен датчик (погрешность более 10% от заявленной) ERRORCODE = 1; // Ставим флаги ошибок if (CALIBRE < 9 * MINS) // Если показания ниже заявленных ERR = 0; // Ставим указатель на низкое значение } } if (ERRORCODE == 0) { // Если датчики опрошены успешно CALIBRE = analogRead(SENSPIN); // Калибруем датчики - выставляем "0" TRESHLOW = (long)CALIBRE * (100 + TRESHOLD1) / 100; // Ставим порог падения давления TRESHHIGH = (long)CALIBRE * (100 + TRESHOLD2) / 100; // Ставим порог роста давления delay(500); // Ждём 0,5 сек, чтоб точно отпустить кнопку OCR1A = FREQ; // И настраиваем таймер: TIMSK1 |= (1 << OCIE1A); // Разрешаем генерацию прерывания таймера 1 по совпадению с регистром OCR1A } break; } } delay(500); } /****************************************************** ФУНКЦИЯ КАЛИБРОВКИ КНОПОК ******************************************************/ void CALIBER(){ while (1 == 1){ // Входим в бесконечный цикл if (digitalRead(btnCAL) == 0) { // Если нажата кнопка калибровки lcd.setCursor(0,0); lcd.print("RELEASE CALIBER"); // Выводим на экран приглашение отпустить кнопку калибровки lcd.setCursor(0,1); lcd.print(" BUTTON "); if (i <= 4 && OUT == 0) { // Если значение калибровки ещё не снято i++; // Увеличиваем счётчик кнопки на единицу BTN[i] = analogRead(0) / 4 + 5; // Пишем в переменную значение кнопки / 4, чтоб влезло в тип byte OUT = 1; // Ставим флаг записи значения кнопки } if (i > 4 && BTN[0] != 1) { // Если все кнопки откалиброваны и значения ещё не записаны в EEPROM BTN[0] = 1; // Ставим флаг завершения калибровки for (CH = 0; CH <= 5; CH ++) // Повторяем 6 раз EEPROM.write(CH, BTN[CH]); // Пишем в EEPROM значения из массива } } else { // Если кнопка калибровки не нажата delay(100); // Задержка для исключения дребезга кнопки if (i > 4) { // Если калибровка завершена lcd.setCursor(0,0); lcd.print(" REBOOT THE "); // Выводим на экран приглашение к перезагрузке lcd.setCursor(0,1); lcd.print(" DEVICE "); } else { // Если калибровка ещё не завершена lcd.setCursor(0,0); lcd.print(" PRESS "); // Выводим на экран приглашение к нажатию кнопки на KEYPAD lcd.setCursor(0,1); lcd.print(" ");// Выводим на экран приглашение к нажатию кнопки на KEYPAD lcd.setCursor(8,0); if (i == 0) lcd.print("SELECT"); // Для каждой кнопки своя строка if (i == 1) lcd.print("LEFT"); if (i == 2) lcd.print("UP"); if (i == 3) lcd.print("DOWN"); if (i == 4) lcd.print("RIGHT"); if (analogRead(0) < CURRCNT - 10 || analogRead(0) > CURRCNT + 10) { // Если нажата кнопка на Keypad lcd.setCursor(0,1); lcd.print(" PRESS CALIBER "); // Выводим приглашение к нажатию кнопки калибровки } OUT = 0; } } delay(500); } } /************************************************* А ВОТ ЗДЕСЬ ТВОРИТСЯ ВСЁ САМОЕ ИНТЕРЕСНОЕ *************************************************/ ISR(TIMER1_COMPA_vect) { // Обрабатываем прерывание по таймеру CURRCNT ++; // Увеличиваем значение текущего счётчика "тиков" /************************ ДЛЯ РАСЧЁТА ОБОРОТОВ ************************/ if (Z >= Z_FIRST && Z <= Z_LAST + 1){ if(CNT[Z - Z_FIRST] == 0) { // Если счётчик оборотов в пределах измерений и измерение ещё не записано CNT[Z - Z_FIRST] = CURRCNT; // Присваиваем значение счётчика элементу массива } } /*************************** ДЛЯ РАСЧЁТА КОМПРЕССИИ ***************************/ int TMP = analogRead(SENSPIN); // Читаем показания датчика // и пишем во временную переменную if (UP == 1) { // Если установлен флаг движения к ВМТ if (TMP >= TRESHLOW) { // Если временное значение больше нижнего порога (окончания замера) if (TMP > DIGCOMPR[CH]) // Если временное значение больше итогового DIGCOMPR[CH] = TMP; // Пишем временное значение в итоговое } else UP = 0; // Иначе снимаем флаг движения к ВМТ } else { // Если флаг движения к ВМТ не установлен if (TMP >= TRESHHIGH) { // Если текущее значение больше верхнего порога (начала замера следующей камеры) UP = 1; // Ставим флаг движения к ВМТ Z ++; // Прибавляем счётчик оборотов if (MODE == 0) CH ++; // Если режим роторный, переходим к следующей камере if (CH > 2) CH = 0; // Ходим по кругу камер } } /***************************************** ДЕЛАЕМ ВЫХОД ИЗ ЗАМЕРА ПО ТАЙМАУТУ *****************************************/ if (CURRCNT > T_OUT) { // Если вышло время замера TIMSK1 &= (0 << OCIE1A); // Запрещаем генерацию прерывания таймера 1 OCR1A = 0; // Останавливаем таймер STOP = 1; // Ставим флаг остановки } } Сообщение отредактировал pcdeath - 24.6.2014, 17:14 |
|
|
2.5.2014, 18:03
Сообщение
#93
|
|
Team member Группа: Пользователи Сообщений: 390 Регистрация: 17.7.2013 Из: Красноярск Пользователь №: 5398 |
Да надо отладить.
Правда сейчас ротор замерить нет возможности. Делаю ребилд и жду подшипники на вал блин остались только они. Компрессия на том моторе была 6,3 датчик на 150 пси (10,5 кг/см2) можно попробовать поршневой мотор. или подождать пару недель. Мотор живой тачко летает. |
|
|
2.5.2014, 12:14
Сообщение
#94
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 12 Регистрация: 27.1.2014 Пользователь №: 5724 |
Попробуем. Первая версия рисовала погоду на марсе: непонятные циферки и надпись секция умерла или лоу рпм 270. "непонятные циферки" при замере - сырые показания с датчика. При повторном нажатии "SELECT" преобразуются в значения компрессии. Мёртвую секцию может показать в случае, если компрессия на оборотах замера скорости вращения (6-9) в одной или более камер первой секции ниже установленного порога2 (30% от показаний датчика). Ещё может быть из-за наводок системы зажигания на провод датчика. У меня и 0.9 работала, в принципе. Если проблема останется - пиши, какой датчик пользуешь и какие параметры выставил в коде на этапе настройки - будем копать. Сообщение отредактировал pcdeath - 2.5.2014, 12:15 |
|
|
30.4.2014, 17:44
Сообщение
#95
|
|
Team member Группа: Пользователи Сообщений: 390 Регистрация: 17.7.2013 Из: Красноярск Пользователь №: 5398 |
Попробуем. Первая версия рисовала погоду на марсе: непонятные циферки и надпись секция умерла или лоу рпм 270.
|
|
|
30.4.2014, 13:11
Сообщение
#96
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 12 Регистрация: 27.1.2014 Пользователь №: 5724 |
Версия 0.11. Изменения:
1. Поправил баг с плавающим некорректным определением наличия датчика - иногда при отсутствии датчика компрессометр мог показать его наличие. Кол-во проверок увеличено до 10, погрешность датчика на атм.давлении ограничена 10% от заявленного при настройке. 2. Добавил быстрое изменение пределов давления для более удобного использования разных датчиков. Текущее макс.давление отображается на этапе настройки. Замыканием цифрового вывода 2 на массу можно выбирать тип 1 (не замкнут) или тип 2 (замкнут). Предупреждение: провода до датчиков желательно использовать экранированые, во время замера снимать колодки с ДПКВ, или как-либо ещё предотвращать работу системы зажигания - наводки от катушек могут сильно влиять на показания компрессометра. Код код удален в связи с обновлением до версии 0.14.
Сообщение отредактировал John - 27.6.2015, 9:34 |
|
|
18.4.2014, 20:07
Сообщение
#97
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 12 Регистрация: 27.1.2014 Пользователь №: 5724 |
ОК, благодарю. Буду знать, что искать.
Если у кого есть предложения/пожелания по допиливанию функционала и правке багов - кидайте, буду рассматривать. Немного подправил. Теперь при напряжении на выходе датчика более 4,5V инфо о достижении макс.давления выводится на экран, если не производились вычисления по коррекции. Это сделано, чтоб информировать о том, что давление было больше, чем может снять датчик, но при этом не терять возможность привести даже эти показания к эталонным оборотам. Код код удален в связи с обновлением до версии 0.14.
Сообщение отредактировал John - 27.6.2015, 9:36 |
|
|
18.4.2014, 6:21
Сообщение
#98
|
|
неабразованый калхозник Группа: Администраторы Сообщений: 1836 Регистрация: 13.10.2005 Из: Мытищи, Московская область, Россия. Пользователь №: 4 |
Канавки под резинки в статорах у FC3S. У FD канавки в крышках. Канавки под резинки в статорах у некоторых моторов FC3S. -------------------- ... что можно сделать из простой швейной машины Зингера? Небольшое приспособление - и получилась прелестная колхозная сноповязалка.
(с) Остап-Сулейман-Берта-Мария-Бендер |
|
|
18.4.2014, 4:57
Сообщение
#99
|
|
GOLD Группа: Пользователи Сообщений: 1604 Регистрация: 9.1.2011 Из: vl Пользователь №: 4086 |
|
|
|
16.4.2014, 10:45
Сообщение
#100
|
|
Новичок (<30 постов) Группа: Пользователи Сообщений: 12 Регистрация: 27.1.2014 Пользователь №: 5724 |
pcdeath, отличная работа! Тоже посещали подобные мысли, но лень родилась вперед меня, и до реалиации дело не дошло. offtop: на рпд от ВАЗа маздо-детали не подходят? Видел фотки потрохов заднеприводного РПД от ВАЗа - визуально от мазды ничем не отличается. Благодарю. Меня заставила засесть за этот проект именно лень - каждыйраз возить в гараж бук, цеплять его куда-то и т.д... :-) А потом ещё руками выделять, считать. Лень же. Запчасти подходят и от RX-7. Статоры только от fd(чего-то там), у которых канавки под резинки в статоре. Вкладыши, валы, маслосъёмка - полностью идентичны. Роторы можно ставить только вместе с маздоуплотнениями и маздостаторами. Крышки... Вроде нет - там посадочные под маслофильтры в разных местах. Кстати, если у кого есть убитые валы и статоры 12A и 13B - нужны. Также нужен передний ротор 12A. И если кто может подогнать комплект уплотнений Rotary aviation на один ротор 13B 3мм незадорого - буду признателен.В общем, пишите в личку, у кого что есть, и что за это хотите. Предложение - предлагаю добавить при включении, после опроса датчика, самокалибровку в атмосфере. т.е. чтобы 0 выставился автоматически для датчика. Можно и самому допилить, но автору это будет сделать проще так как у него есть замеры от котоых можно оттолкнуться. Так же вопрос по питанию хватит ли кроны? Просто при проведении замеров с ноута если подключаешь зарядку идут наводки. С батареи гораздо чище сигнал. Поэтому хочу питание организовать от батареи типа крона. Так это... В коде и в описании калибровка есть и реализована: Цитата Если всё хорошо - датчики калибруются и можно начинать замер. По поводу "Кроны" - думаю, должно хватить надолго: Ардуино потребляет от 12В порядка 150 мА при замере. От 9В, возможно, будет жрать чуть больше тока. А вообще, у неё по спецификациям предельные напряжения 6...20В, если ничего не путаю, так что хоть от суслика полевого питать - ей по фигу, лишь бы стабильно и без бросков. Я думаю организовать питание тремя элементами 18650 по 3,7В, если "Кроны"не будет надолго хватать. |
|
|
Текстовая версия | Сейчас: 27.9.2024, 11:19 |