запущен бета упп на stm32f103 в матлаб
This commit is contained in:
@@ -4,7 +4,7 @@ void adc_Attach(ADCFilter_t *hfilter, ADC_HandleTypeDef *hadc)
|
||||
{
|
||||
hfilter->hadc = hadc;
|
||||
}
|
||||
|
||||
// фильтрация
|
||||
int adc_filterring(ADCFilter_t *hfilter)
|
||||
{
|
||||
hfilter->sum += hfilter->hadc->Instance->DR;
|
||||
|
||||
@@ -8,11 +8,12 @@ typedef struct
|
||||
unsigned DataUpdated:1;
|
||||
}AdcFilterFlags;
|
||||
|
||||
// структура для ацп
|
||||
typedef struct
|
||||
{
|
||||
AdcFilterFlags f;
|
||||
uint16_t AdcResult;
|
||||
ADC_HandleTypeDef *hadc;
|
||||
ADC_HandleTypeDef *hadc;
|
||||
uint32_t sum;
|
||||
uint16_t count;
|
||||
uint16_t bufferSize;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "upp.h"
|
||||
#include "tiristor.h"
|
||||
|
||||
// управление тиристором
|
||||
void tiristor_control(TiristorControl_t *ctrl)
|
||||
{
|
||||
if(ctrl->f.EnableTiristor)
|
||||
@@ -45,24 +45,35 @@ void tiristor_angle_update(TiristorAngleControl_t *angle)
|
||||
|
||||
void tiristor_angle_control(TiristorControl_t *ctrl)
|
||||
{
|
||||
if((uint16_t)TIMER->CNT - ctrl->angle.start_delay_us > ctrl->angle.delay_us)
|
||||
ctrl->f.EnableTiristor = 1;
|
||||
tiristor_angle_update(&ctrl->angle);
|
||||
|
||||
if ((uint16_t)((uint16_t)TIMER->CNT - ctrl->angle.start_delay_us) > ctrl->angle.delay_us)
|
||||
{
|
||||
if(ctrl->f.TiristorDone == 0)
|
||||
{
|
||||
ctrl->f.EnableTiristor = 1;
|
||||
ctrl->f.TiristorDone = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tiristor_start_angle_delay(TiristorControl_t *ctrl)
|
||||
{
|
||||
ctrl->f.TiristorDone = 0;
|
||||
ctrl->angle.start_delay_us = TIMER->CNT;
|
||||
}
|
||||
|
||||
void tiristor_enable(TiristorControl_t *ctrl)
|
||||
{
|
||||
HAL_GPIO_WritePin(ctrl->gpiox, ctrl->gpio_pin, GPIO_TIRISTOR_OPEN);
|
||||
//HAL_GPIO_WritePin(ctrl->gpiox, ctrl->gpio_pin, GPIO_TIRISTOR_OPEN);
|
||||
ctrl->gpiox->ODR |= ctrl->gpio_pin;
|
||||
ctrl->f.TiristorIsEnable = 1;
|
||||
}
|
||||
|
||||
void tiristor_disable(TiristorControl_t *ctrl)
|
||||
{
|
||||
HAL_GPIO_WritePin(ctrl->gpiox, ctrl->gpio_pin, GPIO_TIRISTOR_CLOSE);
|
||||
ctrl->gpiox->ODR &= ~ctrl->gpio_pin;
|
||||
//HAL_GPIO_WritePin(ctrl->gpiox, ctrl->gpio_pin, GPIO_TIRISTOR_CLOSE);
|
||||
ctrl->f.TiristorIsEnable = 0;
|
||||
}
|
||||
|
||||
@@ -70,5 +81,11 @@ void tiristor_init(TiristorControl_t *ctrl, GPIO_TypeDef *gpiox, uint32_t gpio_p
|
||||
{
|
||||
ctrl->gpiox = gpiox;
|
||||
ctrl->gpio_pin = gpio_pin;
|
||||
ctrl->start_delay = tiristor_start_angle_delay;
|
||||
ctrl->angle.delay_max_us = 8000;
|
||||
ctrl->angle.delay_min_us = 100;
|
||||
ctrl->angle.delay_us = 7000;
|
||||
ctrl->angle.delay_step_us = 500;
|
||||
ctrl->angle.sample_time_ms = 100;
|
||||
ctrl->open_time = 1;
|
||||
TIMER->CR1 |= TIM_CR1_CEN;
|
||||
}
|
||||
@@ -15,6 +15,7 @@ typedef struct
|
||||
{
|
||||
unsigned EnableTiristor:1;
|
||||
unsigned TiristorIsEnable:1;
|
||||
unsigned TiristorDone:1;
|
||||
}TiristorControlFlags;
|
||||
|
||||
|
||||
@@ -46,6 +47,7 @@ struct TiristorControl_t
|
||||
void tiristor_control(TiristorControl_t *ctrl);
|
||||
void tiristor_angle_update(TiristorAngleControl_t *angle);
|
||||
void tiristor_angle_control(TiristorControl_t *ctrl);
|
||||
void tiristor_start_angle_delay(TiristorControl_t* ctrl);
|
||||
void tiristor_enable(TiristorControl_t *ctrl);
|
||||
void tiristor_disable(TiristorControl_t *ctrl);
|
||||
void tiristor_init(TiristorControl_t *ctrl, GPIO_TypeDef *gpiox, uint32_t gpio_pin);
|
||||
|
||||
@@ -3,19 +3,26 @@
|
||||
Phase_t phase_A;
|
||||
Phase_t phase_B;
|
||||
Phase_t phase_C;
|
||||
|
||||
// главная функция
|
||||
void upp_main(void)
|
||||
{
|
||||
upp_phase_routine(&phase_A);
|
||||
upp_phase_routine(&phase_B);
|
||||
upp_phase_routine(&phase_C);
|
||||
|
||||
upp_phase_control(&phase_A);
|
||||
upp_phase_control(&phase_B);
|
||||
upp_phase_control(&phase_C);
|
||||
}
|
||||
|
||||
void upp_phase_control(Phase_t *phase)
|
||||
{
|
||||
if(is_zero_cross(&phase->zc_detector))
|
||||
{
|
||||
phase->ctrl.start_delay(&phase->ctrl);
|
||||
tiristor_start_angle_delay(&phase->ctrl);
|
||||
|
||||
if (phase->ctrl.f.TiristorIsEnable)
|
||||
tiristor_disable(&phase->ctrl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +36,15 @@ void upp_phase_routine(Phase_t *phase)
|
||||
void upp_init(void)
|
||||
{
|
||||
tiristor_init(&phase_A.ctrl, GPIOB, GPIO_PIN_12);
|
||||
tiristor_init(&phase_B.ctrl, GPIOB, GPIO_PIN_13);
|
||||
tiristor_init(&phase_C.ctrl, GPIOB, GPIO_PIN_14);
|
||||
|
||||
#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
|
||||
}
|
||||
|
||||
|
||||
@@ -11,12 +11,16 @@
|
||||
|
||||
#define hadc hadc1
|
||||
#define ADC_INITIAL_ZERO_LEVEL 2048
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ZeroCrossDetector_t zc_detector;
|
||||
TiristorControl_t ctrl;
|
||||
} Phase_t;
|
||||
} Phase_t; // структура для фазы
|
||||
|
||||
extern Phase_t phase_A;
|
||||
extern Phase_t phase_B;
|
||||
extern Phase_t phase_C;
|
||||
|
||||
void upp_main(void);
|
||||
void upp_phase_routine(Phase_t *phase);
|
||||
|
||||
@@ -8,10 +8,10 @@ void zero_cross_Init(ZeroCrossDetector_t *zc, uint16_t zeroLevel)
|
||||
zc->f.ZeroCrossDetected = 0;
|
||||
zc->zeroLevel = zeroLevel;
|
||||
}
|
||||
|
||||
// апдейт флага зерокросс детектед
|
||||
void zero_cross_update(ZeroCrossDetector_t *zc)
|
||||
{
|
||||
#ifdef HARDWARE_CROSS_DETECT
|
||||
#ifdef HARDWARE_ZERO_CROSS_DETECT
|
||||
zc->f.ZeroCrossDetected = zc->f.EXTIZeroCrossDetected;
|
||||
#else
|
||||
uint16_t adcValue;
|
||||
@@ -41,13 +41,14 @@ int is_zero_cross(ZeroCrossDetector_t *zc)
|
||||
if(zc->f.ZeroCrossDetected)
|
||||
{
|
||||
zc->f.ZeroCrossDetected = 0;
|
||||
zc->f.EXTIZeroCrossDetected = 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef HARDWARE_CROSS_DETECT
|
||||
#ifdef HARDWARE_ZERO_CROSS_DETECT
|
||||
void zero_cross_update_EXTI(ZeroCrossDetector_t *zc)
|
||||
{
|
||||
zc->f.EXTIZeroCrossDetected = 1;
|
||||
|
||||
@@ -8,11 +8,12 @@
|
||||
|
||||
|
||||
|
||||
#define HARDWARE_CROSS_DETECT
|
||||
#define HARDWARE_ZERO_CROSS_DETECT // аппаратный детект зеро кросс (альтернатива - считывая через ацп)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
#ifdef HARDWARE_CROSS_DETECT
|
||||
unsigned WaitForZeroCrossDetected : 1;
|
||||
#ifdef HARDWARE_ZERO_CROSS_DETECT
|
||||
unsigned EXTIZeroCrossDetected:1;
|
||||
#endif
|
||||
unsigned ZeroCrossDetected:1;
|
||||
@@ -33,7 +34,7 @@ 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_CROSS_DETECT
|
||||
#ifdef HARDWARE_ZERO_CROSS_DETECT
|
||||
void zero_cross_update_EXTI(ZeroCrossDetector_t *zc);
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user