Compare commits

...

2 Commits

Author SHA1 Message Date
0e950148c5 Добавлен фильтр на частоту сети
Исправлены баги

Кое как работает:
- с периодом АЦП 30 мкс
- с периодом while 600 мкс
2025-11-19 17:06:28 +03:00
5090ddfd48 Всякие оптимизации и переделки под отладку на 417
По основному алгу
- расчет частоты сети тепер по всему периоду, а не полупериоду
- добавлены новые параметры: сдвиг синуса от нуля и сдвиг между фазами
2025-11-19 15:29:42 +03:00
16 changed files with 359 additions and 205 deletions

@ -1 +1 @@
Subproject commit 2344926f92f837703ae7a6d484daf6ca3210472a Subproject commit 74d692fdd5c92c6b624391b89f397e4ffcb823cc

View File

@ -111,11 +111,13 @@
/* Периоды вызова всякого */ /* Периоды вызова всякого */
#define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс #define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс
#define PM_SLOW_PERIOD_CNT 25 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US #define PM_SLOW_PERIOD_CNT 20 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT #define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT
#define PM_F_SLOW_PERIOD_CNT 2000 ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
/* Частоты таймеров в МГц*/ /* Частоты таймеров в МГц*/
#define US_TIM5_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП #define ADC_TIM8_FREQ_MZH 180 ///< Частота тиков таймера АЦП
#define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы) #define PWM_TIM1_FREQ_MHZ 180 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define PWM_TIM3_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (5-6 каналы) #define PWM_TIM3_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (5-6 каналы)
@ -127,12 +129,14 @@
// ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ====== // ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ======
#if defined(STM32F417xx) #if defined(STM32F417xx)
#undef US_TIM5_FREQ_MHZ
#undef ADC_TIM8_FREQ_MZH #undef ADC_TIM8_FREQ_MZH
#undef PWM_TIM1_FREQ_MHZ #undef PWM_TIM1_FREQ_MHZ
#undef PWM_TIM3_FREQ_MHZ #undef PWM_TIM3_FREQ_MHZ
#undef ANGLE_TIM2_FREQ_MHZ #undef ANGLE_TIM2_FREQ_MHZ
// У 417 меньше частота поэтому меняем прескалер // У 417 меньше частота поэтому меняем прескалер
#define US_TIM5_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define ADC_TIM8_FREQ_MZH 168 ///< Частота тиков таймера АЦП #define ADC_TIM8_FREQ_MZH 168 ///< Частота тиков таймера АЦП
#define PWM_TIM1_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (1-4 каналы) #define PWM_TIM1_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define PWM_TIM3_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (5-6 каналы) #define PWM_TIM3_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (5-6 каналы)

View File

