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

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

Всем здравствуйте! Пытаюсь разработать сабж на Arduino Nano, вклинивающийся в бесконтактную систему зажигания.

Сигнал о совершившемся обороте берётся с датчика Холла (типа того, что в ВАЗах), соответственно если устройство включено, то оно "подменяет" сигнал датчика Холла похожим, но один из фронтов чуть-чуть отодвигается в зависимости от числа оборотов. На выводе 4-10 висят семисегментные, 12 переключает их (динамическая индикация, вывод 11 отказался подчиняться), на выводе 2 - прерывание от датчика (задний фронт), вывод 3 в теории должен выдавать сигнал, похожий на сигнал с датчика, однако увы. Система не работает ни в эмуляторе (например, протеусе), ни в макете (для генерации импульсов использовал вторую - Uno).

На диаграмме в эмуляторе замечал, что система пропускает прерывания, но у меня есть основания полагать что я исправил эту проблему. Суть была в том, что я неоднократно использовал micros() для уточнения времени, а в ней запрещается прерывание функцией cli().

В чём ещё может быть проблема?

 









unsigned char indicator,sel,digit[2]; //выбор индикатора и 2 отображаемые цифры
unsigned int i,debug,debug2; //служебные
unsigned long preInter,inter; //переменные для опроса
unsigned int freq; //частота вращения коленвала/генератора
unsigned long prevPeriod,period; //период вращения (+предыдущий)
volatile char engine; //состояние двигателя
unsigned long tCur,tSw; //время текущее, перекл индикатора
unsigned long tHall,tHallPrev,eval; //время получения сигналов с датчика Холла
unsigned long tSignalStart,tSignalEnd; //время сигнала подмены датчика Холла
volatile char flag; // признак оборота

...

ISR(INT0_vect){
   cli();
   engine=1; //двигатель работает   
   flag=1; //произошел оборот
   sei();  
}

void setup() {
  delay(750);
  //DDRD=DDRD|0xF8; //вывод на 3..7
  DDRD=DDRD|0xFB; //вывод на 0,1,3..7 (0 и 1 лишь использовались для теста на эмуляторе)
  DDRB=DDRB|0x1F; //вывод на 8..11 + управл
  DDRD=DDRD&0x04; //ВХОД на D2. Для "допрерывания"
  eval=0;
  tCur=micros();
  tSw=tCur;
  freq=0;
  indicator=0; //начальный отсчет для динамической индикации
  sel=0;
  //attachInterrupt(0, detect, FALLING); //Прерывание на D2 по ЗАДНЕМУ ФРОНТУ 
  EICRA |= (1<<ISC01); //хардкорный способ
  EIMSK |=(1<<INT0);
  flag=0;
  engine=0;
  inter=PIND&0x04; //прочесть ногу D2
  preInter=inter;
  prevPeriod=0; //изначальные периоды оборотов - сброс
  period=0;
  tHall=0;
  tHallPrev=0;
  tSignalStart=0;
  tSignalEnd=0;
}

...

void ignitionCalc(){ //формирование угла опережения зажигания (???)
   tHallPrev=tHall;
   tHall=tCur; //micros(); //уточнить текущий момент времени //-- Попробовать прикинуть задержку
   if(tHallPrev){ //если частоту вращения уже можно вычислить
    	if(!prevPeriod){ //но еще не разницу между периодами
		   period=tHall-tHallPrev; //получим период
		   prevPeriod=period;
		 }
		 else{ //если период n-1 - не "пустышка"
		    prevPeriod=period;
			period=tHall-tHallPrev; //получим период
		 }
		freq=(1000000/period)*60; //оборотов в минуту для отображения на экране 
		tSignalStart=(period/3)+tHall;
		tSignalEnd=(2*period/3)-(1250+(prevPeriod-period))+tSignalStart; //вычисление длительности импульса (+опережение) 1250 поменять
   } 
   
}

