9.4 KiB
Executable File
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— локальный протокол управления.