ФУОЗ +тахометр

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

В Си вообще степени  нет. Ну ардуиновскую функцию pow можно применить, но она универсальная, про вещественные. Свою написать можно.

long step(long x, byte st){ //целое число в положительную степень
    long res=1;
    for(int i=0;i<st; i++){
       res=res*x;
    }
   return res;
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

спасибо ! :) лучеееееее 7 нулей дописать.... :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

В Си вообще степени  нет. Ну ардуиновскую функцию pow можно применить

" Не путай миня, Алиса ! " - как это в языке нет степени ?!!!!!!!!!!!!!!!

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Математического оператора нет, а в форме функции - на то это и язык программирования.

SU-27-16 пишет:

спасибо ! :) лучеееееее 7 нулей дописать.... :)

Не понял. То есть сначала речь шла об экономии ресурсов, о производительности и таймерах, а теперь заставляем контроллер вычислять заранее известную константу (коли выбор стоял - так или эдак)? ;)

Кстати о степенях, компилятор вроде должен понимать какую-то форму этого - http://ru.wikipedia.org/wiki/Экспоненциальная_запись

Олег_Б
Offline
Зарегистрирован: 05.06.2014

Есть микросхема-процессор управления катушкой зажигания. В оригинале это L497 от Томсона, или её аналог 1055хп1, отечественная. В Январях 5.1, которые ставились на Жигули до 2005 года и в Бошах1.5.4 применялась, только не в самом контролере, а в модуле зажигания стояла. L497 выполняет несколько функций, ограничивает ток через катушку, ограничивает время, когда транзистор в линейном режиме находиться, то есть открывает ключ позже, чем приходит команда на его открытие. Отключает катушку зажигания, если сигнал не меняется более 2 секунд... То есть нормальный качественный дрАйвер для управления катушкой зажигания. 

Настоятельно рекомендую! Можно взять в виде готового коммутатора, но их надо вскрывать и смотреть, что там стоит, подделка или оригинал. Из отечественного самыми добротными были коммутаторы МЗАТЭ-2, Московский завод автотракторного электрооборудования. Там на керамической плате гибридная схема, резисторы на керамику напылённые... 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Олег_Б, это здорово, правда я не совсем понял, причем тут угол опережения.

-

Реально в итоге перешёл к измерению длины отрицательного импульса, правда, ленивым способом. Для вычисления времени опережения состряпал функцию. Действительно кусочно-линейная функция получилась. if-ы идут с высоких оборотов, так как им критично быстрее.



unsigned long advTime(unsigned long period){ //время опережения
    unsigned long result; //сравнение с половиной периода для заданных оборотов
    if(period<=5000) result=850; //при модуляторе 180-180
    else if(period<=7500) result=(250*period+875000)/2500; //участок 4000-6000
    else if(period<=15000) result=(400*period+5250000)/7500; //участок 2000-4000
    else if(period<=60000) result=(500*period+15000000)/15000; //участок 500-2000
    else result=(period/180)*7; //участок до 500, 7 градусов
    return result; 
}

Графики (правда от оборотов, а не от полупериода - отразить и растянуть).

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

расчёты - это запоздание....

я пошёл по пути привлечения железа, а не скетча

T1 - в режиме захвата, предделитель = 64 , по нарастающему фронту. значение счетчика это время оборота, т.е. - обороты. 

Т2 - отсчёт задержки фронта в зависимости от оборотов ( из таблицы )

вот таблица :

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

верхняя строка - номер выборки из таблицы, массива УОЗ ( вычисляется делением захваченного значения Т1 на 500 )

строка n - количество тиков посчитанных Т1 за оборот

строка t - время одного оборота

строка УОЗ - ....... заполнял с графика, пустые клетки - пока в лом считать ( потом, через экспоненту )

осталось пересчитать-определить предделитель  Т2  и углы пересчитать в тики Т2

итоговая таблица : (  n / 500  )   --->   (  УОЗ  ) - одномерный массив на 51 значение

можно

итоговая таблица : (  n / 250  )   --->   (  УОЗ  ) - одномерный массив на 101 значение

итоговая таблица : (  n / 200  )   --->   (  УОЗ  ) - одномерный массив на 126 значений

итоговая таблица : (  n / 100  )   --->   (  УОЗ  ) - одномерный массив на 251 значение

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ваш #56 -  это и есть таблица соответсвия, но только на 5 значений И ПОСТОЯННО ВЫСЧИТЫВАЕМАЯ :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

"... Действительно кусочно-линейная функция получилась. ..."

у вас - кусочно-ступенчатая !!!!!! вы не правильно графики нарисовали :(

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

(/)_0)

Каким макаром она на пять значений, серьёзно? Ничего что прямые наклонены? Ничего что переведеный в угол график ниже достаточно выпукл и ровен? Поосторожнее, ну.