void loop(){
  
    tCur=micros(); //текущее время
	if(tCur>=tSignalStart&&tCur<tSignalEnd) PORTD=PORTD|0x08; //установить на pin 3 сигнал (коммутатору)
	if(tCur>=tSignalEnd) PORTD=PORTD&0xF7; //снять с pin 3 сигнал
    
    //индикация
	if(tCur>tSw+10000){ //если время переключиться
      ...
    }
	
	if(!flag){ //отлов пропущенных прерываний
	    cli();
	   inter=PIND&0x04;
        if(!inter&&preInter) { //задний фронт
		    flag=1;
                             engine=1;
                            }
        preInter=inter;
        sei();		
	}
	
	if(flag&&engine){ //если на прерывание надо отреагировать и двигатель работает
	   ignitionCalc();
	   flag=0;
	}
	
	//tCur=micros();
	eval=tHall+1500000;
        if(tCur>eval&&engine){ //если 1.5 сек не было оборотов
	    engine=0; //двигатель не работает
        freq=0;    //сброс всего
        flag=0;
        prevPeriod=0; //либо наоборот сделать много?
        period=0;
        tHall=0;
        tHallPrev=0;
        tSignalStart=0;
        tSignalEnd=0;  
	}	

}

 

 

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

Либо всем по барабану, либо никто не видит проблемы. :) Оба варианта понимаю, однако: неподчинение 11 было связано с тем, что в функции печати (вместо которой троеточие) в 7-сегментник я сбрасывал лишний бит, а отказ светодиода показывать сигнал на 3-й ноге объяснялся крайне привередливым контактом.

В итоге в макете схема выглядит примерно рабочей (пока руки до осцилографа не добрались), а к протеусу доверие слегка пошатнулось.

Вопрос в сторону: кто-нибудь сталкивался с тем, что Nano на штыревой линейке в бредборд не встаёт?

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

с наной очень просто - ластик сверху, чтобы не поцарапать МК, а по ластику молотком.... с 3-ёх ударов как-то даже в столешницу нану забил.... ::)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

SU-27-16 пишет:

с наной очень просто - ластик сверху, чтобы не поцарапать МК, а по ластику молотком.... с 3-ёх ударов как-то даже в столешницу нану забил.... ::)


Сразу видно новичка. Что бы не поцарапать МК нужно использовать обрезиненый молоток и специально отфрезерованые деревянные формы.

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

Puhlyaviy пишет:
SU-27-16 пишет:

с наной очень просто - ластик сверху, чтобы не поцарапать МК, а по ластику молотком.... с 3-ёх ударов как-то даже в столешницу нану забил.... ::)

Сразу видно новичка. Что бы не поцарапать МК нужно использовать обрезиненый молоток и специально отфрезерованые деревянные формы.

аааааааааа, типа оправки ? деревянные - для антистатики ?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Точно.

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

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

трамблёр есть ? или два коммутатора и две катушки ?

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

На Планету расчитывается. Трамблера, понятно, не будет. Свеча естественно одна. http://moto-planeta.ru/motoizh/elektrikaizh/653-ustanovka-bsz.html

Катушка дает искру по заднему фронту, он и отодвигается по формуле в строке 64. 1250 мкс - это временно принято постоянным время горения, потом допилится. :)

Переменных много? - ну, я не знаю куда меньше. Объявления отладочных и eval в уме если убрать, то остаются для вычисления периодов (двух - учет разгона/замедления), для отлова пропущенных на micros прерываний, для работы с индикатором...

Про счетчики не совсем понял идею, а micros/millis из кода всё равно вряд ли уберётся полностью, потому что мне ещё индикаторы переключать. С таблицей не знаю каким образом проще, там даже если хорошенько газу дать, для рассчётов будет времени как минимум 3 мс.

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

с таблицей пересчёта - ( ОБОРОТЫ -> задержка искрообразования ) - легче работать.... и можно построить СВОЮ зависимость УОЗ от оборотов... изменение такой таблицы и называется "ЧИПТюнинг" за неадекватные деньги... 

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

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

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

SU-27-16 пишет:

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

эм... внешнего? Я понял идею, но DIP-корпуса паять бесит + хотелось на габаритах сэкономить - итак уже транзистор с радиатором на стабилизатор питания запланирован.

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

