Lovati Easyfast obd II (связь через CAN)
- 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)
Есть такой вопрос, имеется блок управления газовым оборудованием Lovati Easyfast obd II
Я так понял ЭБУ газа получает данные с основного ЭБУ эсуд автомобиля по шине обд . Стало интересно можно ли подружить наш блок Secu и блок Lovato
Я так понял ЭБУ газа получает данные с основного ЭБУ эсуд автомобиля по шине обд . Стало интересно можно ли подружить наш блок Secu и блок Lovato
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ШИМ РДВ. ПО 5,0.
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
- 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)
Скорее всего подружить можно. Нужно знать что тому газовому мозгу нужно (что и при каких условиях слать).
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 (вступаем!)
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
- 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)
Хорошо,поштудирую документацию
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ШИМ РДВ. ПО 5,0.
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
- 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)
газомозгу нужно: температура ОЖ, давление MAP, обороты, напряжение блямба зонта (или просто значение лямбда чегото непонятно), быстрая коррекция , медленная коррекция
в принципе можно выбирать что читать а что не читать. поддерживаются все протоколы CAN и OBD
в принципе можно выбирать что читать а что не читать. поддерживаются все протоколы CAN и OBD
М2140 . УЗАМ 3320 (248). Полусамодельный впускной коллектор. 60-2. Двухканальное зажигание. Фазированный впрыск. ШИМ управление вентилятором. ШИМ РДВ. ПО 5,0.
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
ДПКВ (ГАЗ).ДПРВ (ВАЗ).ДАД (Газель).ЛЗ (Bosch).ДТОЖ (ГАЗ).ДТВ (снят из дад газели).ДД (Унив.).
-
- 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
Можно попробовать слать стандартные PIDы с перечисленными параметрами. Это уже освоеноDev9tiU wrote:газомозгу нужно: температура ОЖ, давление MAP, обороты, напряжение блямба зонта (или просто значение лямбда чегото непонятно), быстрая коррекция , медленная коррекция
Правда тут уже лучше сделать фильтрацию PID_запроса, и слать с PID_ответа, как и задумано по спецификации OBDII. Но для этого надо освоить фильтрацию запросов на аппаратном уровне с помощью MCP2515. Как это делать программно - я уже привел пример в соседней теме. Но для AVR очень желательно работать с аппаратной частью CAN, а то завалит...
А шина 500к/11 байт?
-
- 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)
Использовался в контроллере одноцилиндрового двухтактного двигателя для связи с ELM327 и отображения данных в торке.
Код написан под stm32 с аппаратным CAN, но легко портируется на другую платформу.
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 */
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
-
- 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)
А как поймать msg.id == 0x7DF с помощью фильтра на MCP2515?
Stm32 довольно шустрый, и отсеивают id программно. Это нормально.
Stm32 довольно шустрый, и отсеивают id программно. Это нормально.
- 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)
В MCP2515 шесть аппаратных фильтров и две маски. Насколько я понял, они не умеют отсеивать сообщения вне какого-то диапазона, а просто как битовые маски накладываются (видимо пользы от таких фильтров будет не очень много). Видимо большую часть сообщений при помощи этих фильтров можно отсеять, но не все. У меня есть возможность проверять наличие входящих сообщений каждые 1.5мс, не знаю много это или мало. Общение с MCP2515 не отнимает много ресурсов и у меня сделано через прерывания. Кроме этого, я думаю, что SECU ставят и будут ставить на относительно старые автомобили, в которых на CAN шине висит не много девайсов. Соответственно, эти девайсы не должны слишком нагружать САN шину.
p.s. даташит по MPCP2515 пока подробно не изучал, так что могу ошибаться по поводу фильтров.
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 (вступаем!)
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
-
- 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)
CAN всегда аппаратный. Ничего не делается программно. CAN взводит прерывание по приему/отправке сообщения прошедшего маски и фильтры.
Маски и фильтры есть везде. Маски выделяют биты которые нужно проверять, а фильтры содержат биты для проверки. Все работает четко. Разница в реализации списков фильтрации и в данном случае, наверно, не существенна, т.к. нужно ловить сообщения с одним ID.
А вот протоколов обмена много! И протокол должен быть идентичен применяемому в авто, т.е. должна быть поддержка всего что бывает в жизни. Я реализовывал iso15765 и частично j1939. Но системы были изолированные. iso15765 <-> elm327. j1939 - мои устройства в машине. ECU <-> Приборка <-> WBO. j1939 был реализован в результате желания получить блочную передачу данных большого объема. Автомат пересылки блока кусками с досылкой не дошедших сообщений. Вобщем, интересный механизм.
Маски и фильтры есть везде. Маски выделяют биты которые нужно проверять, а фильтры содержат биты для проверки. Все работает четко. Разница в реализации списков фильтрации и в данном случае, наверно, не существенна, т.к. нужно ловить сообщения с одним ID.
А вот протоколов обмена много! И протокол должен быть идентичен применяемому в авто, т.е. должна быть поддержка всего что бывает в жизни. Я реализовывал iso15765 и частично j1939. Но системы были изолированные. iso15765 <-> elm327. j1939 - мои устройства в машине. ECU <-> Приборка <-> WBO. j1939 был реализован в результате желания получить блочную передачу данных большого объема. Автомат пересылки блока кусками с досылкой не дошедших сообщений. Вобщем, интересный механизм.
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
-
- 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)
Маска 0xFFF, фильтр 0x7DF. Пропустить все (не сбрасывать биты) -> Проверить на 0x7DF.Sergey21126 wrote:А как поймать msg.id == 0x7DF с помощью фильтра на MCP2515?
Stm32 довольно шустрый, и отсеивают id программно. Это нормально.
Нужен код?
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.