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