ам даже если хорошенько газу дать, для рассчётов будет времени как минимум 3 мс.

не надо расчитывать при использовании таблицы соответствия ! там всё зависимо - ( обороты -> задержка )

здесь такие таблицы называются - массив данных

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

dezz0riented пишет:

SU-27-16 пишет:

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

эм... внешнего? Я понял идею, но DIP-корпуса паять бесит + хотелось на габаритах сэкономить - итак уже транзистор с радиатором на стабилизатор питания запланирован.

 не нано паять - в ардуине есть ТРИ канала заточенных под СЧЁТЧИК !

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

максимум - нана, ключ для коммутатора, прога ( она же скетч )

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

Не факт пока, что применю в итоге эту идею, но речь, видимо, шла о модуле захвата ввода, о таймере 1. https://sites.google.com/site/vanyambauseslinux/arduino/tajmery-sceetcik...

И там пишут: "если один из таймеров 0 или 1 использует предделитель, то второй либо не может использовать предделитель, либо должен использовать тот же коэффициент деления, что и другой таймер." Какой тогда коэффициент деления по умолчанию?

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

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

 

надо всё посчитать и оценить, просто так сразу кто же скажет - " Какой тогда коэффициент деления по умолчанию ? "

из #7 - скважность отрицательных импульсов = 1/3, не важно щас ( зависит от железки-бабочки на валу ), пусть будет - 1 цилиндр, бабочка будет выглядеть как сектор круга в 180 гр.... или как там у ИЖ-Планета ( Спорт ) ? Сколько горшков ?

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

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

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

это не с вашего моцика, кстати ? :)

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

вопросы, пока буду занят - горшков 1 или 2 ? бабин 1 ( как у Оки - искра сразу в два горшка ) или 2 ? коммутаторов 1 или 2 ?

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

SU-27-16 пишет:

это не с вашего моцика, кстати ? :)

Конкретно это - нет. :D Со шкалой идея интересная, а так я просто двухсимвольный семисегментный собираюсь поставить (тысячи/сотни), плату уже потравил.

SU-27-16 пишет:

горшков 1 или 2 ?

На Планете-5 1 цилиндр, это на Юпитере 2. Всего по одному.

Идея в том, что ардуино с точки зрения коммутатора будет датчиком Холла. А длительность отрицательного импульса, я так полагаю, не обязана быть постоянной. Это положительный должен быть постоянным и достаточно длинным, чтобы катушка накопила энергию.

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

Это положительный должен быть постоянным и достаточно длинным, чтобы катушка накопила энергию.

извините за полярность, главное не держать катушку под током накопления энергии "достаточно долго" - больше - это её перегрев и взрыв ( не надо её мучить :)      )

один горшок.... И ДВУХТАКТНЫЙ, наверное ? скорее всего - да.... и для справки - один оборот КВ = одна искра ?

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

SU-27-16 пишет:

один горшок.... И ДВУХТАКТНЫЙ, наверное ? скорее всего - да.... и для справки - один оборот КВ = одна искра ?

Так оно и есть.

Всё просто, остаётся только прогу домучать, а то я поторопился с выводами...

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

> Со шкалой идея интересная

идея со шкалой гораздо проще чем ФУОЗ :)....   это потом.....

итого : горшок, на валу сектор круга 180 гр ( тонкая жесть - дисбаланса не будет ), датчик Холла, коммутатор, катушка, свечка, один оборот КВ = одна искра....    так ?

 

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

Всё так, только пересмотрел я ссылку в #7 - у меня где-то док с тем же содержанием был, но модулятор был описан "инвертированный" - 120 градусов отрезано, остальные 240 железка. Он логичнее так-то, потому что уровень единицы будет когда в щель железяку присунули.

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

ещё один вопрос забыл - сколько RPMмакс у етого аппарата ? у эндуры 12000....18000....

типерь мона посчитать требования к Счётчику_1 ардуины.... сколько времени займёт 1 оборот КВ, 100, 200......1500, 4000.... макс ?

