ВАЗ 2103 "Рыжик" на SECU-3i

andreika
Posts: 179
Joined: 21 Oct 2013, 17:52
Your CAR: ВАЗ-2103
SECU version: DIY SECU-3i
Location: Киев
Has thanked: 28 times
Been thanked: 78 times
Contact:

ВАЗ 2103 "Рыжик" на SECU-3i

Post by andreika »

Добро пожаловать в новый тематический мини-бортжурнал, посвящённый установке МПСЗ SECU-3i (инжектор) на ВАЗ 2103 "Рыжик"!

Это первая работающая машина на ЭБУ SECU-3i, "первопроходец", атипичная и экспериментальная установка. На данный момент ещё не было официального релиза SECU-3i, поэтому часть изложенного здесь материала может быть неактуальна в дальнейшем.

Описываемые далее события начались осенью 2016-го года, когда автор проекта Алексей Шабельников, после долгих "уговоров" ;), наконец согласился продать мне платы своей новейшей разработки - SECU-3i. Без гарантий работоспособности, на мой страх и риск. Без прошивки, без менеджера. Хорошо хоть удалось заполучить схему! :)

Для того чтобы разобраться, какую деталь куда паять, платы были тщательно сфотографированы с двух сторон. И затем в граф.редакторе было отмечено и подписано расположение всех деталей - я люблю такие задачки:
Печатные платы SECU-3i с расположением всех деталей (секретное фото).
Печатные платы SECU-3i с расположением всех деталей (секретное фото).
Вместе с тем были заказаны и куплены все нужные детали и корпус. Но есть несколько особенностей:
1) Умные ключи VND14NV04 дорогие, поэтому на все слаботочные выходы управления реле были куплены более дешевые VND5N07 - у них Rds хоть и побольше, зато все защиты присутствуют! А уже на управление форсунками встали крутые VND14NV04.
2) Не поставили сапрессор на выходе TACH_OUT. Вообще, найти SMAJ220A в наших краях затруднительно - это, пожалуй, единственная деталь, которой не нашлось...
3) 5-вольтовый стабилизатор взяли с буквой "А" (LP2950ACDT-5.0), он более точный, чем обычный 2950.
4) Драйвер DRV8825 оказалось дешевле купить в виде готового модуля на платке и выпаять оттуда:
DRV8825.jpg
5) У Алексея был также заказан модуль Bluetooth. На платах SECU-3i ему, наконец, нашлось стационарное место :)
6) Самые дорогие из деталей - MPX4250AP, BIP373 (4 шт!) и HIP9011AB, стоимостью где-то под $45. Если собираете бюджетный вариант, то лучше искать их на Aliexpress..

После покупки деталей, приступаем к пайке:
secu3i-process.jpg
В результате, спустя неделю после заказа плат, мы спаяли наше крутое ЭБУ: 8-)
secu3i_andreika_pcbs.jpg
Тут нужно пояснить, что при сборке блока было поставлено важное дополнительное требование: простота разборки и отладки. Поскольку это экспериментальная версия, и нам, возможно, предстоит бороться с глюками и решать задачи, на которые ещё нет ответа, то наивно было бы надеяться, что можно быстренько засунуть платы в корпус, повернуть ключ зажигания и поехать. :)
Поэтому блок должен работать как в сборе в машине, так и на столе в разобранном виде. Для соединения плат было придумано два варианта:

1) "Релизный" вариант, для плат, собранных в корпусе:
pcb-connect1.jpg
Гребёнки-мамы паяются на платы, и соединяются гребёнками-папами. Размеры как раз идеальны для установки плат в корпус.

2) "Отладочный" вариант, когда обе платы соединены бок о бок:
pcb-connect2.jpg
Тут уже угловые гребёнки спаяны и как раз по размерам достают до разъёмов обеих плат, лежащих рядом.

Но главная особенность описываемой сборки заключается в том, что вместо штатных разъёмов MiniFit мы будем паять провода, объединять их в жгуты и снаружи блока ставить герметичные разъёмы:
connectors.jpg
Причины для этого следующие:
1) Для отладки требуется частое включение блока в контролируемых домашних условиях :lol:, и каждый раз снимать весь жгут проводки со всеми датчиками было бы довольно сложно. А при наличии отдельных разъёмов можно легко разделить проводку, снять нужный узел, устранить проблему и т.д.
2) Блок будет установлен под капотом, и это дополнительная герметизация блока.

