Удален 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_A.ctrl);
tiristor_angle_reset(&phase_B.ctrl); tiristor_angle_reset(&phase_B.ctrl);
tiristor_angle_reset(&phase_C.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; //Upp.GoSafe = 1;
} }

View File

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

View File

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

File diff suppressed because one or more lines are too long