ЕЩЁ ВОПРОС - ОУЗ на холостых оборотах ? ОУЗ на макс оборотах ?

т.е. - соответствие - ХолостОборот -> УголОЗмин и МаксОборот -> УголОЗмакс ?

эти параметры будут сидеть в ардуине как настраиваемые, щас нужны только для прикидки....

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

На 5-6 тысяч рассчитывается максимум. 3 миллисекунды оборот я говорил для 5000, а для 100 об/мин получается 600 мс. Как бы счетчик не переполнился, поэтому делитель надо ставить.

Цитата:

ЕЩЁ ВОПРОС - ОУЗ на холостых оборотах ? ОУЗ на макс оборотах ?

 

Насколько конкретный это вопрос? На низких УОЗ малелький, на высоких большой. :) Я пока держусь формулы, а вообще в сети слишком много разных графиков зависимости, кто на что горазд.

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

dezz0riented пишет:

Всё так, только пересмотрел я ссылку в #7 - у меня где-то док с тем же содержанием был, но модулятор был описан "инвертированный" - 120 градусов отрезано, остальные 240 железка. Он логичнее так-то, потому что уровень единицы будет когда в щель железяку присунули.

не надо заморачивацца на конфигурацию шторки для Холла, сектор 180 - это меандр будет.... накопление тока тока бабиной 50%, время на искру - 50% от времени одного оборота КВ...

железка в секторе 120 и воздух в секторе 240 - даст другое соотношение t НАКОПЛЕНИЯ и t ИСКРЕНИЯ, НО при изменении оборотов движка t НАКОПЛЕНИЯ на холоборотах будет больше оптимального ( нужного ), а на макс оборотах = оптимальному.... ЭТО механическая настройка... у вас планируется ардуина, вот она и сделает этот импульс ОПТИМАЛЬНЫМ на любых оборотах.... т.е. - 180 железа + 180 воздух

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

У нас планируется переключатель на голое БСЗ если ардуина сдохнет :) Поэтому и зацепился за ту реализацию - у кого-то пашет и прекрасно. А так спасибо, подумаю над этим на свежую голову.

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

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

на разработку это не влияет ! можно задаться углами мин=0 и макс=40.... промежуточные значения в таблице будут... изменения УОЗ от мин до макс - линейное, экспон-ное, обрэкспон-ное, с подъёмом внешней характеристики на малых или на больших оборотах - это дело ваше, но после изготовления УСТРОЙСТВА.... изменение графика зависимости этой - это и есть ЧИПТюнинг - чё захотите, то и зальёте в ардуинку...

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

dezz0riented пишет:

У нас планируется переключатель на голое БСЗ если ардуина сдохнет :) Поэтому и зацепился за ту реализацию - у кого-то пашет и прекрасно. А так спасибо, подумаю над этим на свежую голову.

нееееееееее, давайте вместе думать - я тоже учусь.....

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

а переключатель НОРМ-ФУОЗ - это обязательный компонент !

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

dezz0riented пишет:

У нас планируется переключатель на голое БСЗ если ардуина сдохнет :) Поэтому и зацепился за ту реализацию - у кого-то пашет и прекрасно. А так спасибо, подумаю над этим на свежую голову.

понял.... можно в бардачке иметь железку для Холла на случай подыхания ардуины.... а можно расчитать эту железку и для работы с ардуиной, и на аварийный случай ( одно другому не помешает )

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

http://qrx.narod.ru/avt/re_kz.htm

Цитата:

В электронных коммутаторах отечественного производства (серии 3620.3734; 36.3734; 78.3734) функции выходного токового ключа выполняет мощный транзистор, а функции управления параметрами токовых импульсов (нормирование скважности запускающих импульсов, программное регулирование времени накопления энергии в катушке зажигания, ограничение уровня тока в ее первичной обмотке и амплитуды импульсов первичного напряжения) выполняет слаботочная электронная схема, чаще в интегральном исполнении.

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

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

нормирование скважности запускающих импульсов - ДА, по амплитуде и фронтам, а соотношение 0 и 1 зависит от шторки ДХ