А в коде есть такие штуки, неравенствами называются. Предпологаю, что вы не разглядели знаки "<" и, поторопившись с выводами, решили, что я ошибся.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

мой пардон :) заработался, не увидел что после результ=  - формула, а не значение :(

 

Олег_Б
Offline
Зарегистрирован: 05.06.2014

dezz0riented пишет:
Олег_Б, это здорово, правда я не совсем понял, причем тут угол опережения.

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

Олег_Б
Offline
Зарегистрирован: 05.06.2014

Угол зажигания зависит от оборотов и от наполнения цилиндра. Чем сильнее открыта дроссельная заслонка, тем больше свежей смеси попадает в цилиндр, смесь горит быстрее и УОЗ (угол опережения зажигания) должен быть позже. В механических трамблёрах есть центробежный регулятор и вакуумный регулятор опережения. Центробежный - это вот то, что тут разрабатывается, а вакуумный как раз корректирует УОЗ в зависимости от нагрузки. Чем больше давление в ресивере перед клапанами, тем больше свежей смеси попадает в цилиндр, и зажигание надо делать позже. По крайней мере хотя бы корректор сделать на переменном резисторе, который тупо сдвигал бы полученный УОЗ на всём диапазоне +/- 10...20 градусов. 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Олег_Б пишет:

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

То есть мы тут неприменяемую фигню делаем? ;)

Задача моего устройства, например, как первом посте описано - это имитировать импульсы с датчика Холла, но со сдвигом. Они пойдут на коммутатор, в котором, я так понял, уже и стоит ваш L497 или как его там. То есть готовое устройство.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Олег_Б пишет:

Угол зажигания зависит от оборотов и от наполнения цилиндра. Чем сильнее открыта дроссельная заслонка, тем больше свежей смеси попадает в цилиндр, смесь горит быстрее и УОЗ (угол опережения зажигания) должен быть позже. В механических трамблёрах есть центробежный регулятор и вакуумный регулятор опережения. Центробежный - это вот то, что тут разрабатывается, а вакуумный как раз корректирует УОЗ в зависимости от нагрузки. Чем больше давление в ресивере перед клапанами, тем больше свежей смеси попадает в цилиндр, и зажигание надо делать позже. По крайней мере хотя бы корректор сделать на переменном резисторе, который тупо сдвигал бы полученный УОЗ на всём диапазоне +/- 10...20 градусов. 

есть две зависимости УОЗ - от оборотов и от нагрузки

скорость объёмного сгорания - СОС ( названия мои, для краткости ) - одинакова  на всех оборотах, но на 600 при УОЗ она оптимальна ( давление газов достигнет макс значения когда поршень пройдёт ВМТ градусов на 5....10 и газы будут толкать поршень вниз ). при оборотах 3000, например, давление газов достигнет макс значения когда поршень пройдёт ВМТ градусов на 40....90 и газы будут расширяться за поршнем просто так, чуть-чуть нажимая на него ( позднее зажигание ). способ устранить это - РАНЬШЕ поджигать смесь, ибо скорость поршня велика... для этого служил раньше центробежный регулятор УОЗ - больше скорость поршня - раньше поджигаем... Вот этим и занимается топикстартер - созданием ЭЛЕКТРОННОГО регулятора УОЗ в зависимости от оборотов....

 

мощность.... её характеризует разрежение во впускном коллекторе движка.... чем больше газу, тем большее разрежение во впускном тракте двигателя, тем больший УОЗ надо выставить, чтобы обеспечить наискорейшее увеличение оборотов движка ( обороты пропорциональны отдаваемой мощности )

 

применение :

0 - ни одна регулировка не применяется

1 - УОЗ от оборотов

2 - УОЗ от вакуумного датчика ( мехиническая связь )

3 - УОЗ от оборотов И УОЗ от вакуумного датчика ( самое оптимальное )

....вот ТС и мутит здесь тему #1 ( хотя, если пришпандорить к моцику датчик искрообразования от "ОКИ" с вакуумным опереженим УОЗ ( от впускного тракта ) - будет тема #3 :)  если шишка справа на движке не будет мозолить глаза   )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

так что юзание L497 отпадает.... будет использоваться штатный коммутатор....

за схему "L497 от Томсона" - спасибо ! есть их 8 штук аж - пойду сломаю.....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не нано горячицца ! "......То есть мы тут неприменяемую фигню делаем? ;) .....) а то получится как здесЯ - http://arduino.ru/forum/otvlechennye-temy/zlye-lyudi

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

"..........тем больше свежей смеси попадает в цилиндр, смесь горит быстрее и УОЗ........"

жиклёры на то и стоят, чтобы смесь всегда была ОПТИМАЛЬНАЯ, поэтому и скорость её сгорания - постоянная величина !

