Удален zero_cross по АЦП
This commit is contained in:
parent
ef58fe8b7b
commit
8bc67478c9
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user