> программное регулирование времени накопления энергии в катушке зажигания - НЕТ, настроен один раз на заводе так чтобы накопление не превышало Tmax, ещё одна функция - при включенном зажигании и если шторка в положении накопления ( бабина под током ) - через секунд 20....40 отключение катушки ( обесточивание ) до появления импульсов с ДХ..... в контактной системе исли контакт прерывателя оставался замкнутым и зажигание не выключалось, то через 2....3 часа бабина взрывалась ( уазик однажды спалил два камаза и зил )

> ограничение уровня тока в ее первичной обмотке и амплитуды импульсов первичного напряжения - ДА

 

если вы решили использовать ардуину - то это заморачивание обернётся ещё 5.....10-ю строками кода :)

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

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

если вы решили использовать ардуину - то это заморачивание обернётся ещё 5.....10-ю строками кода :) , 

если не заморачиваться, то счётчик_3 не нужен

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

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

переделал...

зелёный круг - прерывания по ICP1 (вывод Digital с номером 8) по переднему фронту ( вектор прерывания TIMER1_CAPT_vect )

синий круг - прерывания по переполнению счётчика_2 - переводим выход устройства в 1 ( накапливаем )

красный круг - прерывания по переполнению счётчика_0 - переводим выход устройства в 0 ( искрим )

 

весь код будет состоять из таблицы пересчёта и и трёх процедур обработки прерываний, прерывания по времени не перекрываются, всё должно быть хорошо :)

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

Круто :) Только с косяками в своём коде разобрался, убедился что он в принципе работает (и вернул доверие к протеусу) и менять в корне архитектуру влом. Функция ignitionCalc() как самая массивная функция выполняется около 100 мкс, и это происходит не в каждом лупе. Если прикинуть что в том же лупе выполнится кусок, отвечающий за индикацию, то ещё где-то столько же. До 300 000 об/мин я движок не разгоню, так что считать на ходу право имею.

Тем более так делаю не я один. http://www.ru-moto.ru/forum/viewthread.php?thread_id=3565 Поправки на разгоне/замедлении в таблицу фиг заложишь.

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

> Функция ignitionCalc() как самая массивная функция......

если линейная, то пересчитать легко, а как описать вот такую зависимость ?

.......не грузится картинка :( ........ попозже

каждый хозяин своему проекту :) , в моём хочу большую часть решить через железо, ПРЕРЫВАНИЯМИ ( согласно крайней картинке ), отштудировал счётчики и заканчиваю первую часть - замер RPM...... задержки на следущий оборот из данных предоборота БЕЗО ВСЯКИХ ПРОПУСКОВ ! а в лупе - тахометрЦифр или тахометрАналог, смена таблицы кривой УОЗ и т.д.

и код начальный  - попозже.....

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 int RPM = 0;               // обороты для Сериала
//volatile byte RPM50 = 0;          // полсотни оборотов для индекса таблицы "обороты-УОЗ" - 120 значений ( на выбор )
volatile byte RPM100 = 0;           // сотни оборотов для индекса таблицы "обороты-УОЗ" - 60 значений ( на выбор )
const unsigned int AngleChargeBabin = 0xFFFF;  // число пока не рассчитано
unsigned int AngleIgnition [] PROGMEM =              // таблица "обороты-УОЗ" числа пока не рассчитаны
{
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF
};
unsigned int AngleDelayChargeBabin [] PROGMEM =      // таблица "обороты-задержка накопления бабины" числа пока не рассчитаны
{
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF ,
  0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF
};
//===================================================================
void setup( )
{
//  pinMode( 7, OUTPUT );         // переделать через регистры - выход на коммутатор
//**************************
// Счётчик_0
//
//**************************
// Счётчик_1
  pinMode( 8 , INPUT );           // переделать через регистры - вход от ДХолла
  digitalWrite( 8 , HIGH );       // переделать через регистры - резистор к VCC
  NclkTCNT1 = 0;
  TCNT1  = 0;
  TIMSK1 = ( 1 << ICIE1 );
  TCCR1A = ( 0 << WGM11 ) | ( 0 << WGM10 );
  TCCR1B = ( 0 << ICNC1 ) | ( 1 << ICES1 ) | ( 0 << WGM13 ) | ( 0 << WGM12 ) | ( 0 << CS12 ) | ( 0 << CS11 ) | ( 0 << CS10 ) ;
//**************************
  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^7RPM = int( 96 / NclkTCNT1 * 10^7 );
//  RPM50 = RPM % 50;   // 120 значений ( на выбор )
  RPM100 = RPM % 100;   //  60 значений ( на выбор )
}
//===================================================================
//ISR( TIMER0_OVF_vect )
//===================================================================
void loop( )
{
  Serial.println( RPM );
  delay( 500 );
}
//===================================================================
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Краткая теория