...и уж потом придумали датчики кислорода, регулировать качество смеси

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

это не рабочий код, так.... подготовка....

volatile unsigned int NclkTCNT1;
volatile unsigned int RPM = 0;            // обороты для Сериала
volatile byte RPM100 = 0;                 // сотни оборотов для индекса таблицы "обороты-УОЗ" - 60 значений ( на выбор )
byte AngleDelayChargeBabin [] PROGMEM =   // таблица "обороты-задержка накопления бабины" - числа пока не рассчитаны
{
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF
};
byte AngleChargeBabin [] PROGMEM =   // таблица 10 х Тзаряда - числа пока не рассчитаны
{ 
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF
};
byte AngleIgnition [] PROGMEM =   // таблица "обороты-УОЗ" - числа пока не рассчитаны
{
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF ,
  0xFF
};
//==============================================================================================================================
void setup( )
{
//**************************
// Счётчик_0
  DDRD = DDRD | B01000000;     //  pinMode( 6 , OUTPUT );   // OC0A - выход на коммутатор
//  PORTD = PORTD | B00000000;
  TCNT0  = 0;
  // TIMSK0 >>> OCIE0B - 2  OCIE0A - 1  TOIE0 - 0
  TIMSK0 = ( 1 << OCIE0A );
  // TCCR0A >>> COM0A1 - 7  COM0A0 - 6  COM0B1 - 5  COM0B0 - 4  WGM01 - 1  WGM00 - 0
  // OC0A - 00=disconnected , 01=Toggle , 10=Clear , 11=Set
  TCCR0A = ( 1 << COM0A1 ) | ( 0 << COM0A0 ) | ( 1 << WGM01 ) | ( 0 << WGM00 );
  // TCCR0B >>> FOC0A - 7  FOC0B - 6  WGM02 - 3  CS02 - 2  CS01 - 1  CS00 - 0
  TCCR0B = ( 1 << FOC0A ) | ( 0 << FOC0B ) | ( 0 << WGM02 ) | ( 0 << CS02 ) | ( 0 << CS01 ) | ( 0 << CS00 ) ;
  // CS >>> 0-stop, 1-/1, 2-/8, 3-/64, 4-/256, 5-/1024, 6-externalT0falling, 7-externalT0rising
//**************************
// Счётчик_1
  DDRB = DDRB | B00000000;     // pinMode( 8 , INPUT );       // вход от датчика Холла
  PORTB = PORTB | B00000001;   // digitalWrite( 8 , HIGH );   // резистор к VCC
  TCNT1  = 0;
  // TIMSK1 >>> ICIE1 - 5  OCIE1B - 2  OCIE1A - 1  TOIE1 - 0
  TIMSK1 = ( 1 << ICIE1 );
  // TCCR1A >>> COM1A1 - 7  COM1A0 - 6  COM1B1 - 5  COM1B0 - 4  WGM11 - 1  WGM10 - 0
  TCCR1A = ( 0 << WGM11 ) | ( 0 << WGM10 );
  // TCCR1B >>> ICNC1 - 7  ICES1 - 6  WGM13 - 4  WGM12 - 3  CS12 - 2  CS11 - 1  CS10 - 0
  // CS >>> 0-stop , 1-/1 , 2-/8 , 3-/64 , 4-/256 , 5-/1024, 6-externalT1falling, 7-externalT1rising
  TCCR1B = ( 0 << ICNC1 ) | ( 1 << ICES1 ) | ( 0 << WGM13 ) | ( 0 << WGM12 ) | ( 0 << CS12 ) | ( 0 << CS11 ) | ( 0 << CS10 ) ;
  // TCCR1C >>> FOC1A - 7  FOC1B - 6
//**************************
  NclkTCNT1 = 0;
//  Serial.begin( 9600 );
}
//==============================================================================================================================
ISR( TIMER1_CAPT_vect )
{
  TCNT1 = 0;
  NclkTCNT1 = ICR1 + 34;   // 34 такта - задержка от времени фронта до выполнения этой строки ДЛЯ сохранение RG-ов в стэк
  RPM = int( 96 / NclkTCNT1 * 10 ^ 7 );    // X=60/(N*16000000)=60*16000000/N=96/N*10^7
//  RPM50 = RPM % 50;   // 120 значений ( на выбор )
//  RPM100 = RPM % 100;   //  60 значений ( на выбор )
// загрузить Счётчик_2 = AngleDelayChargeBabin [ RPM100 ];
// разрешить прерывания Счётчик_2

// загрузить Счётчик_2 = AngleIgnition [ RPM100 ];
// разрешить прерывания Счётчик_2
}
//==============================================================================================================================
ISR( TIMER0_COMPA_vect )
{
  
}
//==============================================================================================================================
void loop( )
{
//  Serial.println( RPM );
  delay( 500 );
}
//==============================================================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

