2026-05-09 13:20:17 +03:00
2026-03-10 13:17:00 +03:00
2026-05-09 13:20:17 +03:00
2026-03-10 13:17:00 +03:00
2026-05-09 13:20:17 +03:00
2026-05-09 13:20:17 +03:00
2026-05-09 14:02:54 +03:00
2026-03-24 04:38:40 +03:00
2026-05-09 14:02:54 +03:00
2026-03-10 13:17:00 +03:00

CCSModuleSW30Web

Прошивка контроллера DC-зарядного модуля на STM32F107 (STM32CubeIDE). Проект реализует управление зарядной сессией, обработку состояния EV по CP-линии, управление силовым блоком через CAN и обмен с верхним уровнем по UART.

Архитектура прошивки

Логика разделена на несколько уровней:

  • Оркестрация и планировщик задач: Core/Src/main.c
  • Состояния зарядной сессии и протокол с Everest: Core/Src/serial.c
  • Управление силовой частью и контакторами: Core/Src/psu_control.c
  • Обработка CP (PWM/состояние EV): Core/Src/cp.c
  • Единая модель состояния коннектора: Core/Src/charger_control.c, Core/Inc/charger_control.h
  • Локальный протокол управления/мониторинга: Core/Src/serial_control.c, Core/Src/serial_handler.c
  • Низкоуровневое управление платой: Core/Src/board.c, Core/Src/gpio.c, Core/Src/can.c, Core/Src/usart.c

Основной цикл и выполнение задач

main() инициализирует периферию и подсистемы (CCS_Init, SC_Init, PSU_Init, CONN_Init), после чего переходит в бесконечный цикл.

В основном цикле выполняются:

  • PSU_ReadWrite() — цикл опроса/команд силового блока и расчёт целевых значений.
  • PSU_Task() — state machine силовой части, включение/выключение контакторов, контроль аварий.
  • METER_CalculateEnergy() — расчёт энергии.
  • CONN_Loop() — консолидация ошибок и общих флагов состояния сессии.
  • LED_Write() — применение рассчитанного состояния индикации.

Ключевой механизм: ED_Delay() используется как кооперативный мини-планировщик и внутри задержки вызывает:

  • CCS_SerialLoop() — обмен с Everest и переходы состояния коннектора;
  • StopButtonControl() — обработка кнопки STOP/FORCE UNLOCK/RESET;
  • CP_Loop() — чтение и фильтрация состояния CP;
  • CONN_Task() — управление индикацией/сигнализацией;
  • LED_Task() — анимация RGB;
  • SC_Task() — локальный UART-протокол.

Таким образом, даже во время "задержек" критичные сервисные задачи продолжают выполняться.

Модель управления зарядной сессией

Центр логики сессии находится в CCS_SerialLoop() (serial.c). Она работает как state machine EVSE-стороны и переводит систему между состояниями:

  • неизвестное/инициализация,
  • отсутствие автомобиля,
  • требование авторизации,
  • подключено/заряд,
  • режим переподключения,
  • отключено по команде или по таймауту связи.

Переходы определяются комбинацией факторов:

  • текущее состояние CP (автомобиль не подключен/подключен/готов),
  • команды внешней системы (start, stop, force unlock),
  • разрешение выдачи мощности (EnableOutput),
  • наличие ошибок в силовой части и контакторах,
  • состояние обмена с Everest.

Структура CONN выступает как единый контейнер рабочего состояния сессии, где сводятся:

  • требуемые напряжение/ток,
  • разрешение на выдачу мощности,
  • команда оператора (start/stop/unlock),
  • текущая стадия сессии,
  • ошибки коннектора/силовой части.

CP-линия и взаимодействие с EV

cp.c отвечает за:

  • генерацию PWM на CP-линии (CP_SetDuty),
  • измерение уровня CP и преобразование в дискретное состояние EV,
  • цифровую фильтрацию переходов состояния (CP_FilterState) для подавления дребезга.

Команды верхнего уровня могут менять duty CP, что влияет на допустимый ток/режим со стороны EV. Результат фильтрации CP непосредственно используется в state machine сессии (serial.c).

Силовая часть и контакторы

psu_control.c реализует state machine источника питания и цепи контакторов:

  • инициализация и проверка готовности PSU;
  • отправка уставок напряжения/тока;
  • включение/выключение силовой части;
  • ожидание подтверждений и контроль таймаутов;
  • контроль обратной связи контактора;
  • аварийный останов при несогласованности состояния.

Управление силовыми выходами выполняется через реле платы (RELAY_AC, RELAY_DC), а факт замыкания контролируется входом обратной связи контактора. При неисправностях флаги contactor_fault/psu_fault поднимаются и транслируются в общую модель CONN, что блокирует дальнейшую выдачу мощности.

Интерфейсы обмена

UART3: канал к Everest

serial.c реализует пакетный обмен с CRC:

  • приём команд, их валидация и применение к текущей сессии;
  • отправка телеметрии/состояния с фиксированной периодикой;
  • обработка ошибок UART и восстановление DMA-приёма.

Встроен watchdog канала: при потере связи сначала выдаётся предупреждение, затем выполняется защитный переход в безопасное состояние с остановкой выдачи мощности.

UART2/UART5: локальное управление и мониторинг

serial_control.c и serial_handler.c реализуют отдельный локальный протокол:

  • разбор пакетов и CRC32-проверка;
  • команды чтения состояния/информации;
  • команды управления (разрешение заряда, ограничение мощности, reset и т.д.);
  • публикация телеметрии.

CAN2: управление силовым источником

psu_control.c использует CAN2 для обмена с PSU:

  • передача управляющих команд и уставок;
  • запрос/получение телеметрии;
  • обработка приёмных кадров в callback и обновление внутренних переменных состояния.

Защиты и отказобезопасность

В прошивке заложены независимые защитные механизмы:

  • E-STOP (короткое/долгое/очень долгое удержание): stop, force unlock, reset.
  • Потеря обмена с Everest: автоматическая остановка зарядки и перевод в безопасное состояние.
  • Контроль контактора: проверка соответствия команды и физической обратной связи.
  • Таймауты включения/выключения PSU: переход в fault при отсутствии ожидаемого подтверждения.
  • Фильтрация CP-переходов: исключение ложных переключений от помех.

Где смотреть ключевую логику в первую очередь

Для быстрого входа в проект:

  • Core/Src/main.c — архитектурный "скелет" и расписание вызовов.
  • Core/Src/serial.c — главная state machine зарядной сессии.
  • Core/Src/psu_control.c — силовая логика, контакторы, fault-handling.
  • Core/Src/cp.c — физика CP и распознавание состояния EV.
  • Core/Src/serial_control.c + Core/Src/serial_handler.c — локальный протокол управления.
S
Description
Прошивка для станции DC30 CCS
Readme MIT 7.5 MiB
Languages
C 99.3%
Makefile 0.3%
Assembly 0.3%