Удален 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_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user