пока - 908 байт :) и тинька потяне такое..... :)

Олег_Б
Offline
Зарегистрирован: 05.06.2014

SU-27-16 пишет:

есть две зависимости УОЗ - от оборотов и от нагрузки

скорость объёмного сгорания - СОС ( названия мои, для краткости ) - одинакова  на всех оборотах,

......

мощность.... её характеризует разрежение во впускном коллекторе движка.... чем больше газу, тем большее разрежение во впускном тракте двигателя, тем больший УОЗ надо выставить, чтобы обеспечить наискорейшее увеличение оборотов движка ( обороты пропорциональны отдаваемой мощности ) 

Скорость сгорания смеси зависит от наполнения цилиндра, то есть от "нагрузки". Чем больше свежей смеси попадает в цилиндр, тем меньше остаётся в нём отработанных с прошлого цикла газов, и смесь горит быстрее. Кроме того при одном и том же ходе поршня и одной и той же степени сжатия из-за различного разряжения во ресивере в цилиндр попадает разное количество смеси. 

Например, дроссель закрыт, в ресивере разряжение в пол-атмосферы, в цилиндр что-то всасывается, сжимается, причём будет всасываться и то, что только что улетело в колектор, во время перекрытия клапанов, и в то же время при полностью открытом дросселе в ресивере почти атмосферное давление, остатки сгоревших газов лучше выталкиваются в выхлопную трубу, и после зжатия в цилиндре молекулы топлива и окислителя плотнее расположены друг другу. В таком виде смесь сгорает быстрее, чем при закрытом дросселе, разряжении в ресивере и меньшем наполнении цилиндра. 

Вот к примеру таблицы УОЗ из контролера Январь5.1.  Цикловое наполнение - это количество смеси, попадающее в цилиндр в одном такте. Собственно все автомобильные компьютеры в мире в первую очередь вычисляют, сколько именно смеси попало в цилиндр, или попадёт, и вот на эту порцию смеси рассчитывают количество топлива и какое опережение зажигания должно быть. 

***********

Так, таблицу чуть позже, не смог вставить картинку, её надо куда-то разместить оказывается... 

Олег_Б
Offline
Зарегистрирован: 05.06.2014

Но в принципе, на сайте Алмисофт.ру есть фриварный СТР, можно скачать прошивку для того же Января5.1 и посмотреть в нём. 

Олег_Б
Offline
Зарегистрирован: 05.06.2014

Картинки надо где-то положить, а потом тут ссылка?

 

Олег_Б
Offline
Зарегистрирован: 05.06.2014

ChipTuningPRO 2.15 freeware  Качаем программу

http://chiptuner.ru/download/serecu/j5v13i02.zip  Качаем прошивку для Января5.1.1

Запускаем в программе СТР.ехе и открываем файл j5v13i02, который уже разархивировали. 

В программе жмём кнопку "Настроить", в выпавшем меню - "Зажигание" - в выпавшем меню - "УОЗ какой-нибудь"

На получившемся графике внизу убираем галочку "все", и движком меняем наполнение цилиндра, то есть расход воздуха. 

Наблюдаем зависимость Угла Опережения Зажигания от оборотов при различной нагрузке на двигатель. В данной прошивке используются только "УОЗ для мощностного" и "УОЗ для экономичного режима без ДК", и это одна из самых удачных заводских прошивок, то есть и топливо, и УОЗ там очень хорошо сделаны. Двигатель ВАЗ, 1.5 литра, впрыск одновременный, но собственно интересует пример реализации УОЗ. 

Олег_Б
Offline
Зарегистрирован: 05.06.2014

SU-27-16 пишет:

"..........тем больше свежей смеси попадает в цилиндр, смесь горит быстрее и УОЗ........"

жиклёры на то и стоят, чтобы смесь всегда была ОПТИМАЛЬНАЯ, поэтому и скорость её сгорания - постоянная величина !

...и уж потом придумали датчики кислорода, регулировать качество смеси

Да, ошибка здесь. Жиклёры, датчики кислорода, это для того, чтобы на 14.7 литра свежего воздуха влить 1 литр чистого бензина. И примерно такая же смесь плюс минус содержится в ресивере. Но в самом цилиндре свежая смесь смешивается с остатками отработанных газов, особенно на малых нагрузках, и в зависимости от нагрузки на двигатель, а именно разряжения в ресивере, после закрытия клапанов и сжатия смеси смесь может иметь различную плотность. Причём чем меньше плотность смеси, тем больше в ней остатков продуктов сгорания от предидущего цикла, и такая разбавленная неплотная смесь горит медленнее, чем сильнее сжатая чистая смесь бензина и воздуха. То есть при большой нагрузке давление в ресивере максимальное и в цилиндр попадает много свежей смеси при большем давлении, чем при малой нагрузке.