Перед подачей искры в катушке зажигания накопляется энергия. Накопление осуществляется замыканием катушки на землю. На осциллографе процесс накопления энергии выглядит вот так:

Время накопление энергии (заряда катушки) – это интервал времени от замыкания катушки на землю до момента искрового разряда. Переходной процесс указывает на окончание эффективного заряда катушки, после которого происходит бесполезный нагрев катушки.

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

Увеличение времени накопления выше оптимального приводит лишь к перегреву катушки. Мощность искры от этого не увеличивается. Можете представить себе чашку чая — если чашка полная, то сколько туда не лей — полнее не станет, а вот штаны определенно можно промочить :)

Уменьшение времени приводит к недозаряду катушки и к уменьшению мощности искры. Этим страдают все трамблерные системы зажигания на оборотах выше 4-5тыс.

Эффективное время накопления увеличивается при падении напряжения в бортсети. Опять же таки по аналогии с чаем: чем тоньше носик у чайника, тем дольше наполняется чашка.

 

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

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

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

Жаль инициализация счетчиков не откомментирована, я бы почитал. :) И в Си нету оператора ^ на моей памяти.

 

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

dezz0riented пишет:

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

Жаль инициализация счетчиков не откомментирована, я бы почитал. :) И в Си нету оператора ^ на моей памяти.

 

жааааааль :( .....я его из паскаля вставил :) - заменю нулями....

про счётчики - шас накидаю.... 

http://chipenable.ru/index.php/programming-avr/item/51-uchebnyy-kurs-16-...

.....в код отсюда всё перетянул :) нуууууу, и датаШит пролопатил

....создал новую тему - я далеко не мастер :(

http://www.arduino.ru/forum/programmirovanie/8-bit-timercounter2-upravle...

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

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

между временем и углом - есть зависимость - её лучше считать отдельно и размещать отдельно в таблицах - и процессорное время не тратится на пересчёт экспоненты, и таблиц в НАНО можно разместить очень много :)

перешлю таблицу.... чё в ней и как - спрашивайте....

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

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

это примерная таблица соответсвия "обороты- УОЗ" по графику изипоста #39

для быстродействия кода лучше рассчитать таблицу вручную, чем напрягать МК расчётами.... описать экспоненту с двумя горбами - труднова-то будет.... МК только и будет этим занят :(

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

10 ^ 7 ========== pow( ( float( 10 ) , 7 ) ? так ?

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

или можно ->

10 ^ 7 ========== pow( ( 10 , 7 ) ?

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

SU-27-16 пишет:

или можно ->

10 ^ 7 ========== pow( ( 10 , 7 ) ?

Странный вопрос после того, как уже был озвучен ответ

SU-27-16 пишет:

заменю нулями....

 

А как вообще расчитывалась таблица? Серые клетки - оптимальное? А то в коде массив на 60 элементов, а этих чо-то меньше.

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

> Странный вопрос после того, как уже был озвучен ответ

не увидел я вашего ответа как степень в СИ пишется....

 эта таблица - прикидка с точностью 1500 RPM, в коде заложено считать сотни или полсотни значений RPM.....

....можно составить таблицу с шагом 1 RPM, но зачем такая точность ?

я выбрал считать сотни RPM - таблица будет иметь 60 значений.....

серые - это зависимость УОЗ от RPM....  таблица будет иметь всего-то 11 значений