Также жгуты, идущие с двух плат, должны быть разделяемы, ведь мы хотим иметь удобный доступ к платам для отладки или перепайки. Для этой цели одна из пластмассовых крышек корпуса будет разрезана пополам и в неё вставлены резиновые кабельные вводы:
korpus-cables.jpg
Все провода делим на 4 жгута, 3 на нижней (основной) плате и 1 на верхней:
korpus-wires1.jpg
Каждый из жгутов имеет 1 или несколько разъёмов:
- разъём 1-1: ДПДЗ+ДТВ+ДТОЖ
- разъём 1-2: лямбда
- разъём 1-3: ДД+ДФ
- разъём 1-4: ДПКВ
- разъём 1-5: питание
- разъём 2-1: приборка (DB-9)
- разъём 2-2: вентилятор
- разъём 3-1: РХХ
- разъём 3-2: реле
- разъём 3-3: форсунки
- разъём 4-1: катушки
korpus-wires2.jpg
andreika
Posts: 179
Joined: 21 Oct 2013, 17:52
Your CAR: ВАЗ-2103
SECU version: DIY SECU-3i
Location: Киев
Has thanked: 28 times
Been thanked: 78 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by andreika »

Часть 2. Платы и сборка блока.

Для того чтобы сгруппировать выводы по разделяемым жгутам, пришлось сделать несколько перестановок (ремаппинг выводов):
1) Выход ADD_O1 назначаем на O2SH (inverted!), т.к. разъём лямбды находится на жгуте нижней платы.
2) Выход ADD_O2 назначаем на CE (т.к. жгут приборки, куда идёт CE, тоже на нижней плате).
3) Подпаял несколько проводов к дорожкам Rx и Tx для кабеля приборки;
4) Подпаял питание +5В для разъёма ДПДЗ.

Для этого запаиваем транзисторы в разных интересных местах: :-)
pcb-remapping.jpg
Также закрепляем драйверы катушек (BIP373) на корпус через изоляционные прокладки и скрепляем половинки корпуса алюминиевыми скобами:
korpus-wires3.jpg
Наконец, все жгуты укладываем в гофры, чтобы получилось совсем красиво:
korpus-wires4.jpg
На этом подготовительные работы с платами завершены!

Выскажу свои первые впечатления:
- У порт-экспандера и HIP9011 немного разные форматы SPI, и это немножко мешает прошивке, но, уверен, Алексей найдёт оптимальное решение.
- Вход IGN не совмещён со входом VBAT, уж не знаю, почему ;-) И они, к тому же, на разных платах - в моём случае это доставило неудобств при разводке жгутов.
- Разница потенциалов между грязной и аналоговой землями получается довольно ощутимая - думаю, не уменьшить ли немного тот резистор между ними...
- К сожалению, не выведены на контактные площадки сигналы Rx и Tx на случай подключения к другим устройствам/платам;
- Питание +5В выведено на верхней плате, а вход ДПДЗ - на нижней плате, что несколько неудобно при разводке проводки.
- В целом, платы сделаны очень добротно! :!:

* * *

В следующей части мы зайдёмся программной частью SECU-3i. Нас ждёт доработка прошивки и менеджера.

Stay tuned!
Last edited by andreika on 18 Dec 2016, 21:46, edited 1 time in total.
andreika
Posts: 179
Joined: 21 Oct 2013, 17:52
Your CAR: ВАЗ-2103
SECU version: DIY SECU-3i
Location: Киев
Has thanked: 28 times
Been thanked: 78 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by andreika »

Часть 3. Прошивка и менеджер.

После того как мы собрали блок, нужно бы проверить, работает ли он. :) Для этого нужна прошивка. Но на момент описываемых работ стандартной версии прошивки под SECU-3i ещё не было, поэтому пришлось на скорую руку дорабатывать прошивку самому, взяв за основу текущую версию с SECU-3T.

Внимание! Речь идёт об экспериментальной тестовой версии прошивки для этого проекта. Стандартная же версия прошивки SECU-3i, скорее всего, будет существенно отличаться.