Параметр, меняющий УОЗ из-за нагрузки, как раз и учитывает скорость горения смеси, чтобы получить максимальный пик давления в цилиндре сразу после прохождения поршнем верхней мёртвой точки

 

Я диагностикой и ремонтом инжекторных двигателей занимаюсь с 1992 года, разве что в Си полный дурак. Но на ассемблере для 8051 несколько программ и устройств сделал, вот типа такого:

http://chiptuner.ru/content/pub_03/

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Олег_Б пишет:

Но в принципе, на сайте Алмисофт.ру есть фриварный СТР, можно скачать прошивку для того же Января5.1 и посмотреть в нём. 

моя не против ВСЕХ поправок.... вы спец по ДВС.... моя пока только хочет создать систему, которая будет работать на ардуине... через таблицу !!!!!! как моя и говорила раньшеееее - настройка системы будет заключаться в СОСТАВЛЕНИИ ТАБЛИЦЫ ! изменение этой таблицы - есть ЧИПТЮНИНГ.... а код программы менять не нужно...

 

моя не знает, что есть Января5.1 :( и не хочЮ знать ( нет времени )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

"...........Я диагностикой и ремонтом инжекторных двигателей......."

щас речь идёт про моцоцикл.... читайте выше :)

Олег_Б
Offline
Зарегистрирован: 05.06.2014

Бензин в цилиндре на всех ДВС горит по одним и тем же законам. 

Ещё в начале 90-х видел у кого-то на мотоцикле тумблер, УОЗ раньше-позже. На разгон, когда обороты низкие, ставит позже, от светофора, и разогнался, обороты выше - переключил на более ранний угол. Но, собственно, хотел подсказать, что требуется два параметра, обороты и давление в ресивере (нагрузка), можно сделать только по оборотам (ваше дело), а можно сразу закладывать возможность расширения, и после отладки УОЗ по оборотам добавлять коррекцию по нагрузке. 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Олег_Б, как говорится: "Лучшее - враг хорошего". К совершенству-то можно бесконечно стремиться, только игра не стоит свеч. Дефолтный тупой прерыватель заменить и ладно. :) А так вы конечно правы, наверное.

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Вот какая мысль промелькнула - надо занизить характеристику, потому что БСЗ итак на некоторый угол ставится (16 градусов например), и это надо будет компенсировать.

Железки кажись сделал, теперь надо некоторый минимум корпуса, чтобы можно было проверять всё это.

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Всё в стиле первого блина.

Интересная реакция - если оставить модулятор в датчике Холла, то искрой будет бить постоянно, как из пулемёта. Протеус меня к такому не готовил. :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

давненько вас не было здесЯ.....

Протеус - отстой, не всё показывает - осциллограф лучшеееееее

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

> вот какая мысль промелькнула - надо занизить характеристику, потому что БСЗ итак на некоторый угол ставится (16 градусов например), и это надо будет компенсировать.

поточнее вопрос задайте

Олег_Б
Offline
Зарегистрирован: 05.06.2014

Реальный датчик Холла ставится на самое раннее зажигание, а контролер просто отрабатывает задержку. Так результат точнее. 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

SU-27-16 пишет:

поточнее вопрос задайте

Да то не вопрос был, так, мысль вслух. :)

Олег_Б пишет:

Реальный датчик Холла ставится на самое раннее зажигание, а контролер просто отрабатывает задержку. Так результат точнее. 

Вполне может быть, только фишка в том, что может понадобиться вырубить девайс и ездить на голом БСЗ, а если оно по дефолту будет на 30-40 градусов, то пинаться будет неслабо. Да и для движка вряд ли полезно.

 

Пока что обвес такой получается (если не показывать стабилизатор и тумблер). Резисторы по 1.5К, конд 10нФ, транзистор 2SC2274F.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Олег_Б пишет:

Реальный датчик Холла ставится на самое раннее зажигание, а контролер просто отрабатывает задержку. Так результат точнее. 

реальный датчик нуно ставить на УОЗ 2....3 градуса ( чтобы при выходе из строя устройства продолжать ездить )

а вот задержку нужно формировать от ВМТ ПРЕДЫДУЩЕГО оборота ! задержка на 357...358 градусов даст опережение на - выше....

задержка на 325 градусов даст опережение 35 градусов, а точность нисколько не пострадает....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

R3 - лучше 10 килоом ( зачем ДХ мучить током таким ) и зачем сигнал подан на ДВА пина сразу ?

а как индикатор реализован ?

скетч итоговый - разместите ? :) или он секретный ? :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

dezz0riented пишет:

Всё в стиле первого блина.

Интересная реакция - если оставить модулятор в датчике Холла, то искрой будет бить постоянно, как из пулемёта. Протеус меня к такому не готовил. :)

значит в коде недосмотрели - если обороты менее 500, например - искру душим

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

На два пина - на прерывания по обоим фронтам. Возможно тупо, может можно просто по CHANGE и ногу прочесть, но так понятнее, и код проще. :)

Про скетч и индикатор чуть позже докину.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

dezz0riented пишет:

На два пина - на прерывания по обоим фронтам. Возможно тупо, может можно просто по CHANGE и ногу прочесть, но так понятнее, и код проще. :)

Про скетч и индикатор чуть позже докину.

надо код смотреть.... по CHANGE невозможно определить ВМТ или НМТ.... ждём-ссссс....

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Схема индикатора обычная. Так как индикатор двузначный, сэкономил ногу и выбор сделал по одному сигналу, а VT1 - инвертор (КТ312Б). VT2 и VT3 другие, с предельным Iк 150 мА. Резисторы по 270 и 330 Ом.

(Пока код от комментариев и дебажных строк чистил, мог что-нить удалить случайно)



byte indicator,sel,digit[2]; //выбор индикатора и 2 отображаемые цифры
unsigned int rpm; //частота оборотов
unsigned long period,prevPeriod; //период вращения
volatile byte flag; //признак прерывания
volatile byte flagCharge; //признак второго прерывания
unsigned long tCur,tSw,tHallFall,tHallRise; //время текущее, переключения индикатора, срабатывания датчиков (на задний и передний)
unsigned long tAdvance; //время измерения периода и время с опережением
long deltaP; //разница периодов
byte outStatus; //флаг состояния выхода
byte edgeStatus; //состояние "истинности" для заднего фронта (чтобы передний фронт обрабатывался только когда надо)


void Print7seg(char a){
	PORTD=PORTD&0x0F;
	PORTB=PORTB&0xF8;// сброс
	switch(a) {
		case 0: {
			PORTD=PORTD|0xF0;
			PORTB=PORTB|0x03; //вывод
			break;
		}
		case 1: {
			PORTD=PORTD|0x60;
			break;
			//PORTB=PORTB|0x00;
		} 
		case 2: {
			PORTD=PORTD|0xB0;
			PORTB=PORTB|0x05;
			break;
		}
		case 3: {
			PORTD=PORTD|0xF0;
			PORTB=PORTB|0x04;
			break;
		}
		case 4: {
			PORTD=PORTD|0x60;
			PORTB=PORTB|0x06;
			break;
		}
		case 5: {
			PORTD=PORTD|0xD0;
			PORTB=PORTB|0x06;
			break;
		}
		case 6: {
			PORTD=PORTD|0xD0;
			PORTB=PORTB|0x07;
			break;
		}
		case 7: {
			PORTD=PORTD|0x70;
			break;
			//PORTB=PORTB|0x07;
		}
		case 8: {
			PORTD=PORTD|0xF0;
			PORTB=PORTB|0x07;
			break;
		}
		case 9: {
			PORTD=PORTD|0xF0;
			PORTB=PORTB|0x06;
			break;
		}
	}
}

void setup()
{
  delay(250);   /* -- начальная установка и сброс -- */
  DDRD=DDRD|0xF0; //OUT - 4..7
  DDRD=DDRD&0xF3; //IN - 2,3
  DDRB=DDRB|0x3F; //OUT - 8..13
  tCur=micros();
  tSw=tCur;
  rpm=0; //частота вращения - сброс
  indicator=0; //начальный отсчет для динамической индикации
  sel=0;
  attachInterrupt(0,detectSpark,FALLING); //прерывание на 2 по заднему фронту
  attachInterrupt(1,detectCharge,RISING); //прерывание на 3 по переднему
  flag=0; //флаги
  flagCharge=0;
  period=0;
  prevPeriod=0; //периоды (частичные)
  tHallFall=0;     //время срабатывания датчиков
  tHallRise=0;
  tAdvance=0; //опережение
  deltaP=0;  //поправка
  outStatus=0;
  edgeStatus=0;
  PORTB=PORTB|0x20; //снять сигнал с ноги 13 с учетом инверсии

}

void detectSpark(){ //обработчик прерывания
	flag=1;	//оборот был
}

void detectCharge(){
    PORTB=PORTB&0xD7; //установить сигнал на ногу 13 c учетом инверсии
	flagCharge=1;
}

