Lovati Easyfast obd II (связь через CAN)

Обсуждаем прошивки, алгоритмы работы в разных режимах (например, алгоритм работы автоподсоса).
Наборы тюнингованых прошивок МПСЗ SECU (заточенных под конкретную конфигурацию двигателя)
Post Reply
User avatar
Dev9tiU
Posts: 595
Joined: 11 Aug 2014, 06:21
Your CAR: Москвич 2140 , 3320Э
SECU version: DIY SECU-3i
Location: Почти край Света
Has thanked: 51 times
Been thanked: 113 times
Contact:

Lovati Easyfast obd II (связь через CAN)

Post by Dev9tiU »

Есть такой вопрос, имеется блок управления газовым оборудованием Lovati Easyfast obd II
Я так понял ЭБУ газа получает данные с основного ЭБУ эсуд автомобиля по шине обд . Стало интересно можно ли подружить наш блок Secu и блок Lovato
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ШИМ РДВ. ПО 5,0.
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
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: Lovati Easyfast obd II (связь через CAN)

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 (вступаем!)
User avatar
Dev9tiU
Posts: 595
Joined: 11 Aug 2014, 06:21
Your CAR: Москвич 2140 , 3320Э
SECU version: DIY SECU-3i
Location: Почти край Света
Has thanked: 51 times
Been thanked: 113 times
Contact:

Re: Lovati Easyfast obd II (связь через CAN)

Post by Dev9tiU »

Хорошо,поштудирую документацию
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ШИМ РДВ. ПО 5,0.
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
User avatar
Dev9tiU
Posts: 595
Joined: 11 Aug 2014, 06:21
Your CAR: Москвич 2140 , 3320Э
SECU version: DIY SECU-3i
Location: Почти край Света
Has thanked: 51 times
Been thanked: 113 times
Contact:

Re: Lovati Easyfast obd II (связь через CAN)

Post by Dev9tiU »

газомозгу нужно: температура ОЖ, давление MAP, обороты, напряжение блямба зонта (или просто значение лямбда чегото непонятно), быстрая коррекция , медленная коррекция

в принципе можно выбирать что читать а что не читать. поддерживаются все протоколы CAN и OBD
Attachments
2017-07-16_09-10-04.png
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ШИМ РДВ. ПО 5,0.
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
Sergey21126
Posts: 89
Joined: 04 Dec 2016, 22:11
Your CAR: LADA 2190
SECU version: DIY SECU-3i
Has thanked: 2 times
Been thanked: 26 times

Начал всплывать айсберг OBDII

Post by Sergey21126 »

Dev9tiU wrote:газомозгу нужно: температура ОЖ, давление MAP, обороты, напряжение блямба зонта (или просто значение лямбда чегото непонятно), быстрая коррекция , медленная коррекция
Можно попробовать слать стандартные PIDы с перечисленными параметрами. Это уже освоено :D
Правда тут уже лучше сделать фильтрацию PID_запроса, и слать с PID_ответа, как и задумано по спецификации OBDII. Но для этого надо освоить фильтрацию запросов на аппаратном уровне с помощью MCP2515. Как это делать программно - я уже привел пример в соседней теме. Но для AVR очень желательно работать с аппаратной частью CAN, а то завалит...
А шина 500к/11 байт?
AlxSh
Posts: 92
Joined: 14 Jul 2014, 12:52
Your CAR: 2141 1.7
SECU version: DIY SECU-3
Location: Ивановская область, Кинешма
Has thanked: 2 times
Been thanked: 25 times
Contact:

Re: Lovati Easyfast obd II (связь через CAN)

Post by AlxSh »

Использовался в контроллере одноцилиндрового двухтактного двигателя для связи с ELM327 и отображения данных в торке.

Code: Select all

/** Реализация обработки запросов OBD и отправки данных
 * @file
 * @author Aleksey Shibanov
 */

#ifndef __obd_h
#define __obd_h

#define OBD_DIAG_ADDR     0x7DF
#define OBD_ECU1_ADDR     0x7E8

#define OBD_MAX_LEN       32

typedef __packed struct {
  uint8_t len;
  uint8_t mode;
  uint8_t pid;
  uint8_t buf[OBD_MAX_LEN];
} obd_ans_t;

obd_ans_t *obd_Parse(uint8_t *cmd, uint8_t len);

#endif
/* end file */

Code: Select all

/** Реализация обработки запросов OBD и отправки данных
 * @file obd2.c
 * @author Aleksey Shibanov
 */

#include "ecu.h"
#include "obd.h"
#include "funconv.h"
#include "magnitude.h"
#include <string.h>

#define PID_ENABLE(p,x)   (p[(((x)-1)%0x20)/8] |= (1<<(7-(((x)-1)%8))))
#define HTONS(x)          ((uint16_t)(((uint16_t)(x)<<8)|((uint16_t)(x)>>8)))
#define HTONL(x)          (uint32_t)(((x)>>24)|((x)<<24)|(((x)&0xFF00)<<8)|(((x)&0xFF0000)>>8))

static obd_ans_t obd;