Для того, чтобы прошивка от SECU-3T заработала на новых платах, нам нужно сделать следующее:
1. Поддержка расширителя портов (порт-экспандера), который есть на 2-й плате и управляет "медленными" входами/выходами: наличие зажигания, реле и т.д. Создаём файлы portex.*, где реализуем работу с SPI.
2. Убираем работу с ножкой HIP9011_TEST (SET_KSP_TEST()) из knock.c, т.к. на ней теперь сидит CS от порт-экспандера.
3. Добавление в прошивку новых аппаратных и программных выходов/входов в ioconfig.*: IOP_INJ_OUT*, IOP_HALL_OUT, IOP_PWRRELAY, IOP_FL_PUMP, ... IOP_IGN, а также добавляем соответствующие функции iocfg_*().
4. Меняем работу некоторых существующих выходов/входов в ioconfig.c, отключая их или переводя на порт-экспандер. Например:

Code: Select all

void iocfg_i_st_block(uint8_t value)
{
// [andreika]:
#ifdef SECU3I
 portex_write_bit(PE_PORTB, PB1, value);
#else
#ifdef REV9_BOARD
 WRITEBIT(PORTB, PB1, value);
#else
 WRITEBIT(PORTB, PB1, !(value));
#endif
 DDRB |= _BV(DDB1);
#endif
}
5. Вносим соответствующие правки в таблицы функций tables.c
6. Добавляем новые входы/выхода в диагностику, для этого:
- для выходов везде используем uint32_t вместо uint16_t, а для входов - uint16_t вместо uint8_t.
- соответственно меняем пакеты в uart.c для DIAGINP_DAT/DIAGOUT_DAT.
- дописываем функционал в init_digital_outputs(), set_outputs(), init_digital_inputs(), get_inputs()
7. В injector.c меняем INJ_ON и INJ_OFF местами:

Code: Select all

// [andreika]:
#ifdef SECU3I
// built-in drivers, no need to invert
#define INJ_ON  1   //!< Injector is turned on
#define INJ_OFF 0   //!< Injector is turned off
#else
#define INJ_ON  0   //!< Injector is turned on
#define INJ_OFF 1   //!< Injector is turned off
#endif
Тут нужно пояснить, что происходит. В SECU3T использовался отдельный внешний драйвер для форсунок, в котором делается инверсия управляющего сигнала (т.е. когда на драйвер подаём "плюс", он тянет форсунку на землю). У нас же теперь ключи высокоомных форсунок встроены на плате SECU3I.
- Раньше цепочка была такая: (ножка МК)->(выходной транзистор)->(транзистор драйвера)->форсунка.
- А сейчас цепочка другая: (ножка МК)->(транзистор драйвера)->форсунка, поэтому дополнительная инверсия уже не нужна.
8. Дописываем в vstimer.* новый счётчик portex_timeout_counter.
9. В fuelpump добавляем работу с IOP_O2SH по аналогии с ЭБН, только без отключения. В идеале надо бы вынести в отдельный файл, но пока не придумали логику работы с подогревом лямбды (нужно ли её хотя бы отключать и т.д.), пусть сидит здесь. :)
10. Наконец, secu3.c. Добавляем инициализацию экспандера (сразу после vent_init_ports() или может ещё раньше надо). В основном цикле перед wdt_reset_timer() вызываем обработчик таймаута portex для обновления состояния порта. Тут нужно пояснить, что I/O с экспандером буферизирован: мы храним в ОЗУ текущее состояние (битмаску) портов, и делаем "ленивый" апдейт выходов только в случае изменения, и только по таймауту.

После всех этих манипуляций мы получили рабочую прошивку под SECU-3i, во всяком случае, с уже имеющимся базовым функционалом.