@ -27,11 +27,11 @@
* @brief Список аварий УПП * @brief Список аварий УПП
*/ */
typedef enum { typedef enum {
WM_Not_Init = 0, ///< УПП не инициализирован UPP_Not_Init = 0, ///< УПП не инициализирован
WM_Ready = 1, ///< УПП в готовности UPP_Ready = 1, ///< УПП в готовности
WM_Running = 2, ///< УПП в работе, управляет тиристорами UPP_Work = 2, ///< УПП в работе, управляет тиристорами
WM_Done = 3, ///< УПП закончил свою работу UPP_Error = 3, ///< УПП в аварии
WM_Error = 4, ///< УПП в аварии // WM_Done = 3, ///< УПП закончил свою работу
} UPP_WorkModeType_t; } UPP_WorkModeType_t;
/** /**

View File

@ -104,7 +104,7 @@ HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, float PeriodUs)
HAL_TIM_Base_Stop(adc->htim); HAL_TIM_Base_Stop(adc->htim);
// Запускаем таймер который будет запускать опрос АЦП с заданным периодом // Запускаем таймер который будет запускать опрос АЦП с заданным периодом
__HAL_TIM_SET_AUTORELOAD(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM8_FREQ_MZH)); __HAL_TIM_SET_AUTORELOAD(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM8_FREQ_MZH-1));
res = HAL_TIM_Base_Start(adc->htim); res = HAL_TIM_Base_Start(adc->htim);
if(res != HAL_OK) if(res != HAL_OK)

View File

@ -85,13 +85,22 @@ HAL_StatusTypeDef PowerMonitor_Init(PowerMonitor_t *hpm)
Filter_Start(&hpm->avg[i]); Filter_Start(&hpm->avg[i]);
} }
/* Инициализация среднего фильтра для температур */
for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++) for(int i = 0; i < ADC_NUMB_OF_T_CHANNELS; i++)
{ {
if(FilterAverage_Init(&hpm->avg[ADC_TEMP_CHANNELS_START+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT)) if(FilterAverage_Init(&hpm->avg[AVG_TEMP1+i], PM_TEMP_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
return HAL_ERROR; return HAL_ERROR;
Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]); Filter_Start(&hpm->avg[ADC_TEMP_CHANNELS_START+i]);
} }
/* Инициализация среднего фильтра для частот */
for(int i = 0; i < 3; i++)
{
if(FilterAverage_Init(&hpm->avg[AVG_FBA+i], PM_F_SLOW_PERIOD_CNT, FILTER_MODE_DEFAULT))
return HAL_ERROR;
Filter_Start(&hpm->avg[AVG_FBA+i]);
}
return HAL_OK; return HAL_OK;
} }
@ -130,8 +139,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
/* Обработка температур */ /* Обработка температур */
float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1]; float t1 = hpm->adc.Data[ADC_CHANNEL_TEMP1];
float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2]; float t2 = hpm->adc.Data[ADC_CHANNEL_TEMP2];
meas->final.T[TEMP_1] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP1], t1); meas->final.T[TEMP_1] = Filter_Process(&hpm->avg[AVG_TEMP1], t1);
meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[ADC_CHANNEL_TEMP2], t2); meas->final.T[TEMP_2] = Filter_Process(&hpm->avg[AVG_TEMP2], t2);
/* Расчет третьей фазы */ /* Расчет третьей фазы */
meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]); meas->slow.U[U_BC] = U_BC_calc(meas->slow.U[U_BA], meas->slow.U[U_AC]);
@ -147,7 +156,8 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
{ {
/* Получение частоты фазы */ /* Получение частоты фазы */
meas->final.F[i] = ZC_GetFrequency(&hpm->zc, i) / 2; meas->final.F[i] = Filter_Process(&hpm->avg[AVG_FBA+i], ZC_GetFrequency(&hpm->zc, i));
meas->final.Offset[i] = ZC_GetOffset(&hpm->zc, i);
fmean += meas->final.F[i]; fmean += meas->final.F[i];
/* Средниее напряжение фазы */ /* Средниее напряжение фазы */
@ -163,8 +173,16 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
meas->real.U[i] = meas->slow.U[i]*u_base; meas->real.U[i] = meas->slow.U[i]*u_base;
} }
/* Получение средней частоты по трем фазам */ /* Получение средней частоты по трем фазам */
meas->final.Fmean = fmean / 3; meas->final.Fmean = fmean / 3;
/* Оределение сдвига фаз */
static uint32_t prev_tick_phase_a = 0;
if(prev_tick_phase_a != hpm->zc.Channel[0].PeriodStartTime)
{ // Определяем только когда начался новый период фазы A
prev_tick_phase_a = hpm->zc.Channel[0].PeriodStartTime;
meas->final.Phase[0] = 0;
meas->final.Phase[1] = ZC_GetPhaseShift(&hpm->zc, 0, 1);
meas->final.Phase[2] = ZC_GetPhaseShift(&hpm->zc, 0, 2);
}
/* Расчет амплитуд трехфазной сети */ /* Расчет амплитуд трехфазной сети */
@ -202,8 +220,6 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
meas->fast.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]/i_base; meas->fast.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]/i_base;
meas->fast.I[I_B] = I_B_calc(meas->fast.I[I_A], meas->fast.I[I_C]); meas->fast.I[I_B] = I_B_calc(meas->fast.I[I_A], meas->fast.I[I_C]);
/* Преобразуем в относительные единицы (о.е.) */
/* Ищем переход через ноль */ /* Ищем переход через ноль */
ZC_ProcessAllChannels(&hpm->zc, meas->fast.U, usTick); ZC_ProcessAllChannels(&hpm->zc, meas->fast.U, usTick);
@ -211,10 +227,10 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
//__SynchAvgFilters(hpm); //__SynchAvgFilters(hpm);
/* Average для медленной фильтрации */ /* Average для медленной фильтрации */
meas->slow.U[U_BA] = Filter_Process(&hpm->avg[ADC_CHANNEL_UBA], meas->fast.U[U_BA]); meas->slow.U[U_BA] = Filter_Process(&hpm->avg[AVG_UBA], meas->fast.U[U_BA]);
meas->slow.U[U_AC] = Filter_Process(&hpm->avg[ADC_CHANNEL_UAC], meas->fast.U[U_AC]); meas->slow.U[U_AC] = Filter_Process(&hpm->avg[AVG_UAC], meas->fast.U[U_AC]);
meas->slow.I[I_C] = Filter_Process(&hpm->avg[ADC_CHANNEL_IC], meas->fast.I[I_C]); meas->slow.I[I_C] = Filter_Process(&hpm->avg[AVG_IC], meas->fast.I[I_C]);
meas->slow.I[I_A] = Filter_Process(&hpm->avg[ADC_CHANNEL_IA], meas->fast.I[I_A]); meas->slow.I[I_A] = Filter_Process(&hpm->avg[AVG_IA], meas->fast.I[I_A]);
/* Запускаем медленную обработку через slow_period прерываний */ /* Запускаем медленную обработку через slow_period прерываний */

View File

@ -21,6 +21,16 @@
#define EXP_IA 6 #define EXP_IA 6
#define EXP_IB 7 #define EXP_IB 7
#define AVG_ALL 9
#define AVG_UBA 0
#define AVG_UAC 1
#define AVG_IC 2
#define AVG_IA 3
#define AVG_TEMP1 4
#define AVG_TEMP2 5
#define AVG_FBA 6
#define AVG_FAC 7
#define AVG_FBC 8
/** /**
* @brief Флаги Мониторинга сети * @brief Флаги Мониторинга сети
@ -43,13 +53,15 @@ typedef struct
/** @brief Усредненные величины (о.е.) */ /** @brief Усредненные величины (о.е.) */
struct struct
{ {
float Uamp; ///< Результирующий вектор Напряжения по трем фазам float Uamp; ///< Результирующий вектор Напряжения по трем фазам
float Iamp; ///< Результирующий вектор Тока по трем фазам float Iamp; ///< Результирующий вектор Тока по трем фазам
float U[3]; ///< Среднее Наряжение по трем фазам float U[3]; ///< Среднее Наряжение по трем фазам
float I[3]; ///< Средний Ток по трем фазам float I[3]; ///< Средний Ток по трем фазам
float Fmean; ///< Средняя Частота по трем фазам float Fmean; ///< Средняя Частота по трем фазам
float F[3]; ///< Частота от Zero Cross (обновляется в main) float F[3]; ///< Частота от Zero Cross (обновляется в main)
float T[2]; ///< Температура (обновляется в main) float Phase[3]; ///< Фазовое смещение по отношению к фазе A
float Offset[3]; ///< Смещение синуса относителньо нуля (определяется по отношению полупериодов)
float T[2]; ///< Температура (обновляется в main)
}final; }final;
/** @brief Быстрые величины (в о.е.) - обновляются в каждом прерывании АЦП @ref PowerMonitor_FastCalc */ /** @brief Быстрые величины (в о.е.) - обновляются в каждом прерывании АЦП @ref PowerMonitor_FastCalc */
@ -86,7 +98,7 @@ typedef struct
PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины PowerMonitor_Measured_t measured; ///< Измеренные/рассчитанные величины
FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов FilterExp_t exp[EXP_ALL]; ///< Фильтры для сглаживания мговенного значения Напряжения/Токов
FilterAverage_t avg[ADC_NUMB_OF_CHANNELS]; ///< Фильтры для сглаживания медленных величин АЦП FilterAverage_t avg[AVG_ALL]; ///< Фильтры для сглаживания медленных величин АЦП
PowerMonitor_Flags_t f; ///< Флаги мониторинга PowerMonitor_Flags_t f; ///< Флаги мониторинга
uint32_t isr_cnt; uint32_t isr_cnt;

