Добавлено пересечение нуля. Алг проверен в матлаб
+заготовки для статичтики АЦП и глобальной переменной микросекундых тиков
This commit is contained in:
parent
4491f11b3d
commit
8f4e8b627b
@ -52,7 +52,13 @@ __HAL_TIM_SET_AUTORELOAD(&adc_tim, ReadInputArray(1, 0));
|
|||||||
*/
|
*/
|
||||||
void app_writeOutputBuffer(real_T* Buffer) {
|
void app_writeOutputBuffer(real_T* Buffer) {
|
||||||
// USER APP OUTPUT START
|
// USER APP OUTPUT START
|
||||||
ThyristorWrite(Buffer);
|
//ThyristorWrite(Buffer);
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
WriteOutputArray(ZC_Detected[i], 0, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern ADC_Period_t adc;
|
extern ADC_Period_t adc;
|
||||||
for(int i = 0; i < 6; i++)
|
for(int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
Binary file not shown.
@ -57,7 +57,7 @@ extern "C" {
|
|||||||
void Error_Handler(void);
|
void Error_Handler(void);
|
||||||
|
|
||||||
/* USER CODE BEGIN EFP */
|
/* USER CODE BEGIN EFP */
|
||||||
|
extern __IO uint32_t micros;
|
||||||
/* USER CODE END EFP */
|
/* USER CODE END EFP */
|
||||||
|
|
||||||
/* Private defines -----------------------------------------------------------*/
|
/* Private defines -----------------------------------------------------------*/
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @file adc_tools.c
|
* @file adc_tools.c
|
||||||
* @brief Функции доступа к данным Modbus
|
* @brief Модуль считывающий данные с АЦП
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @details
|
* @details
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -17,8 +17,6 @@ static void ADC_EnableAllFilters(ADC_Period_t *adc)
|
|||||||
{
|
{
|
||||||
FILTER_GET_STATE(&adc->filter[i]) = FILTER_ENABLE;
|
FILTER_GET_STATE(&adc->filter[i]) = FILTER_ENABLE;
|
||||||
}
|
}
|
||||||
FILTER_GET_STATE(&adc->temp_filter[0]) = FILTER_ENABLE;
|
|
||||||
FILTER_GET_STATE(&adc->temp_filter[1]) = FILTER_ENABLE;
|
|
||||||
}
|
}
|
||||||
static void ADC_InitAllFilters(ADC_Period_t *adc, int coef)
|
static void ADC_InitAllFilters(ADC_Period_t *adc, int coef)
|
||||||
{
|
{
|
||||||
@ -113,7 +111,9 @@ HAL_StatusTypeDef ADC_Start(ADC_Period_t *adc, uint16_t Period)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
ADC_EnableAllFilters(adc);
|
//ADC_EnableAllFilters(adc);
|
||||||
|
FILTER_GET_STATE(&adc->temp_filter[0]) = FILTER_ENABLE;
|
||||||
|
FILTER_GET_STATE(&adc->temp_filter[1]) = FILTER_ENABLE;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -177,3 +177,53 @@ HAL_StatusTypeDef ADC_Handle(ADC_Period_t *adc)
|
|||||||
|
|
||||||
return HAL_OK;
|
return HAL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Сбор статистики.
|
||||||
|
*/
|
||||||
|
void ADC_UpdateStatistics(ADC_Period_t *adc, uint8_t channel, float value)
|
||||||
|
{
|
||||||
|
if(assert_adc(adc))
|
||||||
|
return;
|
||||||
|
if (channel >= ADC_NUMB_OF_REGULAR_CHANNELS) return;
|
||||||
|
|
||||||
|
ADC_Statistics *stat = &adc->Stat[channel];
|
||||||
|
|
||||||
|
// Первая инициализация
|
||||||
|
if (stat->SampleCount == 0) {
|
||||||
|
stat->Max = value;
|
||||||
|
stat->Min = value;
|
||||||
|
stat->Sum = 0;
|
||||||
|
stat->SumSquares = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обновление min/max
|
||||||
|
if (value > stat->Max) stat->Max = value;
|
||||||
|
if (value < stat->Min) stat->Min = value;
|
||||||
|
|
||||||
|
// Накопление для Avg/RMS
|
||||||
|
stat->Sum += value;
|
||||||
|
stat->SumSquares += value * value;
|
||||||
|
stat->SampleCount++;
|
||||||
|
|
||||||
|
// Расчет Avg/RMS (периодически или по запросу)
|
||||||
|
if (stat->SampleCount >= 1000) { // Пример: пересчет каждые 1000 samples
|
||||||
|
stat->Avg = stat->Sum / stat->SampleCount;
|
||||||
|
stat->RMS = sqrtf(stat->SumSquares / stat->SampleCount);
|
||||||
|
// Сброс накопителей
|
||||||
|
stat->Sum = 0;
|
||||||
|
stat->SumSquares = 0;
|
||||||
|
stat->SampleCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Сброс статистики.
|
||||||
|
*/
|
||||||
|
void ADC_ResetStatistics(ADC_Period_t *adc, uint8_t channel)
|
||||||
|
{
|
||||||
|
if (channel < ADC_NUMB_OF_REGULAR_CHANNELS) {
|
||||||
|
memset(&adc->Stat[channel], 0, sizeof(ADC_Statistics));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @file adc_tools.h
|
* @file adc_tools.h
|
||||||
* @brief Определения структур данных Modbus устройства
|
* @brief Модуль считывающий данные с АЦП
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @details
|
* @details
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -11,7 +11,8 @@
|
|||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
#define ADC_NUMB_OF_CHANNELS 6
|
#define ADC_NUMB_OF_CHANNELS 6
|
||||||
#define ADC_TEMP_CHANNELS_START 4
|
#define ADC_NUMB_OF_REGULAR_CHANNELS 4
|
||||||
|
#define ADC_TEMP_CHANNELS_START ADC_NUMB_OF_REGULAR_CHANNELS
|
||||||
|
|
||||||
#define ADC_TEMPERATURES_QUANTS \
|
#define ADC_TEMPERATURES_QUANTS \
|
||||||
{ 2188, 2197, 2206, 2216, 2226, 2236, 2247, 2259, 2271, 2283, \
|
{ 2188, 2197, 2206, 2216, 2226, 2236, 2247, 2259, 2271, 2283, \
|
||||||
@ -45,10 +46,25 @@ static const int32_t adc_temp_quants[] = ADC_TEMPERATURES_QUANTS;
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint16_t lZero; ///< Нулевой уровень (в квантах АЦП)
|
uint16_t lZero; ///< Нулевой уровень (в квантах АЦП)
|
||||||
float vMax; ///< Максимальный уровень Единиц Измерения (в Вольтах/Амперах/Градусах)
|
float vMax; ///< Максимальный уровень Единиц Измерения (в Вольтах/Амперах)
|
||||||
uint16_t lMax; ///< Максимальный уровень АЦП (в квантах АЦП)
|
uint16_t lMax; ///< Максимальный уровень АЦП (в квантах АЦП)
|
||||||
}ADC_Coefs_t;
|
}ADC_Coefs_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Статистика АЦП
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float Max; ///< Пиковое значение
|
||||||
|
float Min; ///< Минимальное значение
|
||||||
|
float Avg; ///< Среднее арифметическое значение
|
||||||
|
float RMS; ///< Действующее значение
|
||||||
|
|
||||||
|
uint32_t SampleCount; ///< Для корректного расчета Avg/RMS
|
||||||
|
float Sum; ///< Накопитель для среднего
|
||||||
|
float SumSquares; ///< Накопитель для RMS
|
||||||
|
}ADC_Statistics;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Хендл АЦП
|
* @brief Хендл АЦП
|
||||||
*/
|
*/
|
||||||
@ -59,18 +75,21 @@ typedef struct
|
|||||||
ADC_HandleTypeDef *hadc; ///< Хендл АЦП
|
ADC_HandleTypeDef *hadc; ///< Хендл АЦП
|
||||||
|
|
||||||
// Data and calculation
|
// Data and calculation
|
||||||
uint16_t RawData[ADC_NUMB_OF_CHANNELS]; ///< Сырые значения АЦП
|
uint16_t RawData[ADC_NUMB_OF_CHANNELS]; ///< Сырые значения АЦП
|
||||||
ADC_Coefs_t Coefs[ADC_NUMB_OF_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t
|
ADC_Coefs_t Coefs[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Коэффициенты @ref ADC_Coefs_t для регулярных каналов (не температуры)
|
||||||
float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах/Градусах)
|
FilterAverageInt_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП
|
||||||
|
FilterLUTInt_t temp_filter[2]; ///< Коррекция нелинейности датчиков температуры
|
||||||
|
|
||||||
|
float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах)
|
||||||
|
ADC_Statistics Stat[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Статистика для регулярных каналов (не температуры)
|
||||||
|
|
||||||
FilterAverageInt_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП
|
|
||||||
FilterLUTInt_t temp_filter[2]; ///< Коррекция нелинейности датчиков температуры
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned Initialized:1;
|
unsigned Initialized:1;
|
||||||
unsigned AdcRunning:1;
|
unsigned AdcRunning:1;
|
||||||
unsigned DataReady:1;
|
unsigned DataReady:1;
|
||||||
}f;
|
}f; ///< Флаги
|
||||||
|
uint32_t LastTick; // Время последнего преобразования
|
||||||
}ADC_Period_t;
|
}ADC_Period_t;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
333
UPP/Core/PowerMonitor/zero_cross.c
Normal file
333
UPP/Core/PowerMonitor/zero_cross.c
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file zero_cross.c
|
||||||
|
* @brief Модуль фиксирующий переход через ноль
|
||||||
|
******************************************************************************
|
||||||
|
* @details
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "zero_cross.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Инициализация детектора нуля с индивидуальными настройками.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param num_channels Количество каналов для этого хендла
|
||||||
|
* @param hysteresis Гистерезис для избежания дребезга
|
||||||
|
* @param debounce_samples Количество samples для антидребезга
|
||||||
|
* @return HAL Status.
|
||||||
|
*/
|
||||||
|
HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels,
|
||||||
|
float hysteresis, uint8_t debounce_samples)
|
||||||
|
{
|
||||||
|
if (zc == NULL || num_channels == 0 || num_channels > ZC_MAX_CHANNELS) {
|
||||||
|
return HAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Инициализация структуры
|
||||||
|
memset(zc, 0, sizeof(ZeroCross_Handle_t));
|
||||||
|
|
||||||
|
// Установка параметров хендла
|
||||||
|
zc->NumChannels = num_channels;
|
||||||
|
zc->Hysteresis = hysteresis;
|
||||||
|
zc->DebounceSamples = debounce_samples;
|
||||||
|
|
||||||
|
// Инициализация каналов
|
||||||
|
for (int i = 0; i < num_channels; i++) {
|
||||||
|
zc->Channel[i].CrossCount = 0;
|
||||||
|
zc->Channel[i].LastValue = 0.0f;
|
||||||
|
zc->Channel[i].CurrentValue = 0.0f;
|
||||||
|
zc->Channel[i].DebounceCounter = 0;
|
||||||
|
zc->Channel[i].StableState = 0;
|
||||||
|
zc->Channel[i].LastCrossTime = 0;
|
||||||
|
zc->Channel[i].Period = 0;
|
||||||
|
zc->Channel[i].Frequency = 0.0f;
|
||||||
|
zc->Channel[i].EdgeType = ZC_BOTH_EDGES;
|
||||||
|
}
|
||||||
|
|
||||||
|
zc->f.Initialized = 1;
|
||||||
|
zc->f.Monitoring = 1;
|
||||||
|
|
||||||
|
return HAL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Настройка канала детектора.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала для конфигурации
|
||||||
|
* @param edgeType Тип детектируемого перехода
|
||||||
|
* @return HAL Status.
|
||||||
|
*/
|
||||||
|
HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel,
|
||||||
|
ZC_EdgeType_t edgeType)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized) {
|
||||||
|
return HAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel >= zc->NumChannels) {
|
||||||
|
return HAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
zc->Channel[channel].EdgeType = edgeType;
|
||||||
|
|
||||||
|
// Сброс состояния канала при реконфигурации
|
||||||
|
zc->Channel[channel].LastValue = 0.0f;
|
||||||
|
zc->Channel[channel].DebounceCounter = 0;
|
||||||
|
zc->Channel[channel].StableState = 0;
|
||||||
|
zc->Channel[channel].LastCrossTime = 0;
|
||||||
|
zc->Channel[channel].Period = 0;
|
||||||
|
zc->Channel[channel].Frequency = 0.0f;
|
||||||
|
zc->Channel[channel].CrossCount = 0;
|
||||||
|
|
||||||
|
return HAL_OK;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Основная функция обработки значения канала.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала
|
||||||
|
* @param value Текущее значение сигнала
|
||||||
|
* @param timestamp Временная метка измерения в микросекундах
|
||||||
|
*/
|
||||||
|
void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uint32_t timestamp)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel >= zc->NumChannels) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZC_Channel_t *zc_ch = &zc->Channel[channel];
|
||||||
|
zc_ch->CurrentValue = value;
|
||||||
|
|
||||||
|
// Детектирование rising edge (отрицательное -> положительное)
|
||||||
|
if ((zc_ch->LastValue <= -zc->Hysteresis) &&
|
||||||
|
(value >= zc->Hysteresis)) {
|
||||||
|
|
||||||
|
if (zc_ch->EdgeType == ZC_RISING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) {
|
||||||
|
// Переход подтвержден сразу (без дебаунса)
|
||||||
|
if (zc_ch->LastCrossTime != 0) {
|
||||||
|
// Расчет периода и частоты
|
||||||
|
zc_ch->Period = timestamp - zc_ch->LastCrossTime;
|
||||||
|
if (zc_ch->Period > 0) {
|
||||||
|
zc_ch->Frequency = 1000000.0f / zc_ch->Period;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zc_ch->LastCrossTime = timestamp;
|
||||||
|
zc_ch->CrossCount++;
|
||||||
|
zc_ch->StableState = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Детектирование falling edge (положительное -> отрицательное)
|
||||||
|
else if ((zc_ch->LastValue >= zc->Hysteresis) &&
|
||||||
|
(value <= -zc->Hysteresis)) {
|
||||||
|
|
||||||
|
if (zc_ch->EdgeType == ZC_FALLING_EDGE || zc_ch->EdgeType == ZC_BOTH_EDGES) {
|
||||||
|
// Переход подтвержден сразу (без дебаунса)
|
||||||
|
if (zc_ch->LastCrossTime != 0) {
|
||||||
|
// Расчет периода и частоты
|
||||||
|
zc_ch->Period = timestamp - zc_ch->LastCrossTime;
|
||||||
|
if (zc_ch->Period > 0) {
|
||||||
|
zc_ch->Frequency = 1000000.0f / zc_ch->Period;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zc_ch->LastCrossTime = timestamp;
|
||||||
|
zc_ch->CrossCount++;
|
||||||
|
zc_ch->StableState = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сохраняем текущее значение для следующей итерации в случае если оно не в мертвой зоне
|
||||||
|
if((value > zc->Hysteresis) || (value < -zc->Hysteresis))
|
||||||
|
{
|
||||||
|
zc_ch->LastValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Пакетная обработка всех каналов.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param values Массив значений сигналов
|
||||||
|
* @param timestamp Временная метка измерения
|
||||||
|
*/
|
||||||
|
void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[], uint32_t timestamp)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized || !zc->f.Monitoring || values == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int ch = 0; ch < zc->NumChannels; ch++) {
|
||||||
|
ZC_ProcessChannel(zc, ch, values[ch], timestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Получение частоты сигнала.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала
|
||||||
|
* @return Частота в Гц.
|
||||||
|
*/
|
||||||
|
float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zc->Channel[channel].Frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Получение периода сигнала.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала
|
||||||
|
* @return Период в тактах таймера.
|
||||||
|
*/
|
||||||
|
uint32_t ZC_GetPeriod(ZeroCross_Handle_t *zc, uint8_t channel)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zc->Channel[channel].Period;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Получение счетчика переходов.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала
|
||||||
|
* @return Количество переходов.
|
||||||
|
*/
|
||||||
|
uint32_t ZC_GetCrossCount(ZeroCross_Handle_t *zc, uint8_t channel)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zc->Channel[channel].CrossCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Получение текущего состояния канала.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала
|
||||||
|
* @return Состояние (0 - отрицательное, 1 - положительное).
|
||||||
|
*/
|
||||||
|
uint8_t ZC_GetStableState(ZeroCross_Handle_t *zc, uint8_t channel)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zc->Channel[channel].StableState;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Получение текущего значения канала.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала
|
||||||
|
* @return Текущее значение сигнала.
|
||||||
|
*/
|
||||||
|
float ZC_GetCurrentValue(ZeroCross_Handle_t *zc, uint8_t channel)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized || channel >= zc->NumChannels) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zc->Channel[channel].CurrentValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Включение/выключение мониторинга.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param enable Флаг включения (1 - вкл, 0 - выкл)
|
||||||
|
*/
|
||||||
|
void ZC_EnableMonitoring(ZeroCross_Handle_t *zc, uint8_t enable)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
zc->f.Monitoring = enable ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Сброс статистики канала.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param channel Номер канала
|
||||||
|
*/
|
||||||
|
void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel < zc->NumChannels) {
|
||||||
|
zc->Channel[channel].LastValue = 0.0f;
|
||||||
|
zc->Channel[channel].CurrentValue = 0.0f;
|
||||||
|
zc->Channel[channel].DebounceCounter = 0;
|
||||||
|
zc->Channel[channel].StableState = 0;
|
||||||
|
zc->Channel[channel].LastCrossTime = 0;
|
||||||
|
zc->Channel[channel].Period = 0;
|
||||||
|
zc->Channel[channel].Frequency = 0.0f;
|
||||||
|
zc->Channel[channel].CrossCount = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Сброс всех каналов
|
||||||
|
for (int i = 0; i < zc->NumChannels; i++) {
|
||||||
|
zc->Channel[i].LastValue = 0.0f;
|
||||||
|
zc->Channel[i].CurrentValue = 0.0f;
|
||||||
|
zc->Channel[i].DebounceCounter = 0;
|
||||||
|
zc->Channel[i].StableState = 0;
|
||||||
|
zc->Channel[i].LastCrossTime = 0;
|
||||||
|
zc->Channel[i].Period = 0;
|
||||||
|
zc->Channel[i].Frequency = 0.0f;
|
||||||
|
zc->Channel[i].CrossCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Установка гистерезиса для хендла.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param hysteresis Значение гистерезиса
|
||||||
|
*/
|
||||||
|
void ZC_SetHysteresis(ZeroCross_Handle_t *zc, float hysteresis)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
zc->Hysteresis = hysteresis;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Установка дебаунс samples для хендла.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @param debounce_samples Количество samples для антидребезга
|
||||||
|
*/
|
||||||
|
void ZC_SetDebounceSamples(ZeroCross_Handle_t *zc, uint8_t debounce_samples)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
zc->DebounceSamples = debounce_samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Получение количества каналов хендла.
|
||||||
|
* @param zc Указатель на хендл детектора нуля
|
||||||
|
* @return Количество каналов.
|
||||||
|
*/
|
||||||
|
uint8_t ZC_GetNumChannels(ZeroCross_Handle_t *zc)
|
||||||
|
{
|
||||||
|
if (zc == NULL || !zc->f.Initialized) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return zc->NumChannels;
|
||||||
|
}
|
||||||
166
UPP/Core/PowerMonitor/zero_cross.h
Normal file
166
UPP/Core/PowerMonitor/zero_cross.h
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file zero_cross.h
|
||||||
|
* @brief Модуль фиксирующий переход через ноль
|
||||||
|
******************************************************************************
|
||||||
|
* @addtogroup ZERO_CROSS Zero-cross detection
|
||||||
|
* @brief Библиотека для детектирования переходов сигнала через ноль
|
||||||
|
* @details
|
||||||
|
Поддерживает:
|
||||||
|
- Многоканальное детектирование (несколько независимых сигналов)
|
||||||
|
- Детектирование фронтов: rising, falling, both
|
||||||
|
- Антидребезг с настраиваемым количеством samples
|
||||||
|
- Расчет частоты и периода сигнала
|
||||||
|
- Гистерезис для устойчивого детектирования
|
||||||
|
- Независимость от источника данных (ADC, DAC, другие)
|
||||||
|
- Индивидуальные настройки для каждого хендла
|
||||||
|
|
||||||
|
@par Пример использования:
|
||||||
|
@code
|
||||||
|
#include "zero_cross.h"
|
||||||
|
|
||||||
|
// Объявление структур
|
||||||
|
ZeroCross_Handle_t zc_handle;
|
||||||
|
float adc_values[2] = {0};
|
||||||
|
uint32_t timestamp = 0;
|
||||||
|
|
||||||
|
// Инициализация с индивидуальными настройками
|
||||||
|
ZC_Init(&zc_handle, 2, 0.1f, 3); // 2 канала, гистерезис 0.1, дебаунс 3 samples
|
||||||
|
|
||||||
|
// Настройка каналов
|
||||||
|
ZC_ConfigChannel(&zc_handle, 0, ZC_RISING_EDGE); // Канал 0 - только rising edge
|
||||||
|
ZC_ConfigChannel(&zc_handle, 1, ZC_BOTH_EDGES); // Канал 1 - оба фронта
|
||||||
|
|
||||||
|
// В основном цикле обработки ADC
|
||||||
|
while (1) {
|
||||||
|
// Получение данных от ADC (пример)
|
||||||
|
adc_values[0] = read_adc_channel(0); // Фаза A
|
||||||
|
adc_values[1] = read_adc_channel(1); // Фаза B
|
||||||
|
timestamp = HAL_GetTick() * 1000; // Текущее время в микросекундах
|
||||||
|
|
||||||
|
// Обработка всех каналов
|
||||||
|
ZC_ProcessAllChannels(&zc_handle, adc_values, timestamp);
|
||||||
|
|
||||||
|
// Получение результатов
|
||||||
|
float freq_a = ZC_GetFrequency(&zc_handle, 0);
|
||||||
|
float freq_b = ZC_GetFrequency(&zc_handle, 1);
|
||||||
|
uint32_t period_a = ZC_GetPeriod(&zc_handle, 0);
|
||||||
|
uint32_t cross_count_a = ZC_GetCrossCount(&zc_handle, 0);
|
||||||
|
|
||||||
|
// Использование в логике управления
|
||||||
|
if (freq_a > 55.0f || freq_a < 45.0f) {
|
||||||
|
// Авария по частоте
|
||||||
|
handle_frequency_fault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Пример создания нескольких хендлов с разными настройками
|
||||||
|
ZeroCross_Handle_t zc_high_sensitivity;
|
||||||
|
ZeroCross_Handle_t zc_low_sensitivity;
|
||||||
|
|
||||||
|
// Высокая чувствительность - малый гистерезис
|
||||||
|
ZC_Init(&zc_high_sensitivity, 2, 0.01f, 5); // 0.01 гистерезис, 5 samples дебаунс
|
||||||
|
|
||||||
|
// Низкая чувствительность - большой гистерезис для зашумленных сигналов
|
||||||
|
ZC_Init(&zc_low_sensitivity, 2, 0.5f, 2); // 0.5 гистерезис, 2 samples дебаунс
|
||||||
|
@endcode
|
||||||
|
* @{
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _ZERO_CROSS_H_
|
||||||
|
#define _ZERO_CROSS_H_
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
#ifndef ZC_MAX_CHANNELS
|
||||||
|
#define ZC_MAX_CHANNELS 8 ///< Максимальное количество каналов на хендл
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Тип перехода через ноль
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
ZC_BOTH_EDGES = 0, ///< Детектирование обоих переходов
|
||||||
|
ZC_RISING_EDGE, ///< Переход от отрицательного к положительному
|
||||||
|
ZC_FALLING_EDGE, ///< Переход от положительного к отрицательному
|
||||||
|
} ZC_EdgeType_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Структура канала детектора нуля
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t CrossCount; ///< Счетчик переходов
|
||||||
|
float LastValue; ///< Предыдущее значение
|
||||||
|
float CurrentValue; ///< Текущее значение
|
||||||
|
uint8_t DebounceCounter; ///< Счетчик антидребезга
|
||||||
|
uint8_t StableState; ///< Стабильное состояние (0=отриц, 1=полож)
|
||||||
|
uint32_t LastCrossTime; ///< Время последнего перехода
|
||||||
|
uint32_t Period; ///< Период сигнала (в тактах таймера)
|
||||||
|
float Frequency; ///< Частота
|
||||||
|
ZC_EdgeType_t EdgeType; ///< Тип детектируемого перехода
|
||||||
|
} ZC_Channel_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Хендл детектора нуля
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
ZC_Channel_t Channel[ZC_MAX_CHANNELS]; ///< Каналы @ref ZC_Channel_t
|
||||||
|
uint8_t NumChannels; ///< Количество используемых каналов для этого хендла
|
||||||
|
float Hysteresis; ///< Гистерезис для избежания дребезга
|
||||||
|
uint8_t DebounceSamples; ///< Количество samples для антидребезга
|
||||||
|
struct {
|
||||||
|
unsigned Initialized:1; ///< Флаг инициализации
|
||||||
|
unsigned Monitoring:1; ///< Флаг активности мониторинга
|
||||||
|
} f; ///< Флаги
|
||||||
|
} ZeroCross_Handle_t;
|
||||||
|
|
||||||
|
/* Инициализация детектора нуля с индивидуальными настройками */
|
||||||
|
HAL_StatusTypeDef ZC_Init(ZeroCross_Handle_t *zc, uint8_t num_channels,
|
||||||
|
float hysteresis, uint8_t debounce_samples);
|
||||||
|
|
||||||
|
/* Настройка канала детектора */
|
||||||
|
HAL_StatusTypeDef ZC_ConfigChannel(ZeroCross_Handle_t *zc, uint8_t channel,
|
||||||
|
ZC_EdgeType_t edgeType);
|
||||||
|
|
||||||
|
/* Обработка значения отдельного канала */
|
||||||
|
void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value,
|
||||||
|
uint32_t timestamp);
|
||||||
|
|
||||||
|
/* Пакетная обработка всех каналов */
|
||||||
|
void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float values[],
|
||||||
|
uint32_t timestamp);
|
||||||
|
|
||||||
|
/* Получение частоты сигнала */
|
||||||
|
float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel);
|
||||||
|
|
||||||
|
/* Получение периода сигнала */
|
||||||
|
uint32_t ZC_GetPeriod(ZeroCross_Handle_t *zc, uint8_t channel);
|
||||||
|
|
||||||
|
/* Получение счетчика переходов */
|
||||||
|
uint32_t ZC_GetCrossCount(ZeroCross_Handle_t *zc, uint8_t channel);
|
||||||
|
|
||||||
|
/* Получение текущего состояния канала */
|
||||||
|
uint8_t ZC_GetStableState(ZeroCross_Handle_t *zc, uint8_t channel);
|
||||||
|
|
||||||
|
/* Получение текущего значения канала */
|
||||||
|
float ZC_GetCurrentValue(ZeroCross_Handle_t *zc, uint8_t channel);
|
||||||
|
|
||||||
|
/* Включение/выключение мониторинга */
|
||||||
|
void ZC_EnableMonitoring(ZeroCross_Handle_t *zc, uint8_t enable);
|
||||||
|
|
||||||
|
/* Сброс статистики канала */
|
||||||
|
void ZC_Reset(ZeroCross_Handle_t *zc, uint8_t channel);
|
||||||
|
|
||||||
|
/* Установка гистерезиса для хендла */
|
||||||
|
void ZC_SetHysteresis(ZeroCross_Handle_t *zc, float hysteresis);
|
||||||
|
|
||||||
|
/* Установка дебаунс samples для хендла */
|
||||||
|
void ZC_SetDebounceSamples(ZeroCross_Handle_t *zc, uint8_t debounce_samples);
|
||||||
|
|
||||||
|
/* Получение количества каналов хендла */
|
||||||
|
uint8_t ZC_GetNumChannels(ZeroCross_Handle_t *zc);
|
||||||
|
|
||||||
|
#endif /* _ZERO_CROSS_H_ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN PTD */
|
/* USER CODE BEGIN PTD */
|
||||||
|
__IO uint32_t micros;
|
||||||
/* USER CODE END PTD */
|
/* USER CODE END PTD */
|
||||||
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
|||||||
@ -22,6 +22,7 @@
|
|||||||
#include "stm32f4xx_it.h"
|
#include "stm32f4xx_it.h"
|
||||||
/* Private includes ----------------------------------------------------------*/
|
/* Private includes ----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
|
#include "upp_main.h"
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@ -222,13 +223,11 @@ void TIM8_TRG_COM_TIM14_IRQHandler(void)
|
|||||||
void DMA2_Stream0_IRQHandler(void)
|
void DMA2_Stream0_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN DMA2_Stream0_IRQn 0 */
|
/* USER CODE BEGIN DMA2_Stream0_IRQn 0 */
|
||||||
#include "adc_tools.h"
|
|
||||||
extern ADC_Period_t adc;
|
|
||||||
ADC_Handle(&adc);
|
|
||||||
/* USER CODE END DMA2_Stream0_IRQn 0 */
|
/* USER CODE END DMA2_Stream0_IRQn 0 */
|
||||||
HAL_DMA_IRQHandler(&hdma_adc3);
|
HAL_DMA_IRQHandler(&hdma_adc3);
|
||||||
/* USER CODE BEGIN DMA2_Stream0_IRQn 1 */
|
/* USER CODE BEGIN DMA2_Stream0_IRQn 1 */
|
||||||
|
UPP_ADC_Handle();
|
||||||
/* USER CODE END DMA2_Stream0_IRQn 1 */
|
/* USER CODE END DMA2_Stream0_IRQn 1 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,10 @@
|
|||||||
#include "tim.h"
|
#include "tim.h"
|
||||||
|
|
||||||
#include "adc_tools.h"
|
#include "adc_tools.h"
|
||||||
|
#include "zero_cross.h"
|
||||||
ADC_Period_t adc;
|
ADC_Period_t adc;
|
||||||
|
ZeroCross_Handle_t hzc;
|
||||||
|
uint32_t ZC_Detected[ZC_MAX_CHANNELS] = {0};
|
||||||
#define ADC_CHANNEL_UBA 0
|
#define ADC_CHANNEL_UBA 0
|
||||||
#define ADC_CHANNEL_UAC 1
|
#define ADC_CHANNEL_UAC 1
|
||||||
#define ADC_CHANNEL_IC 2
|
#define ADC_CHANNEL_IC 2
|
||||||
@ -34,6 +37,10 @@ int UPP_Init(void)
|
|||||||
ADC_ConfigChannel(&adc, ADC_CHANNEL_TEMP1, 2554, 90, 4095);
|
ADC_ConfigChannel(&adc, ADC_CHANNEL_TEMP1, 2554, 90, 4095);
|
||||||
ADC_ConfigChannel(&adc, ADC_CHANNEL_TEMP2, 2554, 90, 4095);
|
ADC_ConfigChannel(&adc, ADC_CHANNEL_TEMP2, 2554, 90, 4095);
|
||||||
|
|
||||||
|
ZC_Init(&hzc, ZC_MAX_CHANNELS, 10, 3);
|
||||||
|
ZC_ConfigChannel(&hzc, 0, ZC_BOTH_EDGES);
|
||||||
|
ZC_ConfigChannel(&hzc, 1, ZC_BOTH_EDGES);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,3 +63,18 @@ int UPP_While(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UPP_ADC_Handle(void)
|
||||||
|
{
|
||||||
|
static uint32_t last_zc_cnt[ZC_MAX_CHANNELS] = {0};
|
||||||
|
ADC_Handle(&adc);
|
||||||
|
ZC_ProcessAllChannels(&hzc, adc.Data, uwTick);
|
||||||
|
for(int i = 0; i < ZC_MAX_CHANNELS; i++)
|
||||||
|
{
|
||||||
|
if(last_zc_cnt[i] != ZC_GetCrossCount(&hzc, i))
|
||||||
|
{
|
||||||
|
last_zc_cnt[i] = ZC_GetCrossCount(&hzc, i);
|
||||||
|
ZC_Detected[i] = !ZC_Detected[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -18,4 +18,6 @@ int UPP_PreWhile(void);
|
|||||||
/* Основной цикл УПП. */
|
/* Основной цикл УПП. */
|
||||||
int UPP_While(void);
|
int UPP_While(void);
|
||||||
|
|
||||||
|
void UPP_ADC_Handle(void);
|
||||||
|
extern uint32_t ZC_Detected[];
|
||||||
#endif //_UPP_MAIN_H
|
#endif //_UPP_MAIN_H
|
||||||
@ -359,6 +359,30 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<bShared>0</bShared>
|
<bShared>0</bShared>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>3</GroupNumber>
|
||||||
|
<FileNumber>14</FileNumber>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\Core\PowerMonitor\zero_cross.c</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>zero_cross.c</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<GroupNumber>3</GroupNumber>
|
||||||
|
<FileNumber>15</FileNumber>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<tvExp>0</tvExp>
|
||||||
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
<bDave2>0</bDave2>
|
||||||
|
<PathWithFileName>..\Core\PowerMonitor\zero_cross.h</PathWithFileName>
|
||||||
|
<FilenameWithoutPath>zero_cross.h</FilenameWithoutPath>
|
||||||
|
<RteFlg>0</RteFlg>
|
||||||
|
<bShared>0</bShared>
|
||||||
|
</File>
|
||||||
</Group>
|
</Group>
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
@ -377,7 +401,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>14</FileNumber>
|
<FileNumber>16</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -389,7 +413,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>15</FileNumber>
|
<FileNumber>17</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -401,7 +425,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>16</FileNumber>
|
<FileNumber>18</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -413,7 +437,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>17</FileNumber>
|
<FileNumber>19</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -425,7 +449,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>18</FileNumber>
|
<FileNumber>20</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -437,7 +461,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>19</FileNumber>
|
<FileNumber>21</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -449,7 +473,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>20</FileNumber>
|
<FileNumber>22</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -461,7 +485,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>21</FileNumber>
|
<FileNumber>23</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -473,7 +497,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>22</FileNumber>
|
<FileNumber>24</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -485,7 +509,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>23</FileNumber>
|
<FileNumber>25</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -497,7 +521,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>24</FileNumber>
|
<FileNumber>26</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -509,7 +533,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>25</FileNumber>
|
<FileNumber>27</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -521,7 +545,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>5</GroupNumber>
|
<GroupNumber>5</GroupNumber>
|
||||||
<FileNumber>26</FileNumber>
|
<FileNumber>28</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -541,7 +565,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>27</FileNumber>
|
<FileNumber>29</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -553,7 +577,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>28</FileNumber>
|
<FileNumber>30</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -565,7 +589,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>29</FileNumber>
|
<FileNumber>31</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -577,7 +601,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>30</FileNumber>
|
<FileNumber>32</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -589,7 +613,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>31</FileNumber>
|
<FileNumber>33</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -601,7 +625,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>32</FileNumber>
|
<FileNumber>34</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -613,7 +637,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>33</FileNumber>
|
<FileNumber>35</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -625,7 +649,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>6</GroupNumber>
|
<GroupNumber>6</GroupNumber>
|
||||||
<FileNumber>34</FileNumber>
|
<FileNumber>36</FileNumber>
|
||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -645,7 +669,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>35</FileNumber>
|
<FileNumber>37</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -657,7 +681,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>36</FileNumber>
|
<FileNumber>38</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -669,7 +693,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>37</FileNumber>
|
<FileNumber>39</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -681,7 +705,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>38</FileNumber>
|
<FileNumber>40</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -693,7 +717,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>39</FileNumber>
|
<FileNumber>41</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -705,7 +729,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>40</FileNumber>
|
<FileNumber>42</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -717,7 +741,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>41</FileNumber>
|
<FileNumber>43</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -729,7 +753,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>42</FileNumber>
|
<FileNumber>44</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -741,7 +765,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>43</FileNumber>
|
<FileNumber>45</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -753,7 +777,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>44</FileNumber>
|
<FileNumber>46</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -765,7 +789,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>45</FileNumber>
|
<FileNumber>47</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -777,7 +801,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>7</GroupNumber>
|
<GroupNumber>7</GroupNumber>
|
||||||
<FileNumber>46</FileNumber>
|
<FileNumber>48</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -797,7 +821,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>47</FileNumber>
|
<FileNumber>49</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -809,7 +833,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>8</GroupNumber>
|
<GroupNumber>8</GroupNumber>
|
||||||
<FileNumber>48</FileNumber>
|
<FileNumber>50</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -829,7 +853,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>49</FileNumber>
|
<FileNumber>51</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -841,7 +865,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>50</FileNumber>
|
<FileNumber>52</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -853,7 +877,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>51</FileNumber>
|
<FileNumber>53</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -865,7 +889,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>52</FileNumber>
|
<FileNumber>54</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -877,7 +901,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>9</GroupNumber>
|
<GroupNumber>9</GroupNumber>
|
||||||
<FileNumber>53</FileNumber>
|
<FileNumber>55</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -897,7 +921,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>54</FileNumber>
|
<FileNumber>56</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -909,7 +933,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>55</FileNumber>
|
<FileNumber>57</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -921,7 +945,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>56</FileNumber>
|
<FileNumber>58</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -933,7 +957,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>57</FileNumber>
|
<FileNumber>59</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -945,7 +969,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>58</FileNumber>
|
<FileNumber>60</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -957,7 +981,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>59</FileNumber>
|
<FileNumber>61</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -969,7 +993,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>60</FileNumber>
|
<FileNumber>62</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -981,7 +1005,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>61</FileNumber>
|
<FileNumber>63</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -993,7 +1017,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>62</FileNumber>
|
<FileNumber>64</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1005,7 +1029,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>63</FileNumber>
|
<FileNumber>65</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1017,7 +1041,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>64</FileNumber>
|
<FileNumber>66</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1029,7 +1053,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>65</FileNumber>
|
<FileNumber>67</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1041,7 +1065,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>66</FileNumber>
|
<FileNumber>68</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1053,7 +1077,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>67</FileNumber>
|
<FileNumber>69</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1065,7 +1089,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>68</FileNumber>
|
<FileNumber>70</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1077,7 +1101,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>69</FileNumber>
|
<FileNumber>71</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1089,7 +1113,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>70</FileNumber>
|
<FileNumber>72</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1101,7 +1125,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>71</FileNumber>
|
<FileNumber>73</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1113,7 +1137,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>72</FileNumber>
|
<FileNumber>74</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1125,7 +1149,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>73</FileNumber>
|
<FileNumber>75</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1137,7 +1161,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>74</FileNumber>
|
<FileNumber>76</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1149,7 +1173,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>75</FileNumber>
|
<FileNumber>77</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1161,7 +1185,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>76</FileNumber>
|
<FileNumber>78</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1173,7 +1197,7 @@
|
|||||||
</File>
|
</File>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>10</GroupNumber>
|
<GroupNumber>10</GroupNumber>
|
||||||
<FileNumber>77</FileNumber>
|
<FileNumber>79</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1193,7 +1217,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>11</GroupNumber>
|
<GroupNumber>11</GroupNumber>
|
||||||
<FileNumber>78</FileNumber>
|
<FileNumber>80</FileNumber>
|
||||||
<FileType>1</FileType>
|
<FileType>1</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
@ -1213,7 +1237,7 @@
|
|||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
<File>
|
<File>
|
||||||
<GroupNumber>12</GroupNumber>
|
<GroupNumber>12</GroupNumber>
|
||||||
<FileNumber>79</FileNumber>
|
<FileNumber>81</FileNumber>
|
||||||
<FileType>2</FileType>
|
<FileType>2</FileType>
|
||||||
<tvExp>0</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
|
|||||||
@ -460,6 +460,16 @@
|
|||||||
<FileType>5</FileType>
|
<FileType>5</FileType>
|
||||||
<FilePath>..\Core\PowerMonitor\adc_tools.h</FilePath>
|
<FilePath>..\Core\PowerMonitor\adc_tools.h</FilePath>
|
||||||
</File>
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>zero_cross.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>..\Core\PowerMonitor\zero_cross.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>zero_cross.h</FileName>
|
||||||
|
<FileType>5</FileType>
|
||||||
|
<FilePath>..\Core\PowerMonitor\zero_cross.h</FilePath>
|
||||||
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
<Group>
|
<Group>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user