American English British English Български Čeština Français Deutsch (Du) Magyar Italiano 日本語 Lietuvių Polski Српски Slovenčina Español (Tú) Türkçe Українська
Select language:

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

<<

Dev9tiU

User avatar

Posts: 156

Joined: 11 Aug 2014, 06:21

Location: Россия Якутск

Your CAR: Москвич 2140 , 3320Э

SECU version: DIY SECU-3T


Has thanked: 10 times
Been thanked: 21 times

Post 14 Jul 2017, 04:41

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

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

STC

User avatar

Posts: 6536

Joined: 30 Apr 2013, 23:41

Location: Ukraine

Your CAR: AZLK 2140

SECU version: DIY SECU-3


Has thanked: 800 times
Been thanked: 1317 times

Post 14 Jul 2017, 14:49

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

Скорее всего подружить можно. Нужно знать что тому газовому мозгу нужно (что и при каких условиях слать).
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 (вступаем!)
<<

Dev9tiU

User avatar

Posts: 156

Joined: 11 Aug 2014, 06:21

Location: Россия Якутск

Your CAR: Москвич 2140 , 3320Э

SECU version: DIY SECU-3T


Has thanked: 10 times
Been thanked: 21 times

Post 14 Jul 2017, 14:55

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

Хорошо,поштудирую документацию
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ПО 4,7
ДПКВ.ДПРВ.ДАД.ЛЗ.ДТОЖ.ДТВ.ДД.
<<

Dev9tiU

User avatar

Posts: 156

Joined: 11 Aug 2014, 06:21

Location: Россия Якутск

Your CAR: Москвич 2140 , 3320Э

SECU version: DIY SECU-3T


Has thanked: 10 times
Been thanked: 21 times

Post 16 Jul 2017, 03:09

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

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

в принципе можно выбирать что читать а что не читать. поддерживаются все протоколы CAN и OBD
Attachments
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ПО 4,7
ДПКВ.ДПРВ.ДАД.ЛЗ.ДТОЖ.ДТВ.ДД.
<<

Sergey21126

User avatar

Posts: 89

Joined: 04 Dec 2016, 22:11

Your CAR: LADA 2190

SECU version: DIY SECU-3i


Has thanked: 2 times
Been thanked: 24 times

Post 16 Jul 2017, 21:37

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

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

Можно попробовать слать стандартные PIDы с перечисленными параметрами. Это уже освоено :D
Правда тут уже лучше сделать фильтрацию PID_запроса, и слать с PID_ответа, как и задумано по спецификации OBDII. Но для этого надо освоить фильтрацию запросов на аппаратном уровне с помощью MCP2515. Как это делать программно - я уже привел пример в соседней теме. Но для AVR очень желательно работать с аппаратной частью CAN, а то завалит...
А шина 500к/11 байт?
<<

AlxSh

User avatar

Posts: 92

Joined: 14 Jul 2014, 12:52

Location: Ивановская область, Кинешма

Your CAR: 2141 1.7

SECU version: DIY SECU-3


Has thanked: 2 times
Been thanked: 24 times

Post 17 Jul 2017, 08:10

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

Использовался в контроллере одноцилиндрового двухтактного двигателя для связи с ELM327 и отображения данных в торке.
  Code:
/** Реализация обработки запросов 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:
/** Реализация обработки запросов 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:
/** Обработчик 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

User avatar

Posts: 89

Joined: 04 Dec 2016, 22:11

Your CAR: LADA 2190

SECU version: DIY SECU-3i


Has thanked: 2 times
Been thanked: 24 times

Post 17 Jul 2017, 09:10

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

А как поймать msg.id == 0x7DF с помощью фильтра на MCP2515?
Stm32 довольно шустрый, и отсеивают id программно. Это нормально.
<<

STC

User avatar

Posts: 6536

Joined: 30 Apr 2013, 23:41

Location: Ukraine

Your CAR: AZLK 2140

SECU version: DIY SECU-3


Has thanked: 800 times
Been thanked: 1317 times

Post 17 Jul 2017, 12:12

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

В 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

User avatar

Posts: 92

Joined: 14 Jul 2014, 12:52

Location: Ивановская область, Кинешма

Your CAR: 2141 1.7

SECU version: DIY SECU-3


Has thanked: 2 times
Been thanked: 24 times

Post 17 Jul 2017, 14:24

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

CAN всегда аппаратный. Ничего не делается программно. CAN взводит прерывание по приему/отправке сообщения прошедшего маски и фильтры.
Маски и фильтры есть везде. Маски выделяют биты которые нужно проверять, а фильтры содержат биты для проверки. Все работает четко. Разница в реализации списков фильтрации и в данном случае, наверно, не существенна, т.к. нужно ловить сообщения с одним ID.
А вот протоколов обмена много! И протокол должен быть идентичен применяемому в авто, т.е. должна быть поддержка всего что бывает в жизни. Я реализовывал iso15765 и частично j1939. Но системы были изолированные. iso15765 <-> elm327. j1939 - мои устройства в машине. ECU <-> Приборка <-> WBO. j1939 был реализован в результате желания получить блочную передачу данных большого объема. Автомат пересылки блока кусками с досылкой не дошедших сообщений. Вобщем, интересный механизм.
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
<<

AlxSh

User avatar

Posts: 92

Joined: 14 Jul 2014, 12:52

Location: Ивановская область, Кинешма

Your CAR: 2141 1.7

SECU version: DIY SECU-3


Has thanked: 2 times
Been thanked: 24 times

Post 17 Jul 2017, 14:56

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

Sergey21126 wrote:А как поймать msg.id == 0x7DF с помощью фильтра на MCP2515?
Stm32 довольно шустрый, и отсеивают id программно. Это нормально.

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

Return to Прошивки

Who is online

Users browsing this forum: No registered users and 1 guest

Powered by phpBB® Forum Software © phpBB Group.