obd_ans_t *obd_Parse(uint8_t *cmd, uint8_t len){
  ecudata_t *d = &edat;
  memset(&obd, 0, sizeof(obd_ans_t));
  obd.mode = *++cmd + 0x40;
  obd.pid = cmd[1];
  if (cmd[0] == 0x01){
    switch (cmd[1]){
    case 0x00:
      obd.len = 6;
      if (edat.flags & (1<<ECU_FLAGS_USE_CLT)) PID_ENABLE(obd.buf, 0x05);
      if (edat.flags & (1<<ECU_FLAGS_USE_CKPS)) PID_ENABLE(obd.buf, 0x0C);
      if (edat.flags & ~((1<<ECU_FLAGS_USE_CLT)|(1<<ECU_FLAGS_USE_CKPS))) PID_ENABLE(obd.buf, 0x20);
      PID_ENABLE(obd.buf, 0x1F);
      break;
    case 0x20:
      obd.len = 6;
      if (edat.flags & (1<<ECU_FLAGS_USE_FUEL_LEVEL)) PID_ENABLE(obd.buf, 0x2F);
      break;

    // Engine coolant temperature, °C, A-40, -40, 215
    case 0x05:
      if ((edat.flags & (1<<ECU_FLAGS_USE_CLT)) == 0) return 0;
      obd.len = 3;
      obd.buf[0] = restrict_value((d->sens.clt+405)/TEMP_FP_MULTIPLAYER, -40, 215);
      break;

    // Engine RPM, rpm, ((A*256)+B)/4, 0, '16,383.75'
    case 0x0C:
      if ((edat.flags & (1<<ECU_FLAGS_USE_CKPS)) == 0) return 0;
      obd.len = 4;
      *(uint16_t*)obd.buf = HTONS(d->sens.frequen*4);
      break;

    // Run time since engine start, s, (A*256)+B, 0, 65535
    case 0x1F:
      obd.len = 4;
      *(uint16_t*)obd.buf = HTONS(d->engine_drive_time);
      break;

      // Fuel Level Input, %, A*100/255, 0, 100
    case 0x2F:
      if ((edat.flags & (1<<ECU_FLAGS_USE_FUEL_LEVEL)) == 0) return 0;
      obd.len = 3;
      obd.buf[0] = (((int32_t)d->sens.fuel_level+2) * 255) / 1000;
      break;

    // EGT1, °C, A, 0, 1000
    case 0x30:
      if ((edat.flags & (1<<ECU_FLAGS_USE_TC1)) == 0) return 0;
      obd.len = 4;
      *(uint16_t*)obd.buf = HTONS(restrict_value(d->sens.tc1, 0, 999));
      break;

    // EGT2, °C, A, 0, 1000
    case 0x31:
      if ((edat.flags & (1<<ECU_FLAGS_USE_TC2)) == 0) return 0;
      obd.len = 4;
      *(uint16_t*)obd.buf = HTONS(restrict_value(d->sens.tc2, 0, 999));
      break;

    // EGT3, °C, A, 0, 1000
    case 0x32:
      if ((edat.flags & (1<<ECU_FLAGS_USE_TC3)) == 0) return 0;
      obd.len = 4;
      *(uint16_t*)obd.buf = HTONS(restrict_value(d->sens.tc3, 0, 999));
      break;

    // EGT4, °C, A, 0, 1000
    case 0x33:
      if ((edat.flags & (1<<ECU_FLAGS_USE_TC4)) == 0) return 0;
      obd.len = 4;
      *(uint16_t*)obd.buf = HTONS(restrict_value(d->sens.tc4, 0, 999));
      break;

    // Full drive time, s, 0
    case 0x34:
      obd.len = 6;
      *(uint32_t*)obd.buf = HTONL(d->drive_cntr);
      break;

    default:
      return 0;
    }
  }
  else {
    return 0;
  }
  return &obd;
}

/* end file */

Code: Select all

/** Обработчик CAN
 * @file can.c
 * @author Aleksey Shibanov
 */
#include <string.h>
#include "hardware.h"
#include "ecu.h"
#include "magnitude.h"
#include "led.h"

#include "can_core.h"
#include "can_types.h"
#include "can.h"
#include "irq.h"
#include "iso15765.h"
#include "obd.h"

#include <string.h>

typedef struct {
  obd_ans_t *ans;
  uint8_t pkt_idx;
  uint8_t data_idx;
} can_tx_t;

static can_tx_t tx;

static const can_filter_t can_filters[] = {
  { .id = OBD_DIAG_ADDR, .mask = 0xFFF, .ext_format = 0, .fifo_id = 0 },
};

static can_msg_t can_tx_msg = { .format = STANDARD_FORMAT, .type = DATA_FRAME, .id = OBD_ECU1_ADDR };

