IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила форума Правила форума
8 страниц V  « < 3 4 5 6 7 > »   
Ответить в данную темуНачать новую тему
Роторный компрессометр своими руками
Рейтинг 5 V
 
Alarmistt
сообщение 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. не понял в чем вопрос про подключение к обд...
Перейти в начало страницы
 
+Цитировать сообщение
dennis_ex
сообщение 9.9.2014, 6:27
Сообщение #82


Team member
*****

Группа: Пользователи
Сообщений: 390
Регистрация: 17.7.2013
Из: Красноярск
Пользователь №: 5398



Цитата(vl-alexander @ 9.9.2014, 5:25) *
потому что надо было внимательнее прочитать второе сообщение в теме. Самая последняя строчка:
Формула: rpm = 180 / t. откуда взялась цифра 60?
180/0.852 = 211 оборотов в минуту.



очевидно же что RX-8.

60/т если измерять время между соседними пиками(секциями камеры)
180/т если мерим время между 1 и 4 пиком (т.е. все три секции)
Перейти в начало страницы
 
+Цитировать сообщение
vl-alexander
сообщение 9.9.2014, 4:25
Сообщение #83


GOLD
************

Группа: Пользователи
Сообщений: 1604
Регистрация: 9.1.2011
Из: vl
Пользователь №: 4086



Цитата(Alarmistt @ 8.9.2014, 17:30) *
время (сек)_______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 оборотов в минуту.


Цитата(FIL @ 8.9.2014, 19:15) *
к ОБД чем подключаетесь?!

очевидно же что RX-8.

Сообщение отредактировал vl-alexander - 9.9.2014, 4:25
Перейти в начало страницы
 
+Цитировать сообщение
Alarmistt
сообщение 8.9.2014, 12:49
Сообщение #84


Новичок (<30 постов)
*

Группа: Пользователи
Сообщений: 13
Регистрация: 27.3.2014
Пользователь №: 5780



Надеюсь за флуд не сочтут. Подключение к OBDII китайским адаптером на ELM327 + телефон на андройд с программой Torque
Перейти в начало страницы
 
+Цитировать сообщение
FIL
сообщение 8.9.2014, 11:15
Сообщение #85


GOLD
************

Группа: Пользователи
Сообщений: 1032
Регистрация: 8.2.2009
Из: Красноярск
Пользователь №: 2857



Цитата(Alarmistt @ 8.9.2014, 14:30) *
Приветствую!
Провел на днях замер на авто, и возник вопрос.
По графику определяю давление в секциях
________________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

к ОБД чем подключаетесь?!
Перейти в начало страницы
 
+Цитировать сообщение
Alarmistt
сообщение 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
Перейти в начало страницы
 
+Цитировать сообщение
Alarmistt
сообщение 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
Перейти в начало страницы
 
+Цитировать сообщение
vl-alexander
сообщение 6.8.2014, 2:17
Сообщение #88


GOLD
************

Группа: Пользователи
Сообщений: 1604
Регистрация: 9.1.2011
Из: vl
Пользователь №: 4086



