Добавлено пересечение нуля. Алг проверен в матлаб

+заготовки для статичтики АЦП и глобальной переменной микросекундых тиков
This commit is contained in:
Razvalyaev 2025-11-11 00:36:15 +03:00
parent 4491f11b3d
commit 8f4e8b627b
13 changed files with 718 additions and 87 deletions

View File

@ -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.

View File

@ -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 -----------------------------------------------------------*/

View File

@ -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));
}
}

View File

@ -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 Хендл АЦП
*/ */
@ -60,17 +76,20 @@ typedef struct
// 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]; ///< Фильтр от шумов АЦП FilterAverageInt_t filter[ADC_NUMB_OF_CHANNELS]; ///< Фильтр от шумов АЦП
FilterLUTInt_t temp_filter[2]; ///< Коррекция нелинейности датчиков температуры FilterLUTInt_t temp_filter[2]; ///< Коррекция нелинейности датчиков температуры
float Data[ADC_NUMB_OF_CHANNELS]; ///< Пересчитанные значения АЦП (в Вольтах/Амперах)
ADC_Statistics Stat[ADC_NUMB_OF_REGULAR_CHANNELS]; ///< Статистика для регулярных каналов (не температуры)
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;

View 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;
}

View 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_ */
/**
* @}
*/

View File

@ -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 ------------------------------------------------------------*/

View File

@ -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 */
} }

View File

@ -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];
}
}
}

View File

@ -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

View File

@ -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>

View File

@ -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>