long advTime(){ //время опережения
	unsigned long result; //сравнение с половиной периода для заданных оборотов
	unsigned long corrPeriod;
	corrPeriod=period-deltaP;	
	if(corrPeriod<=5000)  result=850;   //при модуляторе 180-180
	else if(corrPeriod<=7500) result=(250*period+875000)/2500; //участок 4000-6000
	else if(corrPeriod<=15000) result=(400*period+5250000)/7500; //участок 2000-4000
	else if(corrPeriod<=60000) result=(500*period+15000000)/15000; //участок 500-2000
	else result=(corrPeriod/180)*7; //участок до 500, 7 градусов
    result=result-((corrPeriod/180)*16); //поправка на обычную БСЗ
	return result;
} 


void ignite(){ //основные вычисления, связанные с зажиганием
		   if(!prevPeriod){ //еще нельзя вычилить разницу между периодами
			   period=tHallRise-tHallFall; //получим период (50% для предварительно выбранной формы модулятора)
			   prevPeriod=period;
			   //Serial.print("On -if(!period)- ");
		   }
		   else{ //если период n-1 - не "пустышка"
			   prevPeriod=period;
			   period=tHallRise-tHallFall; //получим период
			   //Serial.print("On -else- ");
		   }
		    deltaP=((long)prevPeriod-(long)period)/2; //коэффициент 0.5. не делить сдвигом, тип со знаком

		   tAdvance=tHallRise+period/*-deltaP*/-advTime();
		   tAdvance=tAdvance-deltaP;
}


void loop()
{

   tCur=micros();
   if(tCur>=tAdvance&&outStatus) {
	                  PORTB=PORTB|0x20; //снять сигнал с ноги 13 с учетом инверсии
		     outStatus=0;	   
             }
			 
			 
   //индикация
   if(tCur-tSw>55556){ //смена через 1/18 секунды
       if(tCur-tHallFall>2500000){ //сброс при ПРОСТОЕ
	       rpm=0; //отображать 0 на дисплее
		   period=0;
		   prevPeriod=0;
		   edgeStatus=0;
       }
	   else {
	   if(!period) rpm=0;
	   else rpm=(1000000/(period<<1))*60;  //Нахождение числа оборотов. Сдвиг влево на 1 = умножение на 2 (для модулятора 180-180)
	   rpm=rpm/100; //под двухзначный индикатор
	   }
	   if(rpm/10>0) digit[1]=rpm/10;
       else digit[1]=0;   //десятки (тысячи)
       digit[0]=rpm%10;  //единицы (сотни)
       indicator++;
       sel=indicator%2;
       if(sel) PORTB=PORTB|0x18;
       else PORTB=PORTB&0xE7; //управляющий сигнал - снимать с 12 или 11
       Print7seg(digit[sel]);
	   tSw=tCur;
   }

  
   if(flag){ //если был оборот (задний фронт)
	   //ignite();
	   tHallFall=micros();
	   flag=0;
	   edgeStatus=1;
	   //Serial.println("FLAG");
   }
   
   if(flagCharge){  
      if(edgeStatus) {//если был второй фронт после первого
	      tHallRise=micros();
	      ignite();
	      outStatus=1;
	  }
	  flagCharge=0;
	}


}




 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

нано ? под ето ? экономить ноги ? ЗАЧЕМ ?

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Как зачем, на межплатное соединение. Чтоб один лишний мгтф не припаивать :D

Комбинация вопросов выглядит как атака. Всё равно прототип, чо кипятиться?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

да НЕТ...... я учусь в чём-то.... хотел вникнуть....

всегда есть три основных персонажа - генератор идей, критик и исполнитель :)

...первым моя чуть раньше был, щас пока вторым действую....

 

ближе к теме - вы отжали одну ногу ( транзистором ) , итого 7 линий - данные, VCC, GND и управление ( через инвертор ) = 10 линий

а почему бы тогда не поставить сдвиговый резистор ?

...такт, данные, VCC, GND = 4 ( против 10 )

от дуни к индикатору - 4 провода.... а уже там на своей плате от регистра - 7 линий данные , 1 линия управление через тот же инвертор транзисторный....

про прототип понятно..... ещё - тахометр из #16  !!!!!! посмотрите на К155ИД11 - 4 корпуса и 32 светодиода - тахометр 0.......6400 rpm ( каждый светик - 200 rpm ).... красиво... 

 

код очень сложно читаемый..... комментов мало.... И на мой взгляд - избыточен....
 
задач-то всего две : от ДХ замерить RPM и в зависимости от RPM выдать на какой-то пин ( на коммутатор ) задержанный фронт
 
 
атаки и кипячения не нужны ни вам,  ни мине ! :)
dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

SU-27-16 пишет:

а почему бы тогда не поставить сдвиговый резистор ?

Сдвиговый регистр SIPO. Во-первых, тогда придётся программой такт отбивать и по одному биту скармливать - это и время выполнения, это и код сложнее будет... я так себе это представляю, а в "релизе" может и следует так сделать. Во-вторых, регистр ещё найти надо. :)