А теперь займёмся менеджером, он ведь тоже нуждается в доработке:
Доработанная Wide-версия менеджера!
Доработанная Wide-версия менеджера!
Сразу скажу, что стороннее вмешательство в GUI менеджера secu3man на уровне кода - дело малоприятное, поскольку большинство функционала там "hard coded" на уровне WinAPI. :?
Я, по возможности, старался везде сохранить авторский стиль, и все вмешательства делал строго в рамках условной компиляции (ifdef).
Вкратце перечислю затронутые области кода:
1. secu3man.rc и ParamDesk.rc, Resource.h - больше всего правок, добавление нужных параметров для нового I/O secu3i.
2. ControlApp.cpp - правка для слегка изменившегося протокола обмена по UART (диагностика).
3. DevDiagnostTabDlg.cpp, DevDiagnostTabDlg.* - доработка панели диагностики. Также в SECU3IO.h тоже сидят структуры диагностики.
4. FirmwareDataMediator.h - много правок для добавления новых I/O.
5. FWIORemappingController, IORemappingDlg - добавление выпадающих списков для новой структуры I/O.

В результате этих правок, основные изменения в интерфейсе касаются панели переназначения выводов:
Добавлены новые входы/выходы для переназначения
Добавлены новые входы/выходы для переназначения
secu3i_remapping.png (3.21 KiB) Viewed 5850 times
Что касается панели диагностики, то пришлось ещё больше изменить, т.к. там банально не оставалось свободного места для новых входов/выходов:
Новая красивая панелька диагностики :-)
Новая красивая панелька диагностики :-)
Да, чуть не забыл. Попутно заменил "костыль" на более правильный код в методе _AttachFreeSlotsToDefaultPlugs(), из-за которого эта новая, более сложная модель I/O ремаппинга, работала немного неправильно:

Code: Select all

 for(int s = FWDM::IOS_START; s < FWDM::IOS_COUNT; ++s)
 {
  if (!_IsSlotFree((FWDM::IOSid)s))
   continue;
// [andreika]: no hacks anymore
#ifdef SECU3I
  std::map<FWDM::IOSid, FWDM::IOPid>::const_iterator it = m_defValMap.find((FWDM::IOSid)s);
  if (it != m_defValMap.end() && (mp_fwdm->GetSStub() == mp_fwdm->GetIOPlug(FWDM::IOX_INIT, it->second)))
   attachList.insert(std::make_pair(it->second, (FWDM::IOSid)s));
#else
  //костыль для возможности переназначения IGN_OUT3 и IGN_OUT4 на другие выходы
  if (((FWDM::IOSid)s == FWDM::IOS_IGN_OUT3) && (mp_fwdm->GetSStub() != mp_fwdm->GetIOPlug(FWDM::IOX_INIT, FWDM::IOP_IGN_OUT3)))
   continue; //3
  if (((FWDM::IOSid)s == FWDM::IOS_IGN_OUT4) && (mp_fwdm->GetSStub() != mp_fwdm->GetIOPlug(FWDM::IOX_INIT, FWDM::IOP_IGN_OUT4)))
   continue; //4
  //hack which allows remap PS input to other input slots
  if (((FWDM::IOSid)s == FWDM::IOS_PS) && (mp_fwdm->GetSStub() != mp_fwdm->GetIOPlug(FWDM::IOX_INIT, FWDM::IOP_PS)))
   continue; //PS
  //hack which allows remap CKPS input to other input slots
  if (((FWDM::IOSid)s == FWDM::IOS_CKPS) && (mp_fwdm->GetSStub() != mp_fwdm->GetIOPlug(FWDM::IOX_INIT, FWDM::IOP_CKPS)))
   continue; //CKPS
  std::map<FWDM::IOSid, FWDM::IOPid>::const_iterator it = m_defValMap.find((FWDM::IOSid)s);
  if (it != m_defValMap.end())
   attachList.insert(std::make_pair(it->second, (FWDM::IOSid)s));
#endif
 }
В итоге, всё это дело успешно заработало на новых платах! 8-)
Last edited by andreika on 20 Dec 2016, 22:10, edited 1 time in total.
andreika
Posts: 179
Joined: 21 Oct 2013, 17:52
Your CAR: ВАЗ-2103
SECU version: DIY SECU-3i
Location: Киев
Has thanked: 28 times
Been thanked: 78 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by andreika »

* * * Это сообщение зарезервировано под дальнейшее описание процесса установки. * * *
andreika
Posts: 179
Joined: 21 Oct 2013, 17:52
Your CAR: ВАЗ-2103
SECU version: DIY SECU-3i
Location: Киев
Has thanked: 28 times
Been thanked: 78 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by andreika »

