16 KiB
16 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | |||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| gbt-to-ccs-port | Перенос прошивки модуля GBT на CCS с сохранением логики силовой части и веб-интерфейса, интеграцией готового CCS-стека из проекта CS60DC_CCS_STM32 и разделением двух независимых UART-протоколов. |
|
false |
Цель
Сделать новую прошивку для платы модуля, основанную на проекте GbTModuleSW30Web, которая:
- полностью избавлена от GBT-логики и GBT-протоколов,
- использует CCS-алгоритмы и протокол из проекта
[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c), - сохраняет силовую часть и веб/диагностический функционал существующей GBT-прошивки,
- использует два независимых UART: существующий (как в GBT) + новый
USART3под CCS-протокол, - сохраняет инициализацию CAN1 как заглушку, но не использует старый GBT‑CAN.
Архитектура на целевом проекте
- Базовый проект: берем за основу прошивку модуля GBT —
[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c). - Источник CCS-логики: переносим state machine и протокол CCS из
[CS60DC_CCS_STM32](CS60DC_CCS_STM32/Core/Src/main.c)и связанных файлов:[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)— протокол MCU↔Everest (через UART, сейчасhuart1),[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)— формирование и измерение CP (PWM+ADC),[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)+ соответствующие заголовки и типыCCS_*иCCS_EDCAN_*.
- Распределение UART:
- существующий UART из GBT‑прошивки оставляем без изменений (диагностика / веб / что используется сейчас),
- добавляем
USART3для CCS‑протокола, берём настройки (baud, parity и т.п.) изCS60DC_CCS_STM32(там CCS сейчас сидит наUSART1, но параметры переносим наUSART3).
- CAN1:
- оставляем
MX_CAN1_Init()и базовую инициализацию как заглушку (по требованию), - старые GBT‑обработчики CAN и
GBT_CAN_ReInit()удаляем или заменяем пустыми/адаптированными вызовами к EDCAN при необходимости.
- оставляем
- Силовая часть, реле, измерения:
- логика
PSU_*,METER_*,CONN_*,LED_*и Stop/E‑Stop остаётся из GBT‑проекта, - управление главным DC‑контактором остаётся как в
[GbTModuleSW30Web](GbTModuleSW30Web/Core/Src/main.c)и связанных файлах, но команды/состояния будут приходить из CCS‑логики.
- логика
План изменения main.c и ядра логики
- Инициализация (start‑up):
- в
[GbTModuleSW30Web/Core/Src/main.c](GbTModuleSW30Web/Core/Src/main.c)сохраняем логику OpenBLT/VectorBase (VectorBase_Config()и т.п.); - после стандартной HAL‑инициализации (
HAL_Init,HAL_RCC_DeInit,SystemClock_Config,MX_GPIO_Initи т.д.)- оставляем инициализацию общих периферий:
GPIO,ADC1,CAN1,RTC,TIM4(если используется для других задач), существующие UART (2/5/1) иUSART3; - убираем GBT‑специфичные инициализации:
GBT_Init(),GBT_SetConfig(),GBT_CAN_ReInit(), прямые вызовыcharger_gbt.h,j1939.hи т.п.; - добавляем CCS‑инициализации по образцу из
CS60DC_CCS_STM32/Core/Src/main.c:ADC_Init()(если в проект переносится фильтрация АЦП /adc_filter.c),CP_Init()и первоначальноеCP_SetDuty(100);,CCS_Init();,- инициализацию EDCAN/адреса:
EDCAN_Init(SW_GetAddr());и возможныйCAN_ReInit();, если EDCAN используется.
- оставляем инициализацию общих периферий:
- в
- Главный цикл:
- исходно в GBT‑прошивке основной цикл делает:
PSU_ReadWrite();,PSU_Task();,METER_CalculateEnergy();,CONN_Loop();,LED_Write();,StopButtonControl();и несколькоED_Delay(...), в которых вызываются GBT‑таски (GBT_ChargerTask(),GBT_ManageLockMotor(),CONN_CC_ReadStateFiltered()и т.п.);
- заменяем содержимое
ED_Delay()и циклаwhile(1)так, чтобы:- в основном цикле выполнялись:
CCS_SerialLoop();(как в[CS60DC_CCS_STM32/Core/Src/main.c](CS60DC_CCS_STM32/Core/Src/main.c)),EDCAN_Loop();(если EDCAN используется для обмена с главным контроллером),CP_Loop();(обновление состояния CP и заполнениеCCS_EDCAN_Output.cpState),- существующие
PSU_*,METER_*,CONN_Loop(),LED_Write(),StopButtonControl();
ED_Delay()больше не опирается на GBT‑таски, а, при необходимости, просто крутитCCS_SerialLoop()/CP_Loop()и необязательные сервисные задачи.
- в основном цикле выполнялись:
- исходно в GBT‑прошивке основной цикл делает:
Интеграция CCS‑протокола в проект модуля
- Перенос файлов CCS:
- добавляем в проект модуля исходники и заголовки из
CS60DC_CCS_STM32:[Core/Src/cp.c](CS60DC_CCS_STM32/Core/Src/cp.c)+Core/Inc/cp.h,[Core/Src/serial.c](CS60DC_CCS_STM32/Core/Src/serial.c)+Core/Inc/serial.h,[Core/Src/charger_ccs.c](CS60DC_CCS_STM32/Core/Src/charger_ccs.c)+Core/Inc/charger_ccs.h,- необходимые типы
CCS_*иCCS_EDCAN_*(структуры состояний, входов/выходов, команд).
- подправляем include‑пути и зависимости под структуру каталогов
GbTModuleSW30Web.
- добавляем в проект модуля исходники и заголовки из
- Привязка к
USART3:- в перенесённом
serial.cзаменяем все использованияhuart1наhuart3:- глобальный
extern UART_HandleTypeDef huart1;→huart3;, HAL_UARTEx_ReceiveToIdle_IT(&huart1, ...)→&huart3,HAL_UART_Transmit(&huart1, ...)→&huart3;
- глобальный
- обновляем
HAL_UARTEx_RxEventCallbackтак, чтобы он реагировал наhuart3; - убеждаемся, что
MX_USART3_UART_Init()вGbTModuleSW30Web/Core/Src/usart.cнастроен на тот же baud/формат, что иUSART1вCS60DC_CCS_STM32.
- в перенесённом
- CP‑цепь (CP ADC + PWM на PA7):
- в переносимом
cp.cуже есть логика расчёта напряжения CP поADC_CP_CHANNELи управление PWM черезTIM2; - на целевой плате:
- настраиваем канал ADC, соответствующий
ADC1_IN4, какADC_CP_CHANNELв конфигурационных файлах/enum‑ах ADC; - убеждаемся, что ножка
PA7привязана к нужному таймеру (по CubeMX‑конфигу) и совпадает с тем, что ожидаетcp.c(сейчас TIM2/CH1/CH2) — при необходимости в план добавим правку конфигурации таймера и каналов;
- настраиваем канал ADC, соответствующий
- оставляем границы состояний CP (A/B/C/D/E/F) и формулы из текущего
cp.cбез изменений, чтобы поведение соответствовало проверенной CCS‑прошивке.
- в переносимом
- Связка CCS ↔ силовая часть/EDCAN:
CCS_SerialLoop()управляет структурамиCCS_EDCAN_Outputи читаетCCS_EDCAN_Input;- в коде модуля (там, где сейчас GBT‑логика связывает CAN/силовую часть с протоколом) заменяем связь на работу с
CCS_EDCAN_*:- измеренные ток/напряжение из силовой части кладём в
CCS_EDCAN_Input.measuredVoltageиmeasuredCurrent, - команды включения/отключения питания (
PSU_ON/OFF/PREPARE) и ошибки записываем вCCS_EDCAN_Input.*, - из
CCS_EDCAN_Outputчитаем:enablePSU/requestedVoltage/requestedCurrent— для управления источником питания,connectorState,cpState,chargingPercentage— для индикации, логов и веб‑интерфейса.
- измеренные ток/напряжение из силовой части кладём в
Удаление GBT и чистка кода
- Удаление GBT‑зависимостей:
- в
GbTModuleSW30Webнаходим и удаляем/отключаем:#include "charger_gbt.h",j1939.h, GBT‑специфические модули блокировки/замка, если они не используются механически;- функции
GBT_Init(),GBT_ChargerTask(),GBT_ManageLockMotor(),GBT_SetConfig(),GBT_CAN_ReInit()и т.п.;
- оставляем общий код, не завязанный именно на GBT (питание, измерения, коннектор, индикация, веб‑сервер, логирование).
- в
- CAN:
- инициализация
CAN1(MX_CAN1_Init()) должна остаться, чтобы bootloader/система не сломались; - если от GBT остался
CAN2, его можно выключить из конфигурации, если он аппаратно не используется в CCS‑варианте; - при необходимости добавляем простую заглушку вместо старых GBT‑обработчиков, чтобы сборка прошла без ошибок.
- инициализация
Сохранение веб‑/диагностического функционала
- Веб‑интерфейс и диагностика:
- по вашему требованию сохраняем весь существующий веб‑функционал
GbTModuleSW30Web, только:- удаляем/переписываем поля и страницы, завязанные на GBT‑состояния/параметры,
- вместо GBT‑переменных и структур подставляем данные из
CCS_EDCAN_Output,CCS_State,CCS_EvInfoи т.п.;
- протокол диагностики через существующий UART не меняем по формату, только отключаем GBT‑команды/состояния и, при необходимости, добавляем новые поля/команды под CCS (по согласованию).
- по вашему требованию сохраняем весь существующий веб‑функционал
Тестирование и критерии приёмки
- Юнит‑/модульные проверки на стенде:
- запуск прошивки без подключенного EV — проверка, что станция в состоянии
Unplugged/EV_STATE_A_IDLE, нет перезагрузок и ошибок; - подключение EV/эмулятора:
- проверка переходов CP‑состояний A→B→C, корректных значений напряжения CP,
- проверка, что
CCS_ConnectorStateиCCS_EvseStateменяются ожидаемо (Preparing, Charging, Finished и т.п.);
- проверка обмена по
USART3:- корректный приём/передача пакетов с CRC16,
- реакция на команды Everest (ENABLE, START/STOP, PWM_DUTY, SET_OUTPUT_VOLTAGE, EV_INFO, EVSE_STATE, KEEP_ALIVE);
- проверка защиты:
- ESTOP/StopButton — немедленное отключение выхода и отправка
CCS_SendEmergencyStop(); - таймаут связи с хостом (
last_host_seen) — перевод в безопасное состояние (отключение PSU, CP duty = 100%, логEverest timeout).
- ESTOP/StopButton — немедленное отключение выхода и отправка
- запуск прошивки без подключенного EV — проверка, что станция в состоянии
- Регрессионные проверки существующей функциональности:
- веб‑страницы открываются, основные параметры (напряжение, ток, энергии, состояния коннектора) отображаются корректно;
- сохранены привычные логи/формат сообщений (насколько возможно) для удобства отладки.