static void canTxHandler(void){
  if (!tx.ans) return;

  if (tx.ans->len < 8){
    can_tx_msg.len = tx.ans->len + 1;
    can_tx_msg.data.b[0] = ISO15765_SF_0(tx.ans->len);
    memcpy(&can_tx_msg.data.b[1], &tx.ans->mode, tx.ans->len);
    canTransmit(&can_tx_msg);
    led_Blink(5);
    tx.ans = 0;
  }
  else {
    uint32_t inc;
    uint8_t *dst = can_tx_msg.data.b;
    uint8_t *src = &tx.ans->mode;
    if (!tx.data_idx){
      tx.pkt_idx = tx.data_idx;
      *dst++ = ISO15765_FF_0(tx.ans->len);
      *dst++ = ISO15765_FF_1(tx.ans->len);
      inc = 6;
    }
    else if (tx.data_idx >= tx.ans->len){
      *dst++ = ISO15765_CF_0(tx.pkt_idx);
      inc = 7;
    }
    memcpy(dst, &src[tx.data_idx], inc);
    if (canTransmit(&can_tx_msg) != -1){
      led_Blink(5);
      tx.data_idx += inc;
      if (tx.data_idx >= tx.ans->len){
        tx.ans = 0;
        return;
      }
      tx.pkt_idx++;
    }
  }
}

static void canRxHandler(can_msg_t *msg){
  tx.ans = obd_Parse(msg->data.b, msg->len);
  if (tx.ans){
    tx.data_idx = 0;
    canTxHandler();
  }
}

void can_Enable(void){
#ifdef USE_SHARED_IRQ
  irqSwitchToCAN();
#endif
  canEnable();
  canSetFilters(can_filters, CAN_FILTERS_NUM);
}

void can_Disable(void){
#ifdef USE_SHARED_IRQ
  irqSwitchToUSB();
#endif
  canDisable();
}

void can_Init(void){
  canInit(CAN_250KBPS, canRxHandler, canTxHandler);
}

/* end file */
Код написан под stm32 с аппаратным CAN, но легко портируется на другую платформу.
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
Sergey21126
Posts: 89
Joined: 04 Dec 2016, 22:11
Your CAR: LADA 2190
SECU version: DIY SECU-3i
Has thanked: 2 times
Been thanked: 26 times

Re: Lovati Easyfast obd II (связь через CAN)

Post by Sergey21126 »

А как поймать msg.id == 0x7DF с помощью фильтра на MCP2515?
Stm32 довольно шустрый, и отсеивают id программно. Это нормально.
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: Lovati Easyfast obd II (связь через CAN)

Post by STC »

В MCP2515 шесть аппаратных фильтров и две маски. Насколько я понял, они не умеют отсеивать сообщения вне какого-то диапазона, а просто как битовые маски накладываются (видимо пользы от таких фильтров будет не очень много). Видимо большую часть сообщений при помощи этих фильтров можно отсеять, но не все. У меня есть возможность проверять наличие входящих сообщений каждые 1.5мс, не знаю много это или мало. Общение с MCP2515 не отнимает много ресурсов и у меня сделано через прерывания. Кроме этого, я думаю, что SECU ставят и будут ставить на относительно старые автомобили, в которых на CAN шине висит не много девайсов. Соответственно, эти девайсы не должны слишком нагружать САN шину.

p.s. даташит по MPCP2515 пока подробно не изучал, так что могу ошибаться по поводу фильтров.
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 (вступаем!)
AlxSh
Posts: 92
Joined: 14 Jul 2014, 12:52
Your CAR: 2141 1.7
SECU version: DIY SECU-3
Location: Ивановская область, Кинешма
Has thanked: 2 times
Been thanked: 25 times
Contact:

Re: Lovati Easyfast obd II (связь через CAN)

Post by AlxSh »

CAN всегда аппаратный. Ничего не делается программно. CAN взводит прерывание по приему/отправке сообщения прошедшего маски и фильтры.
Маски и фильтры есть везде. Маски выделяют биты которые нужно проверять, а фильтры содержат биты для проверки. Все работает четко. Разница в реализации списков фильтрации и в данном случае, наверно, не существенна, т.к. нужно ловить сообщения с одним ID.
А вот протоколов обмена много! И протокол должен быть идентичен применяемому в авто, т.е. должна быть поддержка всего что бывает в жизни. Я реализовывал iso15765 и частично j1939. Но системы были изолированные. iso15765 <-> elm327. j1939 - мои устройства в машине. ECU <-> Приборка <-> WBO. j1939 был реализован в результате желания получить блочную передачу данных большого объема. Автомат пересылки блока кусками с досылкой не дошедших сообщений. Вобщем, интересный механизм.
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
AlxSh
Posts: 92
Joined: 14 Jul 2014, 12:52
Your CAR: 2141 1.7
SECU version: DIY SECU-3
Location: Ивановская область, Кинешма
Has thanked: 2 times
Been thanked: 25 times
Contact:

Re: Lovati Easyfast obd II (связь через CAN)

Post by AlxSh »

Sergey21126 wrote:А как поймать msg.id == 0x7DF с помощью фильтра на MCP2515?
Stm32 довольно шустрый, и отсеивают id программно. Это нормально.
Маска 0xFFF, фильтр 0x7DF. Пропустить все (не сбрасывать биты) -> Проверить на 0x7DF.
Нужен код? :-)
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
Post Reply

Return to “Прошивки”