Добавлена 3-я часть рассказа про установку SECU-3i на "Рыжик" - см. сообщение выше.

P.S. Кстати, нужно ли публиковать исходники модификаций прошивки и менеджера? Или это всё равно не ускорит релиз официального ПО?
User avatar
STC
Posts: 13843
Joined: 30 Apr 2013, 23:41
Your CAR: AZLK 2140
SECU version: DIY SECU-3
Location: North Korea
Has thanked: 2160 times
Been thanked: 4335 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by STC »

andreika wrote:Добавлена 3-я часть рассказа про установку SECU-3i на "Рыжик" - см. сообщение выше.

P.S. Кстати, нужно ли публиковать исходники модификаций прошивки и менеджера? Или это всё равно не ускорит релиз официального ПО?
Пока не нужно.
Author of the SECU-3™ project http://SECU-3.org. An open source engine control unit / Ignition control system, (C) 2007.
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
andreika
Posts: 179
Joined: 21 Oct 2013, 17:52
Your CAR: ВАЗ-2103
SECU version: DIY SECU-3i
Location: Киев
Has thanked: 28 times
Been thanked: 78 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by andreika »

Добавил в менеджер возможность редактирования таблиц впрыска (наполнение, обогащение после пуска/прогрева, длительность впуска):
grid_inj1.png
Сделал всё с минимумом дописываний, на базе уже существующего кода. Работает! 8-)

В дальнейшем можно сделать внизу кнопочки для разных инструментов:
1) калькулятор первичных значений наполнения по аналогии с TunerStudioMS.
2) режим коррекции наполнения по лямбде для "редактирования таблиц" (онлайн-откатка);
3) Режимы редактирования: софт-селекшен, интерполяция и т.п.
User avatar
darxfame
Posts: 901
Joined: 10 Jul 2015, 19:12
Your CAR: ИЖ 2126 УМПО 1,7
SECU version: official SECU-3T
Location: Москва
Has thanked: 122 times
Been thanked: 137 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by darxfame »

andreika wrote:Добавил в менеджер возможность редактирования таблиц впрыска (наполнение, обогащение после пуска/прогрева, длительность впуска):
grid_inj1.png
Сделал всё с минимумом дописываний, на базе уже существующего кода. Работает! 8-)

В дальнейшем можно сделать внизу кнопочки для разных инструментов:
1) калькулятор первичных значений наполнения по аналогии с TunerStudioMS.
2) режим коррекции наполнения по лямбде для "редактирования таблиц" (онлайн-откатка);
3) Режимы редактирования: софт-селекшен, интерполяция и т.п.
Для обычного менеджера сделаешь?

Отправлено с моего PRO 6 через Tapatalk
ИЖ 2126 Ода, УМПО 3317,Январь 5.1 (Был Secu-3T M644), Фазированный впрыск(ДАД+ДТВ) (был Моновпрыск C16NZ)
andreika
Posts: 179
Joined: 21 Oct 2013, 17:52
Your CAR: ВАЗ-2103
SECU version: DIY SECU-3i
Location: Киев
Has thanked: 28 times
Been thanked: 78 times
Contact:

Re: ВАЗ 2103

Post by andreika »

darxfame wrote:Для обычного менеджера сделаешь?
Это не от меня зависит, а от Алексея (STC). Если он захочет добавить этот функционал в официальный менеджер, тогда да. Вообще, можно было бы многое добавить для удобства пользования, но мне не хочется поддерживать две ветки кода и переносить свои патчи всякий раз как Алексей изменит что-то в менеджере. Было бы здорово, если бы Алексей где-то прояснил свою политику в отношении добавления новых фичей на уровне готовых сторонних патчей...
User avatar
STC
Posts: 13843
Joined: 30 Apr 2013, 23:41
Your CAR: AZLK 2140
SECU version: DIY SECU-3
Location: North Korea
Has thanked: 2160 times
Been thanked: 4335 times
Contact:

Re: ВАЗ 2103 "Рыжик" на SECU-3i

Post by STC »

Эта фича давно запланирована, пока просто нет времени это сделать.
Author of the SECU-3™ project http://SECU-3.org. An open source engine control unit / Ignition control system, (C) 2007.
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
Post Reply

Return to “ВАЗ”