View File

@ -155,10 +155,17 @@ void ZC_ProcessChannel(ZeroCross_Handle_t *zc, uint8_t channel, float value, uin
uint32_t RealTimestamp = timestamp-RealTimeShift; uint32_t RealTimestamp = timestamp-RealTimeShift;
if (zc_ch->LastCrossTime != 0) { if (zc_ch->LastCrossTime != 0) {
// Расчет периода и частоты // Расчет периода и частоты
zc_ch->Period = RealTimestamp - zc_ch->LastCrossTime; float curr_half_period = RealTimestamp - zc_ch->LastCrossTime;
if (zc_ch->Period > 0) { if (curr_half_period > 0) {
zc_ch->Frequency = 1000000.0f / zc_ch->Period; if(zc_ch->HalfWave == UPP_WAVE_POSITIVE)
{
zc_ch->PeriodStartTime = RealTimestamp;
zc_ch->Period = zc_ch->halfPeriod + curr_half_period;
zc_ch->Frequency = 1000000.0f / zc_ch->Period;
zc_ch->FrequencyOffset = (float)zc_ch->halfPeriod / curr_half_period;
}
} }
zc_ch->halfPeriod = curr_half_period;
} }
zc_ch->LastCrossTime = RealTimestamp; zc_ch->LastCrossTime = RealTimestamp;
@ -245,6 +252,54 @@ float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel)
return zc->Channel[channel].Frequency; return zc->Channel[channel].Frequency;
} }
/**
* @brief Получение смещение частот полупериода сигнала.
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала
* @return Отношение длительности первой полуволны к второй полуволне.
*/
float ZC_GetOffset(ZeroCross_Handle_t *zc, uint8_t channel)
{
if (assert_upp(zc)){
return 0.0f;
}
if (channel >= zc->Config.NumChannels) {
return 0.0f;
}
return zc->Channel[channel].FrequencyOffset;
}
/**
* @brief Получить сдвиг между двумя фазами.
* @param zc Указатель на хендл детектора нуля
* @param channel Номер канала от которого считать сдвиг
* @param channe2 Номер канала для которого расчитать сдвиг
* @return Фазовый сдвиг в процентах от периода от 1 до 2 канала
*/
float ZC_GetPhaseShift(ZeroCross_Handle_t *zc, uint8_t channel1, uint8_t channel2)
{
if (assert_upp(zc)){
return 0.0f;
}
if ((channel1 >= zc->Config.NumChannels) || (channel2 >= zc->Config.NumChannels)){
return 0.0f;
}
float delta_time = 0;
if(zc->Channel[channel1].PeriodStartTime >= zc->Channel[channel2].PeriodStartTime)
delta_time = (zc->Channel[channel1].PeriodStartTime - zc->Channel[channel2].PeriodStartTime);
else
delta_time = (zc->Channel[channel2].PeriodStartTime - zc->Channel[channel1].PeriodStartTime);
float phase_ratio = delta_time/zc->Channel[channel1].Period;
return phase_ratio;
}
/** /**
* @brief Включение/выключение мониторинга. * @brief Включение/выключение мониторинга.
* @param zc Указатель на хендл детектора нуля * @param zc Указатель на хендл детектора нуля

View File

@ -94,8 +94,11 @@ typedef struct {
float CurrentValue; ///< Текущее значение float CurrentValue; ///< Текущее значение
uint16_t DebounceCounter; ///< Счетчик антидребезга uint16_t DebounceCounter; ///< Счетчик антидребезга
uint32_t LastCrossTime; ///< Время последнего перехода uint32_t LastCrossTime; ///< Время последнего перехода
float halfPeriod; ///< Длительность полупериода (в тактах таймера)
uint32_t PeriodStartTime; ///< Время начала периода (в тактах таймера)
uint32_t Period; ///< Период сигнала (в тактах таймера) uint32_t Period; ///< Период сигнала (в тактах таймера)
float Frequency; ///< Частота float Frequency; ///< Частота
float FrequencyOffset; ///< Смещение частот полупериода - насколько сигнал смещен
UPP_HalfWave_t HalfWave; ///< Текущая полуволна UPP_HalfWave_t HalfWave; ///< Текущая полуволна
ZC_EdgeType_t EdgeType; ///< Тип детектируемого перехода ZC_EdgeType_t EdgeType; ///< Тип детектируемого перехода
} ZC_Channel_t; } ZC_Channel_t;
@ -152,6 +155,10 @@ void ZC_ProcessAllChannels(ZeroCross_Handle_t *zc, float *values,
int ZC_isOccurred(ZeroCross_Handle_t *zc, uint8_t channel); int ZC_isOccurred(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение частоты сигнала */ /* Получение частоты сигнала */
float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel); float ZC_GetFrequency(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получение смещение частот полупериода сигнала */
float ZC_GetOffset(ZeroCross_Handle_t *zc, uint8_t channel);
/* Получить сдвиг между двумя фазами. */
float ZC_GetPhaseShift(ZeroCross_Handle_t *zc, uint8_t channel1, uint8_t channel2);
/* Получение полуволны (после последнего zero-cross) */ /* Получение полуволны (после последнего zero-cross) */
UPP_HalfWave_t ZC_GetHalfWave(ZeroCross_Handle_t *zc, uint8_t channel); UPP_HalfWave_t ZC_GetHalfWave(ZeroCross_Handle_t *zc, uint8_t channel);

View File

@ -108,7 +108,7 @@ int main(void)
MX_USART3_UART_Init(); MX_USART3_UART_Init();
MX_CAN1_Init(); MX_CAN1_Init();
MX_IWDG_Init(); MX_IWDG_Init();
MX_RTC_Init(); //MX_RTC_Init();
MX_TIM1_Init(); MX_TIM1_Init();
MX_TIM3_Init(); MX_TIM3_Init();
MX_USART6_UART_Init(); MX_USART6_UART_Init();
@ -119,10 +119,10 @@ int main(void)
MX_TIM5_Init(); MX_TIM5_Init();
MX_TIM2_Init(); MX_TIM2_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
// меняем прескалер на частоту по дефайну
__HAL_TIM_SET_PRESCALER_FORCE(&ustim, US_TIM5_FREQ_MHZ-1);
#if defined(STM32F417xx) #if defined(STM32F417xx)
// У 417 меньше частота поэтому меняем прескалер // т.к. нет епромки выставляем дефолтные
__HAL_TIM_SET_PRESCALER(&ustim, 84-1);
// И т.к. нет епромки выставляем дефолтные
UPP_SetDefault(1, 1); UPP_SetDefault(1, 1);
#endif #endif
#else //MATLAB #else //MATLAB

View File

@ -68,10 +68,6 @@ void MX_TIM1_Init(void)
{ {
Error_Handler(); Error_Handler();
} }
if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
@ -256,8 +252,8 @@ void MX_TIM5_Init(void)
/* USER CODE END TIM5_Init 0 */ /* USER CODE END TIM5_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_IC_InitTypeDef sConfigIC = {0};
/* USER CODE BEGIN TIM5_Init 1 */ /* USER CODE BEGIN TIM5_Init 1 */
@ -268,7 +264,12 @@ void MX_TIM5_Init(void)
htim5.Init.Period = 4294967295; htim5.Init.Period = 4294967295;
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_IC_Init(&htim5) != HAL_OK) if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
{ {
Error_Handler(); Error_Handler();
} }
@ -278,14 +279,6 @@ void MX_TIM5_Init(void)
{ {
Error_Handler(); Error_Handler();
} }
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
if (HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM5_Init 2 */ /* USER CODE BEGIN TIM5_Init 2 */
/* USER CODE END TIM5_Init 2 */ /* USER CODE END TIM5_Init 2 */
@ -436,6 +429,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM3_MspInit 1 */ /* USER CODE END TIM3_MspInit 1 */
} }
else if(tim_baseHandle->Instance==TIM5)
{
/* USER CODE BEGIN TIM5_MspInit 0 */
/* USER CODE END TIM5_MspInit 0 */
/* TIM5 clock enable */
__HAL_RCC_TIM5_CLK_ENABLE();
/* USER CODE BEGIN TIM5_MspInit 1 */
/* USER CODE END TIM5_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM8) else if(tim_baseHandle->Instance==TIM8)
{ {
/* USER CODE BEGIN TIM8_MspInit 0 */ /* USER CODE BEGIN TIM8_MspInit 0 */
@ -474,35 +478,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM12_MspInit 1 */ /* USER CODE END TIM12_MspInit 1 */
} }
} }
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* tim_icHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(tim_icHandle->Instance==TIM5)
{
/* USER CODE BEGIN TIM5_MspInit 0 */
/* USER CODE END TIM5_MspInit 0 */
/* TIM5 clock enable */
__HAL_RCC_TIM5_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM5 GPIO Configuration
PA0/WKUP ------> TIM5_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM5;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM5_MspInit 1 */
/* USER CODE END TIM5_MspInit 1 */
}
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{ {
@ -597,6 +572,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM3_MspDeInit 1 */ /* USER CODE END TIM3_MspDeInit 1 */
} }
else if(tim_baseHandle->Instance==TIM5)
{
/* USER CODE BEGIN TIM5_MspDeInit 0 */
/* USER CODE END TIM5_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM5_CLK_DISABLE();
/* USER CODE BEGIN TIM5_MspDeInit 1 */
/* USER CODE END TIM5_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM8) else if(tim_baseHandle->Instance==TIM8)
{ {
/* USER CODE BEGIN TIM8_MspDeInit 0 */ /* USER CODE BEGIN TIM8_MspDeInit 0 */
@ -635,28 +621,6 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
} }
} }
void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* tim_icHandle)
{
if(tim_icHandle->Instance==TIM5)
{
/* USER CODE BEGIN TIM5_MspDeInit 0 */
/* USER CODE END TIM5_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM5_CLK_DISABLE();
/**TIM5 GPIO Configuration
PA0/WKUP ------> TIM5_CH1
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
/* USER CODE BEGIN TIM5_MspDeInit 1 */
/* USER CODE END TIM5_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
/* USER CODE END 1 */ /* USER CODE END 1 */

View File

@ -60,6 +60,7 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm)
PWM_SetConfig(hpwm, PARAM_INTERNAL.pwm.PhaseMask, PARAM_INTERNAL.pwm.Frequency, PARAM_INTERNAL.pwm.PulseNumber); PWM_SetConfig(hpwm, PARAM_INTERNAL.pwm.PhaseMask, PARAM_INTERNAL.pwm.Frequency, PARAM_INTERNAL.pwm.PulseNumber);
PWM_Stop(hpwm, 0, 1);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_1); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_1);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_2);
HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_3); HAL_TIM_PWM_Start(&hpwm1, PWM_CHANNEL_3);
@ -68,7 +69,6 @@ HAL_StatusTypeDef PWM_Init(PWM_Handle_t *hpwm)
HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6); HAL_TIM_PWM_Start(&hpwm2, PWM_CHANNEL_6);
HAL_TIM_Base_Start_IT(&hpwm1); HAL_TIM_Base_Start_IT(&hpwm1);
return HAL_OK; return HAL_OK;
} }
@ -232,8 +232,8 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t
hpwm->Config.PulseNumber = PulseNumber; hpwm->Config.PulseNumber = PulseNumber;
hpwm->Config.Frequency = Frequency; hpwm->Config.Frequency = Frequency;
// Высставление периодов // Высставление периодов
__HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(Frequency, PWM_TIM1_FREQ_MHZ)); __HAL_TIM_SET_AUTORELOAD(&hpwm1, TIM_FreqToTick(Frequency, PWM_TIM1_FREQ_MHZ-1));
__HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM3_FREQ_MHZ)); __HAL_TIM_SET_AUTORELOAD(&hpwm2, TIM_FreqToTick(Frequency, PWM_TIM3_FREQ_MHZ-1));
// Скважности 50/50 // Скважности 50/50
__HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_1, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_1, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2);
__HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_2, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2); __HAL_TIM_SET_COMPARE(&hpwm1, PWM_CHANNEL_2, __HAL_TIM_GET_AUTORELOAD(&hpwm1)/2);
@ -246,6 +246,9 @@ HAL_StatusTypeDef PWM_SetConfig(PWM_Handle_t *hpwm, uint8_t PhaseMask, uint16_t
// Сброс счетчиков таймера и запуск заного // Сброс счетчиков таймера и запуск заного
__HAL_TIM_SET_COUNTER(&hpwm1, 0); __HAL_TIM_SET_COUNTER(&hpwm1, 0);
__HAL_TIM_SET_COUNTER(&hpwm2, 0); __HAL_TIM_SET_COUNTER(&hpwm2, 0);
PWM_Stop(hpwm, 0, 1);
return HAL_TIM_Base_Start_IT(&hpwm1); return HAL_TIM_Base_Start_IT(&hpwm1);
} }

