запущен бета упп на stm32f103 в матлаб

This commit is contained in:
2025-05-10 01:23:58 +03:00
parent 5e1364447e
commit d7fe7b0ba1
445 changed files with 210 additions and 595248 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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