# Проект AD для Keil

Это единая папка проекта для Keil uVision и стендовой проверки IHM08M1.

Открывать:

```text
F:\set\workspace\setcorp\set506\AD\AD_Keil_Project\MDK-ARM\IHM08M.uvprojx
```

Основная Simulink-модель лежит отдельно от Keil-проекта:

```text
F:\set\workspace\setcorp\set506\AD\Inu_im_1wnd_3lvl\inu_im_1wnd_3lvl.slx
```

## Что внутри

| Папка или файл | Назначение |
|---|---|
| `Core/Inc`, `Core/Src` | прикладной код STM32 и добавленные модули AD |
| `Drivers` | STM32G4 HAL/CMSIS |
| `MDK-ARM` | Keil-проект, scatter-файл, результаты сборки |
| `IHM08M.ioc` | CubeMX-конфигурация проекта |
| `AD_docs` | русская документация по запуску, распиновке, структурам и Simulink |

Главные модули:

- `ad_project.h/.c` - общий старт `AD_Project_Init()` и цикл `AD_Project_Loop()`;
- `ad_board.h/.c` - ADC, кнопка, board loop и удобные функции запуска тестов;
- `ad_inverter.h/.c` - управление TIM1, PWM-тесты каналов, начальное измерение `Rs/Ls/Ll`;
- `ad_parameter_identification.h/.c` - режимы, команды, safety limits, fault/status;
- `simulink_interface.h/.c` - структуры обмена и телеметрия;
- `ad_debug.h` - глобальная структура `g_ad_debug` для Keil Watch.

## Текущее состояние

Проект собирается в Keil без ошибок и предупреждений.

Распиновка IHM08M1 учтена:

- `PA0/PhA`, `PC1/PhB`, `PC0/PhC`, `PA1/BUSV` для ADC;
- `PA8/UH`, `PA7/UL`, `PA9/VH`, `PB0/VL`, `PA10/WH`, `PB1/WL` для TIM1 PWM;
- `PA6/BKIN` для аппаратной аварии;
- `PA5/LD2` по умолчанию не используется из-за конфликта с `PA5 - DAC`.

DC-звено пересчитывается с учётом реального измерения `10.0 В -> 0.618 В` на ADC и дополнительно усредняется.

## Безопасность

По умолчанию физические PWM-выходы запрещены:

```text
AD_PROJECT_POWER_TEST_ENABLE=0
```

Для стендового включения после проверки железа добавить в Keil `C/C++ -> Define`:

```text
AD_PROJECT_POWER_TEST_ENABLE=1
```

Этот макрос включает `AD_PARAM_ID_ENABLE_POWER_TESTS=1` и `AD_INVERTER_ENABLE_OUTPUTS=1`. При `Stop`, fault, блокировке или `enable=0` TIM1 гасится аппаратным hook `AD_ParamID_HardwareDisable()`.

## Быстрый запуск

Безопасное логирование:

```c
AD_Board_StartDataLogging();
AD_Board_StopParamTest();
```

PWM-тест одного канала:

```c
AD_Board_StartParamTestWithDuty(AD_PARAM_ID_MODE_PWM_TEST_UH, 0.08f);
AD_Board_StopParamTest();
```

Автоизмерение текущего уровня:

```c
AD_Board_StartParamTestWithDuty(AD_PARAM_ID_MODE_AUTO_IDENTIFICATION, 0.08f);
```

Результаты смотреть в `g_ad_debug.motor_parameters` и `g_ad_debug.motor_parameters.valid_mask`.

## Документация

- `AD_docs/BUILD_AND_RUN.md` - сборка, запуск и включение силовых тестов.
- `AD_docs/HOW_TO_START_TEST_AND_WATCH.md` - какие режимы запускать и что смотреть в Keil.
- `AD_docs/PINOUT_MEASUREMENTS_TEST_CONTROL.md` - распиновка, измеряемые параметры и команды.
- `AD_docs/DATA_STRUCTURES.md` - структуры данных и флаги.
- `AD_docs/MD_DRIVER_MAP.md` - карта слоя TIM1/inverter.
- `AD_docs/ADC_CURRENT_SENSORS.md` - где читаются токи и DC-звено.
- `AD_docs/PIN_USAGE_IHM08M1_COMPARE.md` - сверка пинов с IHM08M1.
- `AD_docs/MODBUS_REGISTERS.md` - карта Modbus RTU регистров для управления режимами и чтения статусов.
- `AD_docs/SIMULINK_MODEL_RUN_HELP.md` - где находится модель и как её открыть.

## Ограничение текущей идентификации

Автоидентификация последовательно измеряет `Rs_ohm`, `Ll_H`, `Rr_ohm`, `Lm_H` и пересчитывает `Ls_H/Lr_H`. Параметры `J_kg_m2` и `B_Nm_s` помечаются действительными только при наличии ненулевого сигнала `speed_rpm` во время разгона и выбега.
