Files
DS18B20_Library/README.md
2025-03-03 18:49:43 +03:00

139 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PY32F002B ScanDallas+Modbus Module
Прога для PY32F002B которая будет считывать датчики температуры, сохранять в модбас регистры.
Конверсия идет непрерывно и после каждой конверсии считываются все датчики и записываются в модбас регистры.
## Управление модулем
**Температура:** Для считывания температуры необходимо считать холдинг регистры №0-29.
**Параметры датчика:** Для считывания параметров конкретного датчика надо выставить регистр Location (№0) датчика или его ROM, и после выставить коил ReadSensor (№1). После считать параметры полученные параметры в инпут регистрах №30-36
**Инициализация датчика:** Для инициализации датчика надо выставить регистр Location (№0), где находится датчик и его ROM, и после выставить коил InitSensor (№2). После в UserByte выбранного по ROM датчика записывается его локация.
**Деинициализация датчика:** Для деинициализации датчика надо выставить регистр Location (№0), где находится датчик, и после выставить коил DenitSensor (№3). После в UserByte выбранного по ROM датчика записывается его локация. И
## Структура данных
Управлять работой модуля можно по коилам и регистрам
- 0: `RunConvertions` - запуск преобразований датчика
- 1: `ReadSensor` - считать параметры датчика по холдинг регистрам
- 2: `InitSensor` - инициализация датчика по холдинг регистрам
- 3: `DenitSensor` - деинициализировать датчик по холдинг регистрам
Холдинг регистры используются для передачи параметров датчика и для инициализации/деинициализации.
- 0: `Location` - локация датчика
- 1-4: `ROM` - ROM датчика
- 5: `Resolution` - разрешение датчика
- 6: `Enable` - считывать напряжение с этого датчика или нет
Инпут регистры используются для передачи температуры и параметров датчика
Температура храниться в первых 30 инпут регистрах
- 0-29: `SensTemperature` - температура n-го датчика в [***Цельсий x 100***]
Параметры храняться в рестрах N+1. Хранятся параметры последнего датчика к которому было совершнео обращение (коилы №1-3)
- 30: `Location` - локация датчика, к которому было совершено обращение
- 31-34: `ROM` - ROM датчика, к которому было совершено обращение
- 35: `Resolution` - разрешение датчика, к которому было совершено обращение
- 36: `Enable` - включен датчик или нет
## Флаги модуля
- 16: `ConvertionDone` - флаг окончания конверсии. Сбрасывается после считывания температуры из регистров
- 17: `LostedSensors` - флаг есть ли потерянные сенсоры. Сбрасывается по модбас
## Настройка датчиков
Тайминги выставляются в holding регистрах №0-4:
- 0: `TimeForForward` - время на которое диод включается в прямом направлении (мс или мкс)
- 1: `TimeForReverse` - время на которое диод включается в обратном направлении (мс или мкс)
- 2: `TimeBeforeTest` - время которое выжидается перед началом тестирования (мс или мкс)
- 3: `TimeDeadtime` - время между переключениями фаз (мс или мкс)
- 4: `TimeBeforePeak` - время между включением АЦП и подключением обратного напряжения (мс или мкс)
В коилах №16-19, можно выставить флаги - включить миллисекундную задержку вместо микросекундной для соответствующего тайминга:
- 16: `msTimeForForward_enable`
- 17: `msTimeForReverse_enable`
- 18: `msTimeBeforeTest_enable`
- 19: `msTimeDeadtime_enable`
- 20: `msTimeBeforePeak_enable`
## Настройка АЦП
Настройки АЦП выставляются в holding регистрах №5-9:
- 5: `Adc_PulseWidth` - ожидаемая длительность импульса в отчетах ацп.
На основе этого параметра берется выборка по которой расчитывается среднее значение пик (пик +-Adc_PulseWidth/2)
- 6: `Adc_PulseSign` - полярность скачка напряжения при обратном включении
- 7: `Adc_CalibrValue` - калибровочное значение ацп
- 8: `Adc_ZeroValue` - нулевое значение ацп
- 9: `Adc_U_Calibr` - калибровочное напряжение ацп
Из этого рассчитывается шаг АЦП: `Adc_U_Calibr/(Adc_CalibrValue - Adc_ZeroValue)`
# Тестирование
## Тест в прямом подключении (`TESTER_TestDiode_Forward`)
- ожидается задержка, перед началом работы `ticks_before_test`
- включается АЦП в континуес режиме
- диод подключается в прямом направлении на заданное время `ticks_for_forward`.
- считывается АЦП и накапливаются заданное количество для расчета среднего. и так по кругу пока диод подключен
- после таймаута отключается напряжение и останавливается АЦП
По итогу сохраняется напряжение прямого включения диода `htest->DiodeForwardVolt`.
## Тест в обратном подключении (`TESTER_TestDiode_Reverse`)
- ожидается задержка, перед началом работы `ticks_before_test`
- включается АЦП в дма режиме
- ожидается задержка, перед предполагаемым скачком `ticks_before_peak`
- диод подключается в обратном направлении на заданное время `ticks_for_reverse`, и отключается
- после дожидается окончание заполнения буфера ДМА и обрабатывается: находится минимальный/максимальный пик и среднее напряжение в том районе
По итогу сохраняется скачок напряжение при обратном включении диода `htest->DiodeReversePeakVolt`.
## Тест перехода из прямого подключении в обратное (`TESTER_TestDiode_SwitchConnection`)
- ожидается задержка, перед началом работы `ticks_before_test`
- диод подключается в прямом направлении на заданное время `ticks_for_forward`
- после истечения задержки сохраняется прямое напражение на диоде
- диод отключается от питания и выжидается мертвое время `ticks_deadtime`
- включается АЦП в дма режиме
- ожидается задержка, перед предполагаемым скачком `ticks_before_peak`
- диод подключается в обратном направлении на заданное время `ticks_for_reverse`
- дожидается окончание заполнения буфера ДМА и обрабатывается: находится минимальный/максимальный пик и среднее напряжение в том районе
По итогу сохраняется напряжение прямого включения диода `htest->DiodeForwardVolt` и скачок при обратном `htest->DiodeReversePeakVolt`.
# Внутренняя настройка
В начале программы в регистрах модбас выставляются дефолтные настройки из tester_config.h (`TESTER_Set_Default_Settings`)
После эти настройки подтягиваются в структуры тестера, через отдельную функцию (`TESTER_UpdateSettings`). Она вызывается перед каждым тестом.
## tester_config.h
Содержит дефолтные настройки для таймингов (`TESTER_SW_TIMINGS_CONFIG`):
- количество тиков и дефайн для включения миллисекундной разных задержек.
для светодиода и кнопки (`TESTER_INTERFACE_CONFIG`):
- состояния пина для включения и выключения светодиода
- порт и пин светодиода
- частоты моргания для разных режимов работы
- состояния пина при нажатой и отжатой кнопки
- порт и пин кнопки
- задержка для выжидания дребезга
для управления ключами (`TESTER_PHASE_SW_CONFIG`):
- `USE_HAL_GPIO_FUNCTIONS` - использовать HAL_GPIO-функции. Без неё переключается быстрее
- `RECONNECT_WITHOUT_DEADTIME` - отключить дедтайм при переключении. Если отключить еще и USE_HAL_GPIO_FUNCTIONS, то переключатся фазы будут почти синхронно (быстрее десятков мкс). Хз надо ли такое, но возможность есть
- порт и пины для двух ключей обратного подключения диода (порт общий для двух ключей)
- порт и пины для двух ключей обратного подключения диода (порт общий для двух ключей)
для АЦП (`TESTER_ADC_CONFIG`):
- размер dma буффера (`ADC_BUFF_SIZE, ADC_DMA_BUFF_SIZE`)
- калибровочное напряжение АЦП (`ADC_U_CALIBR`)
- значение АЦП при калибровочном напряжении (`ADC_VALUE_CALIBR`)
- значение АЦП при нулевом напряжении (`ADC_VALUE_ZERO`)
- таймаут на чтение АЦП (`ADC_READ_TIMEOUT_MS`)
- ожидаемая длина импульса в отсчетах АЦП (`TESTER_ADC_PULES_EXPETCED_WIDTH`)
Из этого рассчитывается шаг АЦП: `Adc_U_Calibr/(Adc_CalibrValue - Adc_ZeroValue)`
## Структуры для настроек
Настройки для таймингов записываются в структуру `SwTimings`, которая находится в `htest`/`hTestDiode (глобально)`, а она уже в главной структуре проекта `TESTER`.
Настройки светодиода и кнопки записываются в структуры `leds.LED1` и `SwStart`. Они находятся в структуре проекта `TESTER`
Настройки для портов и пинов ключей записываются в структуры `SwPhaseForward` и `SwPhaseReverse`, которые находится в `htest`/`hTestDiode (глобально)`, а она уже в главной структуре проекта `TESTER`.
Настройки для АЦП записыватся в структуру `TESTER.htest->adc->chAdc.s` (`ADC_ParamsTypeDef`).