Удален zero_cross по АЦП

This commit is contained in:
Razvalyaev 2025-05-25 16:48:19 +03:00
parent ef58fe8b7b
commit 8bc67478c9
4 changed files with 31 additions and 90 deletions

View File

@ -405,13 +405,6 @@ void upp_init(void)
tiristor_angle_reset(&phase_A.ctrl);
tiristor_angle_reset(&phase_B.ctrl);
tiristor_angle_reset(&phase_C.ctrl);
#ifndef HARDWARE_ZERO_CROSS_DETECT
adc_Attach(&phase_A.zc_detector.AdcFilter, &hadc);
zero_cross_Init(&phase_A.zc_detector, ADC_INITIAL_ZERO_LEVEL);
adc_Attach(&phase_A.zc_detector.AdcFilter, &hadc);
zero_cross_Init(&phase_A.zc_detector, ADC_INITIAL_ZERO_LEVEL);
#endif
//Upp.GoSafe = 1;
}

View File

@ -1,6 +1,5 @@
#include "zero_cross.h"
ADCFilter_t AdcFilter;
/**
* @brief Инициализация структуры детектора перехода через ноль
@ -9,56 +8,19 @@ ADCFilter_t AdcFilter;
*/
void zero_cross_Init(ZeroCrossDetector_t *zc, uint16_t zeroLevel)
{
// Обнуляем последнее измеренное значение сдвига относительно нуля
zc->lastSample = 0;
// Сбрасываем флаг обнаружения перехода через ноль
zc->f.ZeroCrossDetected = 0;
// Запоминаем уровень, соответствующий нулю (обычно mid-scale АЦП)
zc->zeroLevel = zeroLevel;
}
/**
* @brief Обновление флага перехода через ноль
* @param zc Указатель на структуру ZeroCrossDetector_t
* @details Если аппаратный детектор включен, просто переносим флаг EXTI.
* Иначе анализируем разницу между текущим и предыдущим значением АЦП,
* чтобы определить, произошёл ли переход через ноль.
* @details Просто переносим флаг EXTI с аппаратного детектора.
*/
void zero_cross_update(ZeroCrossDetector_t *zc)
{
#ifdef HARDWARE_ZERO_CROSS_DETECT
// Используем флаг аппаратного прерывания EXTI для установки флага перехода через ноль
zc->f.ZeroCrossDetected = zc->f.EXTIZeroCrossDetected;
#else
uint16_t adcValue;
// Проверяем, обновились ли данные АЦП (фильтр)
if(adc_is_data_updated(&zc->AdcFilter))
{
adcValue = adc_read_data(&zc->AdcFilter);
}
else
{
// Нет новых данных — выход из функции
return;
}
// Вычисляем смещение текущей выборки относительно нуля
zc->currSample = (int16_t)adcValue - (int16_t)zc->zeroLevel;
// Проверяем, произошёл ли переход через ноль между предыдущей и текущей выборками
if ((zc->lastSample < 0 && zc->currSample >= 0) ||
(zc->lastSample > 0 && zc->currSample <= 0))
{
// Устанавливаем флаг обнаружения перехода через ноль
zc->f.ZeroCrossDetected = 1;
}
// Сохраняем текущее значение для следующего сравнения
zc->lastSample = zc->currSample;
#endif
}
/**
@ -80,7 +42,6 @@ int is_zero_cross(ZeroCrossDetector_t *zc)
return 0;
}
#ifdef HARDWARE_ZERO_CROSS_DETECT
/**
* @brief Обработчик прерывания EXTI для аппаратного детектора перехода через ноль
* @param zc Указатель на структуру ZeroCrossDetector_t
@ -90,4 +51,3 @@ void zero_cross_update_EXTI(ZeroCrossDetector_t *zc)
{
zc->f.EXTIZeroCrossDetected = 1;
}
#endif

View File

@ -4,19 +4,13 @@
#include "main.h"
#include "adc_filter.h"
#define hadc hadc1
#define HARDWARE_ZERO_CROSS_DETECT // аппаратный детект zero cross (альтернатива — считывание через АЦП)
/**
* @brief Флаги состояния детектора нуля
*/
typedef struct
{
unsigned WaitForZeroCrossDetected : 1; /**< Ожидание обнаружения перехода через ноль */
#ifdef HARDWARE_ZERO_CROSS_DETECT
unsigned WaitForZeroCrossDetected : 1; /**< Ожидание обнаружения перехода через ноль */
unsigned EXTIZeroCrossDetected : 1; /**< Флаг обнаружения нуля аппаратным прерыванием EXTI */
#endif
unsigned ZeroCrossDetected : 1; /**< Флаг обнаружения перехода через ноль */
} ZeroCrossFlags;
@ -26,21 +20,15 @@ typedef struct
typedef struct
{
ZeroCrossFlags f; /**< Флаги состояния детектора */
int currSample; /**< Текущее значение выборки */
int16_t lastSample; /**< Предыдущее значение выборки (относительно нуля) */
uint16_t zeroLevel; /**< Уровень, соответствующий "нулю", обычно mid-scale АЦП */
ADCFilter_t AdcFilter; /**< Фильтр АЦП для сглаживания входных данных */
} ZeroCrossDetector_t;
/** Инициализация структуры детектора перехода через ноль */
void zero_cross_Init(ZeroCrossDetector_t *zc, uint16_t zeroLevel);
/** Обновление состояния детектора перехода через ноль (через АЦП или аппаратный метод) */
/** Обновление состояния детектора перехода через ноль */
void zero_cross_update(ZeroCrossDetector_t *zc);
/** Проверка, был ли обнаружен переход через ноль */
int is_zero_cross(ZeroCrossDetector_t *zc);
#ifdef HARDWARE_ZERO_CROSS_DETECT
/** Обновление состояния детектора перехода через ноль при аппаратном прерывании EXTI*/
/** Обновление состояния детектора перехода через ноль при аппаратном прерывании EXTI */
void zero_cross_update_EXTI(ZeroCrossDetector_t *zc);
#endif
#endif //__ZERO_CROSS_H

File diff suppressed because one or more lines are too long