Управление накопл. энергии катушек зажигания (Dwell control)
Moderator: STC
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Управление накоплением энергии катушек зажигания
Да, он свободен.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Re: Управление накоплением энергии катушек зажигания
Теперь буду пытаться писать код по алгоритму.
Re: Управление накоплением энергии катушек зажигания
STC
Что-то не удается реализовать данный алгоритм
Что-то не удается реализовать данный алгоритм
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Управление накоплением энергии катушек зажигания
В чем именно проблема?
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Re: Управление накоплением энергии катушек зажигания
Вполне возможно не совсем правильно понял, делал так: в прерывании канала А- запомнил таймер и выставил признак, в опросе зубьев вхожу по признаку в функцию здесь подставляю
Момент нач.накопления = знач.таймера + (Межзубн.период * 30*град.на зуб) / град.на зуб
канал В = Момент нач.накопления - табл. знач.
снять признак
установить флаг
разрешить прерывание канала В
короче вылетают импульсы произвольно.
Момент нач.накопления = знач.таймера + (Межзубн.период * 30*град.на зуб) / град.на зуб
канал В = Момент нач.накопления - табл. знач.
снять признак
установить флаг
разрешить прерывание канала В
короче вылетают импульсы произвольно.
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Управление накоплением энергии катушек зажигания
Наверное ты неправильно понял суть алгоритма. Для определения момента накопления тебе не нужно отсчитывать зубья. Попробую объяснить еще раз.
- В основном цикле асинхронно расчитываем задержку в зависимости от напряжения бортовой сети и путем вызова функции устанавливаем текущую задержку модулю ckps (он ее сохраняет и использует в прерывании канала А).
- В модуле ckps. Канал А отвечает за выдачу искры (закрывает транзистор). Канал B отвечает за начало накопления энергии (открывает транзистор).
Логику работы канала А трогать не нужно - там должен идти отсчет по зубьям. Настраивать канал B нужно следующим образом:
При входе в прерывание от канала А (момент выдачи искры) считываем текущее значение таймера и запоминаем в локальной переменной, выдаем искру, затем на основе межзудного периода и сохраненного значения таймера высчитываем значение таймера соответствующее моменту выдачи искры в следующем цикле зажигания. Вычитаем из него задержку, ограничиваем полученное значение чтобы оно не было меньше текущего значения таймера и заносим в регистр сравнения канала B.
- В основном цикле асинхронно расчитываем задержку в зависимости от напряжения бортовой сети и путем вызова функции устанавливаем текущую задержку модулю ckps (он ее сохраняет и использует в прерывании канала А).
- В модуле ckps. Канал А отвечает за выдачу искры (закрывает транзистор). Канал B отвечает за начало накопления энергии (открывает транзистор).
Логику работы канала А трогать не нужно - там должен идти отсчет по зубьям. Настраивать канал B нужно следующим образом:
При входе в прерывание от канала А (момент выдачи искры) считываем текущее значение таймера и запоминаем в локальной переменной, выдаем искру, затем на основе межзудного периода и сохраненного значения таймера высчитываем значение таймера соответствующее моменту выдачи искры в следующем цикле зажигания. Вычитаем из него задержку, ограничиваем полученное значение чтобы оно не было меньше текущего значения таймера и заносим в регистр сравнения канала B.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Re: Управление накоплением энергии катушек зажигания
Понял так:
При входе в прерывание от канала А (момент выдачи искры)
считываем текущее значение таймера и запоминаем в локальной переменной,
выдаем искру,
затем на основе межзубного периода и сохраненного значения таймера высчитываем значение таймера соответствующее моменту выдачи искры в следующем цикле зажигания.
Момент нач.накопления = сохр.знач.таймера + (Межзубн.период * 30*град.на зуб) / град.на зуб
Вычитаем из него задержку, ограничиваем полученное значение чтобы оно не было меньше текущего значения таймера(каким образом ограничиваем)
и заносим в регистр сравнения канала B.
Понял так что все надо в сделать обработке прерывании.
При входе в прерывание от канала А (момент выдачи искры)
считываем текущее значение таймера и запоминаем в локальной переменной,
выдаем искру,
затем на основе межзубного периода и сохраненного значения таймера высчитываем значение таймера соответствующее моменту выдачи искры в следующем цикле зажигания.
Момент нач.накопления = сохр.знач.таймера + (Межзубн.период * 30*град.на зуб) / град.на зуб
Вычитаем из него задержку, ограничиваем полученное значение чтобы оно не было меньше текущего значения таймера(каким образом ограничиваем)
и заносим в регистр сравнения канала B.
Понял так что все надо в сделать обработке прерывании.
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Управление накоплением энергии катушек зажигания
Да, именно так!
Я не подумал о том что можно не использовать деление! Нужно просто использовать для каждого типа двигателя и шкива разные константы.
Тогда формула вообще простая (и главное быстро вычисляемая):
Момент нач.накопления = Тек.знач.таймера + (Межзубн.период * Кол-во зубьев на цикл)
Я не подумал о том что можно не использовать деление! Нужно просто использовать для каждого типа двигателя и шкива разные константы.
Тогда формула вообще простая (и главное быстро вычисляемая):
Момент нач.накопления = Тек.знач.таймера + (Межзубн.период * Кол-во зубьев на цикл)
Code: Select all
4ц 6ц 8ц
60-2 30 20 15
36-1 18 12 9
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Re: Управление накоплением энергии катушек зажигания
получилось так:
//************************************************************************
#define CKPS_COGS 30 //шкив 60 зубов
int16_t nach_nakopl, znach_taym,tdz;
int8_t b_channel;
__flash int16_t set_zad[32] = {2160,2320,2480,2640,2800,2960,3120,3280,3440,3600,3760,3920,4000,4240,4400,4560,
4800,4866,5040,5200,5360,5520,5600,5840,6000,6160,6320,6480,6640,6800,6960,7120};
void td (struct ecudata_t* d)
{
int16_t i;
int16_t rtd = d->sens.voltage;
for(i = 31; i >=0; i--)
{
if(rtd>=set_zad)break;
}
tdz = fwdata.coil_on_time;
}
#pragma vector=TIMER1_COMPB_vect //вектор прерывания по совпадению канала B таймера Т1
__interrupt void timer1_compb_isr(void)
{
TIMSK&= ~(1<<OCIE1B); //запрещаем прерывание
switch(b_channel)
{
#ifndef INVERSE_IGN_OUTPUTS
TURNOFF_IGN_CHANNELS();
#else
TURNON_IGN_CHANNELS();
#endif
}
}
/* * вектор прерывания по совпадению канала А таймера Т1*/
#pragma vector=TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void)
{
TIMSK&= ~(1<<OCIE1A); //(запрещаем прерывание)
znach_taym = TCNT1;
//(линия порта в низком уровне, теперь переводим её в высокий уровень -
// заставляем коммутатор прекратить
//накопление энергии и закрыть транзистор (искра)).
switch(ckps.channel_mode)
{
#ifndef INVERSE_IGN_OUTPUTS
TURNON_IGN_CHANNELS();
#else
TURNOFF_IGN_CHANNELS();
#endif
default:
return; //none of channels selected (никакой канал не выбран) - CKPS_CHANNEL_MODENA
b_channel = !ckps.channel_mode;
nach_nakopl = znach_taym + ((ckps.period_curr) * CKPS_COGS);
OCR1B = nach_nakopl - tdz;
TIFR = (1 << OCF1B);
TIMSK|= (1<<OCIE1B);
}
}
//************************************************************************
проверю чтобы не осталось лишнего в файле и попробую.
//************************************************************************
#define CKPS_COGS 30 //шкив 60 зубов
int16_t nach_nakopl, znach_taym,tdz;
int8_t b_channel;
__flash int16_t set_zad[32] = {2160,2320,2480,2640,2800,2960,3120,3280,3440,3600,3760,3920,4000,4240,4400,4560,
4800,4866,5040,5200,5360,5520,5600,5840,6000,6160,6320,6480,6640,6800,6960,7120};
void td (struct ecudata_t* d)
{
int16_t i;
int16_t rtd = d->sens.voltage;
for(i = 31; i >=0; i--)
{
if(rtd>=set_zad)break;
}
tdz = fwdata.coil_on_time;
}
#pragma vector=TIMER1_COMPB_vect //вектор прерывания по совпадению канала B таймера Т1
__interrupt void timer1_compb_isr(void)
{
TIMSK&= ~(1<<OCIE1B); //запрещаем прерывание
switch(b_channel)
{
#ifndef INVERSE_IGN_OUTPUTS
TURNOFF_IGN_CHANNELS();
#else
TURNON_IGN_CHANNELS();
#endif
}
}
/* * вектор прерывания по совпадению канала А таймера Т1*/
#pragma vector=TIMER1_COMPA_vect
__interrupt void timer1_compa_isr(void)
{
TIMSK&= ~(1<<OCIE1A); //(запрещаем прерывание)
znach_taym = TCNT1;
//(линия порта в низком уровне, теперь переводим её в высокий уровень -
// заставляем коммутатор прекратить
//накопление энергии и закрыть транзистор (искра)).
switch(ckps.channel_mode)
{
#ifndef INVERSE_IGN_OUTPUTS
TURNON_IGN_CHANNELS();
#else
TURNOFF_IGN_CHANNELS();
#endif
default:
return; //none of channels selected (никакой канал не выбран) - CKPS_CHANNEL_MODENA
b_channel = !ckps.channel_mode;
nach_nakopl = znach_taym + ((ckps.period_curr) * CKPS_COGS);
OCR1B = nach_nakopl - tdz;
TIFR = (1 << OCF1B);
TIMSK|= (1<<OCIE1B);
}
}
//************************************************************************
проверю чтобы не осталось лишнего в файле и попробую.
Re: Управление накоплением энергии катушек зажигания
Вычитаем из него задержку, ограничиваем полученное значение чтобы оно не было меньше текущего значения таймера - (каким образом ограничиваем?)