View File

@ -46,7 +46,7 @@ int UPP_Init(void)
return 1; return 1;
} }
upp.workmode = WM_Ready; upp.workmode = UPP_Ready;
return 0; return 0;
} }
@ -75,10 +75,9 @@ int UPP_PreWhile(void)
int UPP_While(void) int UPP_While(void)
{ {
int retval = 0; int retval = 0;
HAL_IWDG_Refresh(&hiwdg);
if(upp.pm.f.runSlow) if(upp.pm.f.runSlow)
{ {
HAL_IWDG_Refresh(&hiwdg);
BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY); BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
UPP_DO.CEN(ENABLE); UPP_DO.CEN(ENABLE);
@ -92,28 +91,27 @@ int UPP_While(void)
{ {
upp.call->stop = 0; upp.call->stop = 0;
} }
// Если СТОП - переходим в ошибку
if (upp.call->stop) if (upp.call->stop)
upp.workmode = WM_Error; upp.workmode = UPP_Error;
// Сброс на дефолтные по запросу // Сброс на дефолтные по запросу
if(upp.call->set_default_pui) if(upp.call->set_default_pui || upp.call->set_default_internal)
{ {
UPP_SetDefault(1, 0); UPP_SetDefault(upp.call->set_default_pui, upp.call->set_default_internal);
}
if(upp.call->set_default_internal)
{
UPP_SetDefault(0, 1);
} }
// Медленные расчеты
PowerMonitor_SlowCalc(&upp.pm); PowerMonitor_SlowCalc(&upp.pm);
// Защиты // Определенные защиты включаем только в режиме работы
PowerMonitor_Protect(&upp.pm, upp.workmode == UPP_Work);
// Если СТОП - переходим в ошибку
// Автомат состояний УПП // Автомат состояний УПП
switch(upp.workmode) switch(upp.workmode)
{ {
/* Состояние готовности */ /* Состояние готовности */
case WM_Ready: case UPP_Ready:
PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
// Индикация // Индикация
UPP_DO.Ready(ENABLE); UPP_DO.Ready(ENABLE);
@ -123,21 +121,21 @@ int UPP_While(void)
// если пришла команда на запуск // если пришла команда на запуск
if (upp.call->go) if (upp.call->go)
{ {
upp.workmode = WM_Running; upp.workmode = UPP_Work;
Angle_PID_Reset(&upp.hangle); Angle_PID_Reset(&upp.hangle);
upp.StartTick = local_time(); upp.StartTick = local_time();
} }
break; break;
/* Состояние В работе */ /* Состояние В работе */
case WM_Running: case UPP_Work:
// Индикация // Индикация
UPP_DO.Ready(DISABLE); UPP_DO.Ready(DISABLE);
UPP_DO.Work(ENABLE); UPP_DO.Work(ENABLE);
UPP_DO.Error(DISABLE); UPP_DO.Error(DISABLE);
// если пришла команда на остановку // если пришла команда на остановку
if (!upp.call->go) if (!upp.call->go)
upp.workmode = WM_Ready; upp.workmode = UPP_Ready;
// Регулирование тиристоров // Регулирование тиристоров
Angle_PID(&upp.hangle, iref_dbg, upp.pm.measured.final.Iamp); Angle_PID(&upp.hangle, iref_dbg, upp.pm.measured.final.Iamp);
@ -159,7 +157,7 @@ int UPP_While(void)
// break; // break;
/* Состояние Ошибки */ /* Состояние Ошибки */
case WM_Error: case UPP_Error:
default: default:
PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
// Индикация // Индикация
@ -168,12 +166,17 @@ int UPP_While(void)
UPP_DO.Error(ENABLE); UPP_DO.Error(ENABLE);
// Находимся до тех пор пока ошибки не будет устранена // Находимся до тех пор пока ошибки не будет устранена
if(errors.common == Err_None) if(errors.common == Err_None)
upp.workmode = WM_Ready; upp.workmode = UPP_Ready;
retval = 1; retval = 1;
break; break;
} }
UPP_Errors_Handle();
UPP_Params_InternalControl();
upp.pm.f.runSlow = 0; upp.pm.f.runSlow = 0;
upp.Timings.slow_calc_us = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ; upp.Timings.slow_calc_us = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ;
}//if(upp.pm.f.runSlow) }//if(upp.pm.f.runSlow)
@ -191,10 +194,8 @@ int UPP_While(void)
*/ */
void UPP_Tick(void) void UPP_Tick(void)
{ {
if(upp.workmode == WM_Not_Init) if(upp.workmode == UPP_Not_Init)
return; return;
UPP_Errors_Handle();
UPP_Params_InternalControl();
} }
@ -214,15 +215,13 @@ void UPP_ADC_Handle(void)
PowerMonitor_FastCalc(&upp.pm); PowerMonitor_FastCalc(&upp.pm);
PowerMonitor_Protect(&upp.pm, upp.workmode == WM_Running);
for(int phase = 0; phase < 3; phase++) for(int phase = 0; phase < 3; phase++)
{ {
// Если произошел Zero Cross // Если произошел Zero Cross
if(ZC_isOccurred(&upp.pm.zc, phase)) if(ZC_isOccurred(&upp.pm.zc, phase))
{ {
// Если УПП в работе // Если УПП в работе
if(upp.workmode == WM_Running) if(upp.workmode == UPP_Work)
{ {
// Меняем полуволну тиристора // Меняем полуволну тиристора
UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase); UPP_HalfWave_t curr_halfwave = ZC_GetHalfWave(&upp.pm.zc, phase);
@ -250,7 +249,7 @@ void UPP_Angle_Handle(void)
UPP_Phase_t phase = Angle_Handle(&upp.hangle); UPP_Phase_t phase = Angle_Handle(&upp.hangle);
Angle_Reset(&upp.hangle, phase); Angle_Reset(&upp.hangle, phase);
// Если УПП в работе // Если УПП в работе
if(upp.workmode == WM_Running) if(upp.workmode == UPP_Work)
{ {
switch(phase) switch(phase)
{ {

View File

@ -329,18 +329,34 @@
<Bp> <Bp>
<Number>0</Number> <Number>0</Number>
<Type>0</Type> <Type>0</Type>
<LineNumber>136</LineNumber> <LineNumber>407</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134258308</Address> <Address>134233366</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject> <SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess> <BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount> <BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/stm32f4xx_it.c</Filename> <Filename>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c</Filename>
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression>\\Debug_F417\../Core/Src/stm32f4xx_it.c\136</Expression> <Expression>\\Debug_F417\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c\407</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>27</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>.\startup_stm32f417xx.s</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp> </Bp>
</Breakpoint> </Breakpoint>
<WatchWindow1> <WatchWindow1>
@ -369,6 +385,31 @@
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>hbt,0x0A</ItemText> <ItemText>hbt,0x0A</ItemText>
</Ww> </Ww>
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>htim5.Instance-&gt;CNT,0x0A</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>htim5.Instance-&gt;PSC,0x0A</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>SystemCoreClock,0x0A</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>sysclockfreq,0x0A</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>\\Debug_F417\../Core/UPP/upp_main.c\upp.pm.avg[5].dataProcessing</ItemText>
</Ww>
</WatchWindow1> </WatchWindow1>
<WatchWindow2> <WatchWindow2>
<Ww> <Ww>
@ -389,7 +430,7 @@
<Ww> <Ww>
<count>3</count> <count>3</count>
<WinNumber>2</WinNumber> <WinNumber>2</WinNumber>
<ItemText>errors.prvt.cnt</ItemText> <ItemText>errors.prvt.cnt,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>4</count> <count>4</count>
@ -401,6 +442,36 @@
<WinNumber>2</WinNumber> <WinNumber>2</WinNumber>
<ItemText>errors.common</ItemText> <ItemText>errors.common</ItemText>
</Ww> </Ww>
<Ww>
<count>6</count>
<WinNumber>2</WinNumber>
<ItemText>upp.pm.measured.slow.U[0]</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>2</WinNumber>
<ItemText>zc-&gt;Channel[channel1].PeriodStartTime,0x0A</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>2</WinNumber>
<ItemText>zc-&gt;Channel[channel2].PeriodStartTime,0x0A</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>2</WinNumber>
<ItemText>zc-&gt;Channel[channel1].PeriodStartTime - zc-&gt;Channel[channel2].PeriodStartTime,0x10</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>2</WinNumber>
<ItemText>htim5.Instance,0x0A</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>2</WinNumber>
<ItemText>iref_dbg</ItemText>
</Ww>
</WatchWindow2> </WatchWindow2>
<Tracepoint> <Tracepoint>
<THDelay>0</THDelay> <THDelay>0</THDelay>
@ -444,9 +515,38 @@
<pszMrulep></pszMrulep> <pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp> <pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp> <pMultCmdsp></pMultCmdsp>
<LogicAnalyzers>
<Wi>
<IntNumber>0</IntNumber>
<FirstString>`upp.pm.measured.real.U[0]</FirstString>
<SecondString>0000000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B305D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000001000000731CC7711CC7D13F1400000000000000000000000000000000000000A49F0008</SecondString>
</Wi>
<Wi>
<IntNumber>1</IntNumber>
<FirstString>`upp.pm.measured.real.U[1]</FirstString>
<SecondString>0080000000000000007097C00000000000709740000000000000000000000000000000007570702E706D2E6D656173757265642E7265616C2E555B315D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000002000000398EE3388EE3D83F1400000000000000000000000000000000000000A49F0008</SecondString>
</Wi>
<Wi>
<IntNumber>2</IntNumber>
<FirstString>`upp.pm.measured.final.F[0]</FirstString>
<SecondString>0000800000000000000000000000000000805140000000000000000000000000000000007570702E706D2E6D656173757265642E66696E616C2E465B305D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000003000000555555555555D53F140000000000000000000000000000000000000028020008</SecondString>
</Wi>
</LogicAnalyzers>
<SystemViewers> <SystemViewers>
<Entry> <Entry>
<Name>System Viewer\DMA2</Name> <Name>System Viewer\DBG</Name>
<WinId>35902</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM1</Name>
<WinId>35901</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM14</Name>
<WinId>35903</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM5</Name>
<WinId>35905</WinId> <WinId>35905</WinId>
</Entry> </Entry>
<Entry> <Entry>
@ -1362,7 +1462,7 @@
<Group> <Group>
<GroupName>PeriphGeneral</GroupName> <GroupName>PeriphGeneral</GroupName>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>

View File

@ -17,8 +17,8 @@
<TargetCommonOption> <TargetCommonOption>
<Device>STM32F427ZGTx</Device> <Device>STM32F427ZGTx</Device>
<Vendor>STMicroelectronics</Vendor> <Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID> <PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
<PackURL>http://www.keil.com/pack/</PackURL> <PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu> <Cpu>IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
<FlashUtilSpec></FlashUtilSpec> <FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile> <StartupFile></StartupFile>
@ -1004,8 +1004,8 @@
<TargetCommonOption> <TargetCommonOption>
<Device>STM32F417ZGTx</Device> <Device>STM32F417ZGTx</Device>
<Vendor>STMicroelectronics</Vendor> <Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID> <PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
<PackURL>http://www.keil.com/pack/</PackURL> <PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu> <Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec> <FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile> <StartupFile></StartupFile>

View File

@ -40,7 +40,7 @@ __initial_sp
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h> ; </h>
Heap_Size EQU 0x200 Heap_Size EQU 0x400
AREA HEAP, NOINIT, READWRITE, ALIGN=3 AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base __heap_base

View File

@ -82,70 +82,69 @@ Mcu.Pin12=PF10
Mcu.Pin13=PH0/OSC_IN Mcu.Pin13=PH0/OSC_IN
Mcu.Pin14=PH1/OSC_OUT Mcu.Pin14=PH1/OSC_OUT
Mcu.Pin15=PC0 Mcu.Pin15=PC0
Mcu.Pin16=PA0/WKUP Mcu.Pin16=PA4
Mcu.Pin17=PA4 Mcu.Pin17=PA5
Mcu.Pin18=PA5 Mcu.Pin18=PA6
Mcu.Pin19=PA6 Mcu.Pin19=PB0
Mcu.Pin2=PE4 Mcu.Pin2=PE4
Mcu.Pin20=PB0 Mcu.Pin20=PB1
Mcu.Pin21=PB1 Mcu.Pin21=PF11
Mcu.Pin22=PF11 Mcu.Pin22=PB10
Mcu.Pin23=PB10 Mcu.Pin23=PB11
Mcu.Pin24=PB11 Mcu.Pin24=PB13
Mcu.Pin25=PB13 Mcu.Pin25=PG6
Mcu.Pin26=PG6 Mcu.Pin26=PC6
Mcu.Pin27=PC6 Mcu.Pin27=PC7
Mcu.Pin28=PC7 Mcu.Pin28=PC8
Mcu.Pin29=PC8 Mcu.Pin29=PC9
Mcu.Pin3=PE5 Mcu.Pin3=PE5
Mcu.Pin30=PC9 Mcu.Pin30=PA8
Mcu.Pin31=PA8 Mcu.Pin31=PA9
Mcu.Pin32=PA9 Mcu.Pin32=PA10
Mcu.Pin33=PA10 Mcu.Pin33=PA11
Mcu.Pin34=PA11 Mcu.Pin34=PA12
Mcu.Pin35=PA12 Mcu.Pin35=PA13
Mcu.Pin36=PA13 Mcu.Pin36=PA14
Mcu.Pin37=PA14 Mcu.Pin37=PA15
Mcu.Pin38=PA15 Mcu.Pin38=PC10
Mcu.Pin39=PC10 Mcu.Pin39=PC11
Mcu.Pin4=PE6 Mcu.Pin4=PE6
Mcu.Pin40=PC11 Mcu.Pin40=PC12
Mcu.Pin41=PC12 Mcu.Pin41=PD2
Mcu.Pin42=PD2 Mcu.Pin42=PD3
Mcu.Pin43=PD3 Mcu.Pin43=PD6
Mcu.Pin44=PD6 Mcu.Pin44=PG12
Mcu.Pin45=PG12 Mcu.Pin45=PG15
Mcu.Pin46=PG15 Mcu.Pin46=PB3
Mcu.Pin47=PB3 Mcu.Pin47=PB6
Mcu.Pin48=PB6 Mcu.Pin48=PB7
Mcu.Pin49=PB7 Mcu.Pin49=PB8
Mcu.Pin5=PC13 Mcu.Pin5=PC13
Mcu.Pin50=PB8 Mcu.Pin50=PB9
Mcu.Pin51=PB9 Mcu.Pin51=PE0
Mcu.Pin52=PE0 Mcu.Pin52=PE1
Mcu.Pin53=PE1 Mcu.Pin53=VP_IWDG_VS_IWDG
Mcu.Pin54=VP_IWDG_VS_IWDG Mcu.Pin54=VP_RTC_VS_RTC_Activate
Mcu.Pin55=VP_RTC_VS_RTC_Activate Mcu.Pin55=VP_RTC_VS_RTC_Calendar
Mcu.Pin56=VP_RTC_VS_RTC_Calendar Mcu.Pin56=VP_SYS_VS_tim14
Mcu.Pin57=VP_SYS_VS_tim14 Mcu.Pin57=VP_TIM1_VS_ClockSourceINT
Mcu.Pin58=VP_TIM1_VS_ClockSourceINT Mcu.Pin58=VP_TIM2_VS_ClockSourceINT
Mcu.Pin59=VP_TIM1_VS_OPM Mcu.Pin59=VP_TIM2_VS_no_output1
Mcu.Pin6=PC14/OSC32_IN Mcu.Pin6=PC14/OSC32_IN
Mcu.Pin60=VP_TIM2_VS_ClockSourceINT Mcu.Pin60=VP_TIM2_VS_no_output2
Mcu.Pin61=VP_TIM2_VS_no_output1 Mcu.Pin61=VP_TIM2_VS_no_output3
Mcu.Pin62=VP_TIM2_VS_no_output2 Mcu.Pin62=VP_TIM3_VS_ControllerModeTrigger
Mcu.Pin63=VP_TIM2_VS_no_output3 Mcu.Pin63=VP_TIM3_VS_ClockSourceINT
Mcu.Pin64=VP_TIM3_VS_ControllerModeTrigger Mcu.Pin64=VP_TIM3_VS_ClockSourceITR
Mcu.Pin65=VP_TIM3_VS_ClockSourceINT Mcu.Pin65=VP_TIM3_VS_OPM
Mcu.Pin66=VP_TIM3_VS_ClockSourceITR Mcu.Pin66=VP_TIM5_VS_ClockSourceINT
Mcu.Pin67=VP_TIM3_VS_OPM Mcu.Pin67=VP_TIM8_VS_ClockSourceINT
Mcu.Pin68=VP_TIM8_VS_ClockSourceINT Mcu.Pin68=VP_TIM11_VS_ClockSourceINT
Mcu.Pin69=VP_TIM11_VS_ClockSourceINT Mcu.Pin69=VP_TIM12_VS_ClockSourceINT
Mcu.Pin7=PC15/OSC32_OUT Mcu.Pin7=PC15/OSC32_OUT
Mcu.Pin70=VP_TIM12_VS_ClockSourceINT
Mcu.Pin8=PF6 Mcu.Pin8=PF6
Mcu.Pin9=PF7 Mcu.Pin9=PF7
Mcu.PinsNb=71 Mcu.PinsNb=70
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;usTick,ustim.Instance->CNT;hpwm2,htim3;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;ANGLE_CHANNEL_1,TIM_CHANNEL_1;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;angletim,htim2 Mcu.UserConstants=mb_huart,huart3;mbdbg_htim,htim11;PWM_CHANNEL_1,TIM_CHANNEL_1;PWM_CHANNEL_2,TIM_CHANNEL_2;PWM_CHANNEL_3,TIM_CHANNEL_3;PWM_CHANNEL_4,TIM_CHANNEL_4;mem_hspi,hspi3;PWM_CHANNEL_5,TIM_CHANNEL_3;PWM_CHANNEL_6,TIM_CHANNEL_4;mb_htim,htim12;adc_tim,htim8;usTick,ustim.Instance->CNT;hpwm2,htim3;mb_dbg_huart,huart6;ustim,htim5;hpwm1,htim1;ANGLE_CHANNEL_1,TIM_CHANNEL_1;ANGLE_CHANNEL_2,TIM_CHANNEL_2;ANGLE_CHANNEL_3,TIM_CHANNEL_3;angletim,htim2
Mcu.UserName=STM32F427ZGTx Mcu.UserName=STM32F427ZGTx
@ -168,7 +167,6 @@ NVIC.TIM8_TRG_COM_TIM14_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
NVIC.TimeBase=TIM8_TRG_COM_TIM14_IRQn NVIC.TimeBase=TIM8_TRG_COM_TIM14_IRQn
NVIC.TimeBaseIP=TIM14 NVIC.TimeBaseIP=TIM14
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA0/WKUP.Signal=S_TIM5_CH1
PA10.GPIOParameters=GPIO_Label PA10.GPIOParameters=GPIO_Label
PA10.GPIO_Label=PWM3 PA10.GPIO_Label=PWM3
PA10.Locked=true PA10.Locked=true
@ -466,19 +464,16 @@ SH.S_TIM3_CH3.0=TIM3_CH3,PWM Generation3 CH3
SH.S_TIM3_CH3.ConfNb=1 SH.S_TIM3_CH3.ConfNb=1
SH.S_TIM3_CH4.0=TIM3_CH4,PWM Generation4 CH4 SH.S_TIM3_CH4.0=TIM3_CH4,PWM Generation4 CH4
SH.S_TIM3_CH4.ConfNb=1 SH.S_TIM3_CH4.ConfNb=1
SH.S_TIM5_CH1.0=TIM5_CH1,Input_Capture1_from_TI1
SH.S_TIM5_CH1.ConfNb=1
SPI3.CalculateBaudRate=22.5 MBits/s SPI3.CalculateBaudRate=22.5 MBits/s
SPI3.Direction=SPI_DIRECTION_2LINES SPI3.Direction=SPI_DIRECTION_2LINES
SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate
SPI3.Mode=SPI_MODE_MASTER SPI3.Mode=SPI_MODE_MASTER
SPI3.VirtualType=VM_MASTER SPI3.VirtualType=VM_MASTER
TIM1.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2
TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM1.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM1.IPParameters=Prescaler,Channel-Output Compare2 CH2,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger TIM1.IPParameters=Prescaler,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation4 CH4,Channel-PWM Generation3 CH3,TIM_MasterOutputTrigger
TIM1.Prescaler=0 TIM1.Prescaler=0
TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM11.IPParameters=Prescaler TIM11.IPParameters=Prescaler
@ -497,8 +492,7 @@ TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,TIM_MasterSlaveMode,TIM_MasterOutputTrigger TIM3.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM3.TIM_MasterOutputTrigger=TIM_TRGO_RESET TIM3.TIM_MasterOutputTrigger=TIM_TRGO_RESET
TIM3.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE TIM3.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE
TIM5.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1 TIM5.IPParameters=Prescaler
TIM5.IPParameters=Channel-Input_Capture1_from_TI1,Prescaler
TIM5.Prescaler=90-1 TIM5.Prescaler=90-1
TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger TIM8.IPParameters=Prescaler,Period,TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM8.Period=1800-1 TIM8.Period=1800-1
@ -523,8 +517,6 @@ VP_TIM12_VS_ClockSourceINT.Mode=Internal
VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT
VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM1_VS_OPM.Mode=OPM_bit
VP_TIM1_VS_OPM.Signal=TIM1_VS_OPM
VP_TIM2_VS_ClockSourceINT.Mode=Internal VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output VP_TIM2_VS_no_output1.Mode=Output Compare1 No Output
@ -541,6 +533,8 @@ VP_TIM3_VS_ControllerModeTrigger.Mode=Trigger Mode
VP_TIM3_VS_ControllerModeTrigger.Signal=TIM3_VS_ControllerModeTrigger VP_TIM3_VS_ControllerModeTrigger.Signal=TIM3_VS_ControllerModeTrigger
VP_TIM3_VS_OPM.Mode=OPM_bit VP_TIM3_VS_OPM.Mode=OPM_bit
VP_TIM3_VS_OPM.Signal=TIM3_VS_OPM VP_TIM3_VS_OPM.Signal=TIM3_VS_OPM
VP_TIM5_VS_ClockSourceINT.Mode=Internal
VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT
VP_TIM8_VS_ClockSourceINT.Mode=Internal VP_TIM8_VS_ClockSourceINT.Mode=Internal
VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT
board=custom board=custom