SU-27-16 пишет:

ещё - тахометр из #16 !!!!!! посмотрите на К155ИД11 - 4 корпуса и 32 светодиода - тахометр 0.......6400 rpm ( каждый светик - 200 rpm ).... красиво...

Ну так... видел. И взял на вооружение. :) Я ж примерно так конечное и представляю себе. На левой части приборной панели круг прорезать, платы заказать уже, а не с хлорным мучаться без металлизированных отверстий... 

SU-27-16 пишет:

код очень сложно читаемый..... комментов мало.... И на мой взгляд - избыточен....

Не всё так плохо, видали и хуже. :) Где комента не хватает - попробуйте спросить. А избыточен-то в каком плане? Каждой переменной применение находится... А так вы может просто со своим проектом сравниваете, у вас алгоритм другой.

SU-27-16 пишет:

значит в коде недосмотрели - если обороты менее 500, например - искру душим

Эм... может быть дело где-то в обвесе. Или вообще луна в сатурне была. Когда я писал прогу, я предполагал, что искра должна выдаваться один раз через некоторое время после переднего фронта (начало зарядки) только при условии, что до этого засекли задний фронт (следовательно, смогли померять время между фронтами и получить полупериод).

SU-27-16 пишет:

R3 - лучше 10 килоом ( зачем ДХ мучить током таким )

От стабилизатора ардуины напряжение в 3 раза меньше, чем в бортовой сети. Ничо не случится с ДХ от 3 мА. :)

SU-27-16 пишет:

атаки и кипячения не нужны ни вам, ни мине ! :)

Ну это радует. Но на атаку всё равно было похоже :D Стройте предложения как-нить так, чтоб не пугать лишний раз.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Датчик Холла на Планете это плохо. Генератор то с обмоткой возбуждения постоянкой, то есть электромагнит. Много-много лет томя я заморачивался на эту тему, даже годный оптический датчик в замену ДХ сотворил. http://www.motoizh.ru/index.php/component/content/article?id=656

А с ФУОЗ в то же самое время Саруман с оппозита занимался вполне удачно. Исходную тему не нашел, но нашел в ВК страницу вроде оно. http://vk.com/fuoz_saruman

... а потом я пересел на японца.

 

Борода Столлмана
Offline
Зарегистрирован: 23.09.2015

Извиняюсь за некропостинг, но крайне интересна сия тема.

Топик стартер реализовал свой проект ? Как себя показало ? Тут высказыют мнение, что ардуино нано не справиться вот видео, где человек проводит нагрузочное тестирование (мутит я так понял приблуду, чтобы отказаться от трамблера, подробностей не знаю)

https://www.youtube.com/watch?v=QQTXMVakvS4

У меня идея реализовать ФУОЗ с регулровкой на переменном резистрое угла УОЗ, все в общем-то как у автора, но сделать я хочу это для автомобиля (для использования с ГБО, там медленнее горит, чем бензин). Алгоритм я вижу такой берем сигнал с датчика Холла, вносим временную задержку до 900 оборотов 0 градусов (заводится на бензине), до 2000 об, например 3 градуса, 2000-3500 5 градусов, ну и 3500-6000 7 градусов. Цифры пока условны. Далее подаем откорректированный импульс на штатный ЭБУ машины. Ключевой является возможность изменять градус переменным резистором. Какие изменения нужно внести в код, чтобы получить данный функционал ? Может быть за год кто-то реализовал подобное ?

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Борода Столлмана пишет:

Далее подаем откорректированный импульс на штатный ЭБУ машины. Ключевой является возможность изменять градус переменным резистором. Какие изменения нужно внести в код, чтобы получить данный функционал ? Может быть за год кто-то реализовал подобное ?

 

Топик стартер проект не реализовал ещё :( И фиг знает когда возьмется.

Хотя блок и был собран, но испытания на "стенде" пока не удались. Свеча то молчала, то строчила как пулемёт (причём в обоих режимах - с мозгами и без). Как мне подсказал сенсей, такой результат мог быть из-за сдохшего аккумулятора (я тогда зажигание забыл выключить на пару дней). Новый аккум на зиму покупать я тогда, понятно, не стал.

Какие изменения нужно внести? Если смотреть на моем коде, то заменить нутро функции advTime(). С переменным резистором... ну, AnalogRead() c нужной ноги и в том же advTime делаем что хотим.

Прикольно что кто-то на видео эксперименты с похожим устройством снял, только длинновато оно и характер как у "заметки для личных целей", тяжело улавливать инфу. Что утверждается и на какой минуте смотреть?

Борода Столлмана
Offline
Зарегистрирован: 23.09.2015

С третьей минуты смотрите. Задержка 20микросекунд, при 8000 об/мин это около 1 градуса.