Цитата(Alarmistt @ 6.8.2014, 3:23) *
Приветствую! Собрал схему из первого поста этой темы. Прошил ардуино, запустил процессинг, подключил ардуино к компу, запустил скетч из 51 сообщения и вот тут незадача
выскакивает ошибка, окно записи зависает и нечего не происходит (
Кто может подсказать что сделано не так?
Заранее благодарен!

P.S. Ноутбук, виндовс 7 64 бит, ардруино http://www.aliexpress.com/snapshot/6049728348.html, датчик http://www.aliexpress.com/snapshot/316059559.html.


Надо было всю тему прочитать smile.gif обсуждалось. Винда не разрешает использовать знак двоеточия в названиях файлов.

Цитата
У кого под виндой прога написанная в процессинге не работает поменяйте строку
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
Перейти в начало страницы
 
+Цитировать сообщение
Alarmistt
сообщение 5.8.2014, 19:23
Сообщение #89


Новичок (<30 постов)
*

Группа: Пользователи
Сообщений: 13
Регистрация: 27.3.2014
Пользователь №: 5780



Приветствую! Собрал схему из первого поста этой темы. Прошил ардуино, запустил процессинг, подключил ардуино к компу, запустил скетч из 51 сообщения
Цитата(vl-alexander @ 26.7.2013, 6:01) *
Далее всё просто - нажимаем на клавиатуре кнопку "S"
и вот тут незадача
Прикрепленный файл  ________________________.png ( 218.41 килобайт ) Кол-во скачиваний: 31

выскакивает ошибка, окно записи зависает и нечего не происходит (
Кто может подсказать что сделано не так?
Заранее благодарен!

P.S. Ноутбук, виндовс 7 64 бит, ардруино http://www.aliexpress.com/snapshot/6049728348.html, датчик http://www.aliexpress.com/snapshot/316059559.html.
Перейти в начало страницы
 
+Цитировать сообщение
VxD
сообщение 12.7.2014, 11:39
Сообщение #90


Новичок (<30 постов)
*

Группа: Пользователи
Сообщений: 7
Регистрация: 9.5.2010
Пользователь №: 3750



добрый день. сижу, читаю про копрессометр на ардуино. не нашел схему. ткните пожалуйста.
спасибо
Перейти в начало страницы
 
+Цитировать сообщение
Alarmistt
сообщение 1.7.2014, 20:26
Сообщение #91


Новичок (<30 постов)
*

Группа: Пользователи
Сообщений: 13
Регистрация: 27.3.2014
Пользователь №: 5780



Приветствую! Собрал все как описано в первом посте, ардруино прошил, но при запуске проги для замера, выскакивает ошибка. В чем проблема?
Вопрос решен сам собой - обновил программу

Сообщение отредактировал Alarmistt - 1.7.2014, 20:39
Прикрепленные файлы
Прикрепленный файл  __________.png ( 215.32 килобайт ) Кол-во скачиваний: 37
 
Перейти в начало страницы
 
+Цитировать сообщение
pcdeath
сообщение 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
Перейти в начало страницы
 
+Цитировать сообщение
dennis_ex
сообщение 2.5.2014, 18:03
Сообщение #93


Team member
*****

Группа: Пользователи
Сообщений: 390
Регистрация: 17.7.2013
Из: Красноярск
Пользователь №: 5398



Да надо отладить.
Правда сейчас ротор замерить нет возможности. Делаю ребилд и жду подшипники на вал блин остались только они. Компрессия на том моторе была 6,3 датчик на 150 пси (10,5 кг/см2) можно попробовать поршневой мотор. или подождать пару недель. Мотор живой тачко летает.
Перейти в начало страницы
 
+Цитировать сообщение
pcdeath
сообщение 2.5.2014, 12:14
Сообщение #94


Новичок (<30 постов)
*

Группа: Пользователи
Сообщений: 12
Регистрация: 27.1.2014
Пользователь №: 5724



Цитата(dennis_ex @ 30.4.2014, 18:44) *
Попробуем. Первая версия рисовала погоду на марсе: непонятные циферки и надпись секция умерла или лоу рпм 270.


"непонятные циферки" при замере - сырые показания с датчика. При повторном нажатии "SELECT" преобразуются в значения компрессии.
Мёртвую секцию может показать в случае, если компрессия на оборотах замера скорости вращения (6-9) в одной или более камер первой секции ниже установленного порога2 (30% от показаний датчика). Ещё может быть из-за наводок системы зажигания на провод датчика.

У меня и 0.9 работала, в принципе. Если проблема останется - пиши, какой датчик пользуешь и какие параметры выставил в коде на этапе настройки - будем копать.

Сообщение отредактировал pcdeath - 2.5.2014, 12:15
Перейти в начало страницы
 
+Цитировать сообщение
dennis_ex
сообщение 30.4.2014, 17:44
Сообщение #95


Team member
*****

Группа: Пользователи
Сообщений: 390
Регистрация: 17.7.2013
Из: Красноярск
Пользователь №: 5398



Попробуем. Первая версия рисовала погоду на марсе: непонятные циферки и надпись секция умерла или лоу рпм 270.
Перейти в начало страницы
 
+Цитировать сообщение
pcdeath
сообщение 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
Перейти в начало страницы
 
+Цитировать сообщение
pcdeath
сообщение 18.4.2014, 20:07
Сообщение #97


Новичок (<30 постов)
*

Группа: Пользователи
Сообщений: 12
Регистрация: 27.1.2014
Пользователь №: 5724



ОК, благодарю. Буду знать, что искать.

Если у кого есть предложения/пожелания по допиливанию функционала и правке багов - кидайте, буду рассматривать.

Немного подправил. Теперь при напряжении на выходе датчика более 4,5V инфо о достижении макс.давления выводится на экран, если не производились вычисления по коррекции. Это сделано, чтоб информировать о том, что давление было больше, чем может снять датчик, но при этом не терять возможность привести даже эти показания к эталонным оборотам.

Код
код  удален  в  связи  с  обновлением  до  версии  0.14.


Сообщение отредактировал John - 27.6.2015, 9:36
Перейти в начало страницы
 
+Цитировать сообщение
John
сообщение 18.4.2014, 6:21
Сообщение #98


неабразованый калхозник
************

Группа: Администраторы
Сообщений: 1836
Регистрация: 13.10.2005
Из: Мытищи, Московская область, Россия.
Пользователь №: 4



Цитата(vl-alexander @ 18.4.2014, 5:57) *
Канавки под резинки в статорах у FC3S. У FD канавки в крышках.

Канавки под резинки в статорах у некоторых моторов FC3S.


--------------------
... что можно сделать из простой швейной машины Зингера? Небольшое приспособление - и получилась прелестная колхозная сноповязалка.
(с) Остап-Сулейман-Берта-Мария-Бендер
Перейти в начало страницы
 
+Цитировать сообщение
vl-alexander
сообщение 18.4.2014, 4:57
Сообщение #99


GOLD
************

Группа: Пользователи
Сообщений: 1604
Регистрация: 9.1.2011
Из: vl
Пользователь №: 4086



Цитата(pcdeath @ 16.4.2014, 18:45) *
Статоры только от fd(чего-то там), у которых канавки под резинки в статоре.

Канавки под резинки в статорах у FC3S. У FD канавки в крышках.
Перейти в начало страницы
 
+Цитировать сообщение
pcdeath
сообщение 16.4.2014, 10:45
Сообщение #100


Новичок (<30 постов)
*

Группа: Пользователи
Сообщений: 12
Регистрация: 27.1.2014
Пользователь №: 5724



Цитата(vl-alexander @ 16.4.2014, 9:20) *
pcdeath, отличная работа! Тоже посещали подобные мысли, но лень родилась вперед меня, и до реалиации дело не дошло.



offtop: на рпд от ВАЗа маздо-детали не подходят? Видел фотки потрохов заднеприводного РПД от ВАЗа - визуально от мазды ничем не отличается.


Благодарю. Меня заставила засесть за этот проект именно лень - каждыйраз возить в гараж бук, цеплять его куда-то и т.д... :-) А потом ещё руками выделять, считать. Лень же.

Запчасти подходят и от RX-7. Статоры только от fd(чего-то там), у которых канавки под резинки в статоре. Вкладыши, валы, маслосъёмка - полностью идентичны. Роторы можно ставить только вместе с маздоуплотнениями и
маздостаторами. Крышки... Вроде нет - там посадочные под маслофильтры в разных местах.
Кстати, если у кого есть убитые валы и статоры 12A и 13B - нужны. Также нужен передний ротор 12A. И если кто может подогнать комплект уплотнений Rotary aviation на один ротор 13B 3мм незадорого - буду признателен.В общем, пишите в личку, у кого что есть, и что за это хотите.

Цитата(dennis_ex @ 16.4.2014, 9:50) *
Предложение - предлагаю добавить при включении, после опроса датчика, самокалибровку в атмосфере. т.е. чтобы 0 выставился автоматически для датчика. Можно и самому допилить, но автору это будет сделать проще так как у него есть замеры от котоых можно оттолкнуться.
Так же вопрос по питанию хватит ли кроны? Просто при проведении замеров с ноута если подключаешь зарядку идут наводки. С батареи гораздо чище сигнал. Поэтому хочу питание организовать от батареи типа крона.


Так это... В коде и в описании калибровка есть и реализована:
Цитата
Если всё хорошо - датчики калибруются и можно начинать замер.


По поводу "Кроны" - думаю, должно хватить надолго: Ардуино потребляет от 12В порядка 150 мА при замере. От 9В, возможно, будет жрать чуть больше тока. А вообще, у неё по спецификациям предельные напряжения 6...20В, если ничего не путаю, так что хоть от суслика полевого питать - ей по фигу, лишь бы стабильно и без бросков. Я думаю организовать питание тремя элементами 18650 по 3,7В, если "Кроны"не будет надолго хватать.
Перейти в начало страницы
 
+Цитировать сообщение

8 страниц V  « < 3 4 5 6 7 > » 
Ответить в данную темуНачать новую тему
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 26.4.2024, 13:20