Симуляция генерации синусоидального шим и управление по модбас
note: - модбас не моделируется, в s-function просто передаются константы режимов. - лишние файлы убраны в outdate. - два канала одной фазы переключаются немного криво: на один такт симуляции проскакивает высокий уровень предыдущего канала и только потом включается текущий канал
This commit is contained in:
@@ -189,7 +189,7 @@ void Set_Log_Params(void)
|
||||
void Control_Timer_ReInit(TIM_SettingsTypeDef *stim)
|
||||
{
|
||||
TIM_Base_MspDeInit(&stim->htim);
|
||||
hpwm1.stim.sTickBaseMHz = TIMER_CTRL_TICKBASE;
|
||||
hpwm1.stim.sTickBaseMHz = PROJSET.TIM_CTRL_TICKBASE;
|
||||
TIM_Base_Init(stim);
|
||||
|
||||
HAL_TIM_Base_Start_IT(&stim->htim); // timer for sinus
|
||||
@@ -206,8 +206,8 @@ void Control_Timer_FirstInit(void)
|
||||
// tim settings
|
||||
TIM_CTRL.htim.Instance = TIM12;
|
||||
TIM_CTRL.sTimMode = TIM_IT_MODE;
|
||||
TIM_CTRL.sTickBaseMHz = TIMER_CTRL_TICKBASE;
|
||||
TIM_CTRL.sTimAHBFreqMHz = TIMER_CTRL_AHB_FREQ;
|
||||
TIM_CTRL.sTickBaseMHz = PROJSET.TIM_CTRL_TICKBASE;
|
||||
TIM_CTRL.sTimAHBFreqMHz = PROJSET.TIM_CTRL_AHB_FREQ;
|
||||
TIM_CTRL.sTimFreqHz = HZ_TIMER_CTRL;
|
||||
|
||||
TIM_Base_Init(&TIM_CTRL);
|
||||
@@ -233,6 +233,8 @@ void TIM8_BRK_TIM12_IRQHandler(void)
|
||||
Fill_Logs_with_Data();
|
||||
Update_Params_For_Log();
|
||||
Update_Params_For_PWM(&hpwm1);
|
||||
Trace_CTRL_TIM_Exit();
|
||||
|
||||
WriteSettingsToMem();
|
||||
|
||||
Trace_CTRL_TIM_Exit();
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
#ifndef __CONTROL_H_
|
||||
#define __CONTROL_H_
|
||||
|
||||
#include "modbus_data.h"
|
||||
#include "periph_general.h"
|
||||
#include "modbus.h"
|
||||
#include "math.h"
|
||||
#include "settings.h"
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
#ifndef __CONTROL_H_
|
||||
#define __CONTROL_H_
|
||||
|
||||
#include "modbus_data.h"
|
||||
#include "periph_general.h"
|
||||
#include "math.h"
|
||||
|
||||
#define M_PI 3.14159265358979323846 /* pi */
|
||||
|
||||
// defines for timers
|
||||
#define HZ_TIMER_CTRL 400
|
||||
#define HZ_TIMER_PWM 1000
|
||||
|
||||
|
||||
// defines for PWMs
|
||||
//#define INTERNAL_THREE_PHASE_PWM_ENABLE // pwm with timer in slave mode: time shift less than 1 period of PWM
|
||||
//#define SINE_THREE_PHASE_PWM_ENABLE // pwm sine with time shift
|
||||
|
||||
#define SIN_TABLE_SIZE_MAX HZ_TIMER_PWM
|
||||
|
||||
|
||||
// defines for filling arrays
|
||||
#define CALC_SAMPLES_PER_PERIOD(_hztim_, _hztarget_) (_hztim_/_hztarget_)
|
||||
//(TIM_CTRL.sTimFreq/PWM.PWM_Value)
|
||||
|
||||
// OR define samples
|
||||
//#define SAMPLES_PER_PERIOD 10
|
||||
//#define HZ_TIMER_CTRL (HZ_SINUS*SAMPLES_PER_PERIOD)
|
||||
|
||||
#define CALC_NUMB_OF_PERIODS(_arr_size_, _hztim_, _hztarget_) (_arr_size_/CALC_SAMPLES_PER_PERIOD(_hztim_, _hztarget_))
|
||||
//#define NUMB_OF_PERIODS (5)
|
||||
|
||||
#define CALC_ARR_SIZE(_numb_of_periods_, _samples_per_period_) ((_numb_of_periods_)*(_samples_per_period_))
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // __CONTROL_H_
|
||||
148
Code/PWM/pwm.c
148
Code/PWM/pwm.c
@@ -1,4 +1,5 @@
|
||||
#include "pwm.h"
|
||||
//#include "rng.h"
|
||||
|
||||
PWM_HandleTypeDef hpwm1;
|
||||
PWM_SlaveHandleTypeDef hpwm2;
|
||||
@@ -32,16 +33,16 @@ void PWM_Sine_FirstInit(void)
|
||||
hpwm1.sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||
|
||||
// tim1 settings
|
||||
hpwm1.stim.htim.Instance = TIMER_PWM_INSTANCE;
|
||||
hpwm1.stim.htim.Instance = TIMER_PWM1_INSTANCE;
|
||||
hpwm1.stim.sTimMode = TIM_IT_MODE;
|
||||
hpwm1.stim.sTickBaseMHz = TIMER_PWM_TICKBASE;
|
||||
hpwm1.stim.sTimAHBFreqMHz = TIMER_PWM_AHB_FREQ;
|
||||
hpwm1.stim.sTimFreqHz = HZ_TIMER_PWM;
|
||||
hpwm1.GPIOx = TIMER_PWM_GPIOx;
|
||||
hpwm1.GPIO_PIN_X1 = TIMER_PWM_GPIO_PIN_X1;
|
||||
hpwm1.GPIO_PIN_X2 = TIMER_PWM_GPIO_PIN_X2;
|
||||
hpwm1.PWM_Channel1 = TIMER_PWM_TIM_CHANNEL1;
|
||||
hpwm1.PWM_Channel2 = TIMER_PWM_TIM_CHANNEL2;
|
||||
hpwm1.stim.sTickBaseMHz = PROJSET.TIM_PWM_TICKBASE;
|
||||
hpwm1.stim.sTimAHBFreqMHz = PROJSET.TIM_PWM_AHB_FREQ;
|
||||
hpwm1.GPIOx = TIMER_PWM1_GPIOx;
|
||||
hpwm1.GPIO_PIN_X1 = PROJSET.TIM_PWM1_GPIO_PIN_X1;
|
||||
hpwm1.GPIO_PIN_X2 = PROJSET.TIM_PWM1_GPIO_PIN_X2;
|
||||
hpwm1.PWM_Channel1 = PROJSET.TIM_PWM1_TIM_CHANNEL1;
|
||||
hpwm1.PWM_Channel2 = PROJSET.TIM_PWM1_TIM_CHANNEL2;
|
||||
hpwm1.hpwm2 = (void *)&hpwm2;
|
||||
hpwm1.hpwm3 = (void *)&hpwm3;
|
||||
|
||||
@@ -53,22 +54,22 @@ void PWM_Sine_FirstInit(void)
|
||||
// PWM SLAVES INIT
|
||||
hpwm2.hMasterPWM = &hpwm1;
|
||||
hpwm2.stim = hpwm1.stim;
|
||||
hpwm2.stim.htim.Instance = TIMER_PWM2_INSTANCE;
|
||||
hpwm2.GPIOx = TIMER_PWM2_GPIOx;
|
||||
hpwm2.GPIO_PIN_X1 = TIMER_PWM2_GPIO_PIN_X1;
|
||||
hpwm2.GPIO_PIN_X2 = TIMER_PWM2_GPIO_PIN_X2;
|
||||
hpwm2.PWM_Channel1 = TIMER_PWM2_TIM_CHANNEL1;
|
||||
hpwm2.PWM_Channel2 = TIMER_PWM2_TIM_CHANNEL2;
|
||||
hpwm2.stim.htim.Instance = (TIM_TypeDef *)PROJSET.TIM_PWM2_INSTANCE;
|
||||
hpwm2.GPIOx = (GPIO_TypeDef *)PROJSET.TIM_PWM2_GPIOx;
|
||||
hpwm2.GPIO_PIN_X1 = PROJSET.TIM_PWM2_GPIO_PIN_X1;
|
||||
hpwm2.GPIO_PIN_X2 = PROJSET.TIM_PWM2_GPIO_PIN_X2;
|
||||
hpwm2.PWM_Channel1 = PROJSET.TIM_PWM2_TIM_CHANNEL1;
|
||||
hpwm2.PWM_Channel2 = PROJSET.TIM_PWM2_TIM_CHANNEL2;
|
||||
hpwm2.Duty_Shift_Ratio = (float)2/3;
|
||||
|
||||
hpwm3.hMasterPWM = &hpwm1;
|
||||
hpwm3.stim = hpwm1.stim;
|
||||
hpwm3.stim.htim.Instance = TIMER_PWM3_INSTANCE;
|
||||
hpwm3.GPIOx = TIMER_PWM3_GPIOx;
|
||||
hpwm3.GPIO_PIN_X1 = TIMER_PWM3_GPIO_PIN_X1;
|
||||
hpwm3.GPIO_PIN_X2 = TIMER_PWM3_GPIO_PIN_X2;
|
||||
hpwm3.PWM_Channel1 = TIMER_PWM3_TIM_CHANNEL1;
|
||||
hpwm3.PWM_Channel2 = TIMER_PWM3_TIM_CHANNEL2;
|
||||
hpwm3.stim.htim.Instance = (TIM_TypeDef *)PROJSET.TIM_PWM3_INSTANCE;
|
||||
hpwm3.GPIOx = (GPIO_TypeDef *)PROJSET.TIM_PWM3_GPIOx;
|
||||
hpwm3.GPIO_PIN_X1 = PROJSET.TIM_PWM3_GPIO_PIN_X1;
|
||||
hpwm3.GPIO_PIN_X2 = PROJSET.TIM_PWM3_GPIO_PIN_X2;
|
||||
hpwm3.PWM_Channel1 = PROJSET.TIM_PWM3_TIM_CHANNEL1;
|
||||
hpwm3.PWM_Channel2 = PROJSET.TIM_PWM3_TIM_CHANNEL2;
|
||||
hpwm3.Duty_Shift_Ratio = (float)-2/3;
|
||||
|
||||
PWM_SlavePhase_Init(&hpwm2);
|
||||
@@ -116,13 +117,13 @@ void PWM_Handler(PWM_HandleTypeDef *hpwm)
|
||||
|
||||
if(Duty >= 0)
|
||||
{
|
||||
PWM_Set_Compare1(hpwm, Duty+PWM_Sine_Calc_Min_Duty(hpwm)); // set first channel
|
||||
PWM_Set_Compare1(hpwm, Duty); // set first channel
|
||||
PWM_Set_Compare2(hpwm, 0); // reset second channel
|
||||
}
|
||||
else // если это вторая полуволна
|
||||
{
|
||||
PWM_Set_Compare1(hpwm, 0); // reset first channel
|
||||
PWM_Set_Compare2(hpwm, (-Duty)+PWM_Sine_Calc_Min_Duty(hpwm)); // set second channel
|
||||
PWM_Set_Compare2(hpwm, -Duty); // set second channel
|
||||
}
|
||||
|
||||
PWM_SlavePhase_Set_DutyTable_Signed(PWM_Set_pSlaveHandle(hpwm,hpwm2), sin_ind);
|
||||
@@ -147,30 +148,53 @@ void PWM_Handler(PWM_HandleTypeDef *hpwm)
|
||||
PWM_Set_Compare2(PWM_Set_pSlaveHandle(hpwm,hpwm2), 0); // reset second channel
|
||||
PWM_Set_Compare1(PWM_Set_pSlaveHandle(hpwm,hpwm3), 0); // reset first channel
|
||||
PWM_Set_Compare2(PWM_Set_pSlaveHandle(hpwm,hpwm3), 0); // reset second channel
|
||||
// uint32_t pwm_rng = 0;
|
||||
// HAL_RNG_GenerateRandomNumber(&hrng, &pwm_rng);
|
||||
// pwm_rng = ((pwm_rng&0xFFFF)/(0xFFFF/PWM_Get_Autoreload(hpwm)))/((float)100/hpwm->PWM_Value);
|
||||
// if (pwm_rng < PWM_Calc_Min_Duty(hpwm))
|
||||
// pwm_rng = PWM_Calc_Min_Duty(hpwm);
|
||||
// if second channel enabled
|
||||
if(PWM_Get_Mode(hpwm, PWM_CH_MODE))
|
||||
{
|
||||
PWM_Set_Compare1(hpwm, 0); // reset first channel
|
||||
PWM_Set_Compare1(hpwm, 0); // reset first channel
|
||||
PWM_Set_Duty_From_Percent(hpwm, hpwm->PWM_Channel2); // set second channel
|
||||
// __HAL_TIM_SET_COMPARE(&(hpwm->stim.htim), TIM_CHANNEL_2, pwm_rng); // set second channel
|
||||
}
|
||||
// if first channel enabled
|
||||
else
|
||||
{
|
||||
// __HAL_TIM_SET_COMPARE(&(hpwm->stim.htim), TIM_CHANNEL_1, pwm_rng); // set second channel
|
||||
PWM_Set_Duty_From_Percent(hpwm, hpwm->PWM_Channel1); // set first channel
|
||||
PWM_Set_Compare2(hpwm, 0); // reset second channel
|
||||
}
|
||||
}
|
||||
|
||||
//-----CHECK CHANNELS FOR ERRORS-----
|
||||
uint16_t min_duty = PWM_Calc_Min_Duty(hpwm);
|
||||
// IF FIRST CHANNEL IS ACRIVE
|
||||
if(PWM_Get_Compare1(hpwm) != 0)
|
||||
{
|
||||
// Duty shoud be bigger or equeal than min duration
|
||||
if (PWM_Get_Compare1(hpwm)<min_duty)
|
||||
PWM_Set_Compare1(hpwm, min_duty);
|
||||
// Duty shoud be less or equeal than ARR-min duration
|
||||
if (PWM_Get_Compare1(hpwm)>PWM_Get_Autoreload(hpwm)-min_duty)
|
||||
PWM_Set_Compare1(hpwm, PWM_Get_Autoreload(hpwm)-min_duty);
|
||||
}
|
||||
// IF SECOND CHANNEL IS ACRIVE
|
||||
else if(PWM_Get_Compare2(hpwm) != 0)
|
||||
{
|
||||
// Duty shoud be bigger or equeal than min duration
|
||||
if (PWM_Get_Compare2(hpwm)<min_duty)
|
||||
PWM_Set_Compare2(hpwm, min_duty);
|
||||
// Duty shoud be less or equeal than ARR
|
||||
if (PWM_Get_Compare1(hpwm)>PWM_Get_Autoreload(hpwm))
|
||||
PWM_Set_Compare1(hpwm, PWM_Get_Autoreload(hpwm));
|
||||
// Duty shoud be less or equeal than ARR
|
||||
if (PWM_Get_Compare2(hpwm)>PWM_Get_Autoreload(hpwm))
|
||||
PWM_Set_Compare2(hpwm, PWM_Get_Autoreload(hpwm));
|
||||
// Only one channel shoud be active
|
||||
if (PWM_Get_Compare2(hpwm)>PWM_Get_Autoreload(hpwm)-min_duty)
|
||||
PWM_Set_Compare2(hpwm, PWM_Get_Autoreload(hpwm)-min_duty);
|
||||
}
|
||||
// IF BOTH CHANNEL IS ACRIVE
|
||||
if((PWM_Get_Compare1(hpwm) != 0) && (PWM_Get_Compare2(hpwm) != 0))
|
||||
{
|
||||
// Only one channel shoud be active so disable all
|
||||
PWM_Set_Compare1(hpwm, 0);
|
||||
PWM_Set_Compare2(hpwm, 0);
|
||||
}
|
||||
@@ -546,14 +570,16 @@ void PWM_SlavePhase_Set_DutyTable_Signed(PWM_SlaveHandleTypeDef *hspwm, uint16_t
|
||||
// если это первая полуволна
|
||||
if(Duty > 0)
|
||||
{
|
||||
PWM_Set_Compare1(hspwm, Duty+PWM_Sine_Calc_Min_Duty(hspwm->hMasterPWM)); // set first channel
|
||||
PWM_Set_Compare1(hspwm, Duty+PWM_Calc_Min_Duty(hspwm->hMasterPWM)); // set first channel
|
||||
PWM_Set_Compare2(hspwm, 0); // reset second channel
|
||||
}
|
||||
else // если это вторая полуволна
|
||||
{
|
||||
PWM_Set_Compare1(hspwm, 0); // reset first channel
|
||||
PWM_Set_Compare2(hspwm, (-Duty)+PWM_Sine_Calc_Min_Duty(hspwm->hMasterPWM)); // set second channel
|
||||
PWM_Set_Compare2(hspwm, (-Duty)+PWM_Calc_Min_Duty(hspwm->hMasterPWM)); // set second channel
|
||||
}
|
||||
//if(hspwm == &hpwm2)
|
||||
//__ASM("");
|
||||
}
|
||||
else // if three phase disabled
|
||||
{
|
||||
@@ -574,20 +600,34 @@ void PWM_SlavePhase_Check_Channels(PWM_SlaveHandleTypeDef *hspwm)
|
||||
// if three phase enables
|
||||
if (PWM_Get_Mode(hspwm->hMasterPWM, PWM_PHASE_MODE))
|
||||
{
|
||||
uint16_t min_duty = PWM_Calc_Min_Duty(hspwm->hMasterPWM);
|
||||
// IF FIRST CHANNEL IS ACRIVE
|
||||
if(PWM_Get_Compare1(hspwm) != 0)
|
||||
{
|
||||
// Duty shoud be bigger or equeal than min duration
|
||||
if (PWM_Get_Compare1(hspwm)<min_duty)
|
||||
PWM_Set_Compare1(hspwm, min_duty);
|
||||
// Duty shoud be less or equeal than ARR-min duration
|
||||
if (PWM_Get_Compare1(hspwm)>PWM_Get_Autoreload(hspwm)-min_duty)
|
||||
PWM_Set_Compare1(hspwm, PWM_Get_Autoreload(hspwm)-min_duty);
|
||||
}
|
||||
// IF SECOND CHANNEL IS ACRIVE
|
||||
else if(PWM_Get_Compare2(hspwm) != 0)
|
||||
// Duty shoud be bigger or equeal than min duration
|
||||
if (PWM_Get_Compare2(hspwm)<min_duty)
|
||||
PWM_Set_Compare2(hspwm, min_duty);
|
||||
// Duty shoud be less or equeal than ARR
|
||||
if (PWM_Get_Compare1(hspwm)>PWM_Get_Autoreload(hspwm))
|
||||
PWM_Set_Compare1(hspwm, PWM_Get_Autoreload(hspwm));
|
||||
// Duty shoud be less or equeal than ARR
|
||||
if (PWM_Get_Compare2(hspwm)>PWM_Get_Autoreload(hspwm))
|
||||
PWM_Set_Compare2(hspwm, PWM_Get_Autoreload(hspwm));
|
||||
// Only one channel shoud be active
|
||||
if (PWM_Get_Compare2(hspwm)>PWM_Get_Autoreload(hspwm)-min_duty)
|
||||
PWM_Set_Compare2(hspwm, PWM_Get_Autoreload(hspwm)-min_duty);
|
||||
// IF BOTH CHANNEL IS ACRIVE
|
||||
if((PWM_Get_Compare1(hspwm) != 0) && (PWM_Get_Compare2(hspwm) != 0))
|
||||
{ // reset channels
|
||||
PWM_Set_Compare1(hspwm, 0); // reset first channel
|
||||
PWM_Set_Compare2(hspwm, 0); // reset second channel
|
||||
{
|
||||
// Only one channel shoud be active so disable all
|
||||
PWM_Set_Compare1(hspwm, 0);
|
||||
PWM_Set_Compare2(hspwm, 0);
|
||||
}
|
||||
}
|
||||
else // if three phase disabled
|
||||
else
|
||||
{
|
||||
// reset channels
|
||||
PWM_Set_Compare1(hspwm, 0); // reset first channel
|
||||
@@ -631,7 +671,31 @@ void PWM_SlavePhase_CreateDeadTime(PWM_SlaveHandleTypeDef *hspwm, float *LocalDe
|
||||
//-------------------------------------------------------------------
|
||||
//------------------------HANDLERS FUNCTIONS-------------------------
|
||||
//---------------PWM TIMER-----------------
|
||||
#if (PWM_MASTER_TIM_NUMB == 1) || (PWM_MASTER_TIM_NUMB == 10) // choose handler for TIM
|
||||
void TIM1_UP_TIM10_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 2)
|
||||
void TIM2_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 3)
|
||||
void TIM3_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 4)
|
||||
void TIM4_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 5)
|
||||
void TIM5_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 6)
|
||||
void TIM6_DAC_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 7)
|
||||
void TIM7_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 8) || (PWM_MASTER_TIM_NUMB == 13)
|
||||
void TIM8_UP_TIM13_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 1) || (PWM_MASTER_TIM_NUMB == 9)
|
||||
void TIM1_BRK_TIM9_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 1) || (PWM_MASTER_TIM_NUMB == 11)
|
||||
void TIM1_TRG_COM_TIM11_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 8) || (PWM_MASTER_TIM_NUMB == 12)
|
||||
void TIM8_BRK_TIM12_IRQHandler(void)
|
||||
#elif (PWM_MASTER_TIM_NUMB == 8) || (PWM_MASTER_TIM_NUMB == 14)
|
||||
void TIM8_TRG_COM_TIM14_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
Trace_PWM_TIM_Enter();
|
||||
HAL_TIM_IRQHandler(&hpwm1.stim.htim);
|
||||
@@ -668,7 +732,7 @@ void PWM_SineSingChannel_FirstInit(void)
|
||||
hpwm1.sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
||||
|
||||
// tim1 settings
|
||||
hpwm1.stim.htim.Instance = TIMER_PWM_INSTANCE;
|
||||
hpwm1.stim.htim.Instance = TIMER_PWM1_INSTANCE;
|
||||
hpwm1.stim.sTimMode = TIM_IT_MODE;
|
||||
hpwm1.stim.sTickBaseMHz = TIM_TickBase_1US;
|
||||
hpwm1.stim.sTimAHBFreqMHz = 72;
|
||||
|
||||
@@ -23,7 +23,7 @@ extern uint32_t sin_table[SIN_TABLE_SIZE_MAX];
|
||||
* @param _hpwm_ - указатель на хендл pwm.
|
||||
* @return _val_ - количество тиков кратчайшего импульса.
|
||||
*/
|
||||
#define PWM_Sine_Calc_Min_Duty(_hpwm_) ((_hpwm_)->PWM_MinPulseDur/(_hpwm_)->stim.sTickBaseMHz)
|
||||
#define PWM_Calc_Min_Duty(_hpwm_) ((_hpwm_)->PWM_MinPulseDur/(_hpwm_)->stim.sTickBaseMHz)
|
||||
/**
|
||||
* @brief Calc Scale Koef for Table & AUTORELOAD REGISTER
|
||||
* @param _hpwm_ - указатель на хендл pwm.
|
||||
@@ -34,7 +34,7 @@ extern uint32_t sin_table[SIN_TABLE_SIZE_MAX];
|
||||
* @note Если задана минимальная длительность импульса в тактах n, она вычитается из ARR: [0, ARR-2*n]
|
||||
И потом регистр ARR заполняется так, что диапазон его значений будет [n, ARR-n] @ref PWM_Get_Table_Element_Unsigned
|
||||
*/
|
||||
#define PWM_Calc_Duty_Scale(_hpwm_, _scale_) ((float)PWM_Get_Autoreload(_hpwm_)-2*PWM_Sine_Calc_Min_Duty(_hpwm_))/(_scale_)
|
||||
#define PWM_Calc_Duty_Scale(_hpwm_, _scale_) ((float)PWM_Get_Autoreload(_hpwm_))/(_scale_)
|
||||
|
||||
/**
|
||||
* @brief Get Table Element Scaled corresponding to TIM ARR register
|
||||
@@ -44,7 +44,7 @@ extern uint32_t sin_table[SIN_TABLE_SIZE_MAX];
|
||||
* @note Если задана минимальная длительность импульса в тактах n,
|
||||
то регистр ARR заполняется так, что диапазон его значений будет [n, ARR-n]
|
||||
*/
|
||||
#define PWM_Get_Table_Element_Unsigned(_hpwm_,_ind_) ((*((_hpwm_)->pDuty_Table_Origin+_ind_)*((_hpwm_)->Duty_Table_Scale))+PWM_Sine_Calc_Min_Duty(_hpwm_))
|
||||
#define PWM_Get_Table_Element_Unsigned(_hpwm_,_ind_) (*((_hpwm_)->pDuty_Table_Origin+_ind_)*((_hpwm_)->Duty_Table_Scale))
|
||||
|
||||
/**
|
||||
* @brief Get Table Element Scaled and Shifted corresponding to TIM ARR register
|
||||
@@ -208,7 +208,6 @@ typedef struct // PWM_SlaveHandleTypeDef
|
||||
extern PWM_SlaveHandleTypeDef hpwm2;
|
||||
extern PWM_SlaveHandleTypeDef hpwm3;
|
||||
|
||||
|
||||
//--------------------------------PWM FUNCTIONS----------------------------------
|
||||
/**
|
||||
* @brief reInitialization of PWM TIM.
|
||||
|
||||
265
Code/PWM/settings.c
Normal file
265
Code/PWM/settings.c
Normal file
@@ -0,0 +1,265 @@
|
||||
#include "control.h"
|
||||
ProjectSettings_TypeDef PROJSET;
|
||||
uint32_t PageError = 0x00;
|
||||
uint8_t UpdateSettings = 0;
|
||||
|
||||
void WriteSettingsToMem(void)
|
||||
{
|
||||
FillStructWithDefines();
|
||||
//HAL_FLASH_Unlock();
|
||||
//
|
||||
//CheckSettingsInFLASH();
|
||||
//
|
||||
//if(CheckIsSettingsValid(&PROJSET)) // if new settings are invalid
|
||||
// PROJSET = *PROJSET_MEM; // take the old settings from mem
|
||||
//else // if new settings are valid
|
||||
// SetFlagUpdateSettingsInMem(); // save the new settings in mem (set flag to do this)
|
||||
//
|
||||
//HAL_FLASH_Lock();
|
||||
|
||||
}
|
||||
|
||||
void SetFlagUpdateSettingsInMem(void)
|
||||
{
|
||||
//UpdateSettings = 0;
|
||||
//// MODBUS settings
|
||||
//if(PROJSET_MEM->MB_DEVICE_ID != PROJSET.MB_DEVICE_ID)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->MB_SPEED != PROJSET.MB_SPEED)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->MB_GPIOX != PROJSET.MB_GPIOX)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->MB_GPIO_PIN_RX != PROJSET.MB_GPIO_PIN_RX)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->MB_GPIO_PIN_RX != PROJSET.MB_GPIO_PIN_RX)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->MB_MAX_TIMEOUT != PROJSET.MB_MAX_TIMEOUT)
|
||||
// UpdateSettings = 1;
|
||||
//
|
||||
//// PWM settings
|
||||
//if(PROJSET_MEM->TIM_PWM_TICKBASE != PROJSET.TIM_PWM_TICKBASE)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM_AHB_FREQ != PROJSET.TIM_PWM_AHB_FREQ)
|
||||
// UpdateSettings = 1;
|
||||
//
|
||||
//if(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL1 != PROJSET.TIM_PWM1_TIM_CHANNEL1)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL2 != PROJSET.TIM_PWM1_TIM_CHANNEL2)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM1_GPIOx != PROJSET.TIM_PWM1_GPIOx)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X1 != PROJSET.TIM_PWM1_GPIO_PIN_X1)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X2 != PROJSET.TIM_PWM1_GPIO_PIN_X2)
|
||||
// UpdateSettings = 1;
|
||||
//
|
||||
//if(PROJSET_MEM->TIM_PWM2_INSTANCE != PROJSET.TIM_PWM2_INSTANCE)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL1 != PROJSET.TIM_PWM2_TIM_CHANNEL1)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL2 != PROJSET.TIM_PWM2_TIM_CHANNEL2)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM2_GPIOx != PROJSET.TIM_PWM2_GPIOx)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X1 != PROJSET.TIM_PWM2_GPIO_PIN_X1)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X2 != PROJSET.TIM_PWM2_GPIO_PIN_X2)
|
||||
// UpdateSettings = 1;
|
||||
//
|
||||
//if(PROJSET_MEM->TIM_PWM3_INSTANCE != PROJSET.TIM_PWM3_INSTANCE)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL1 != PROJSET.TIM_PWM3_TIM_CHANNEL1)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL2 != PROJSET.TIM_PWM3_TIM_CHANNEL2)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM3_GPIOx != PROJSET.TIM_PWM3_GPIOx)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X1 != PROJSET.TIM_PWM3_GPIO_PIN_X1)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X2 != PROJSET.TIM_PWM3_GPIO_PIN_X2)
|
||||
// UpdateSettings = 1;
|
||||
//
|
||||
//// CTRL settings
|
||||
//if(PROJSET_MEM->TIM_CTRL_TICKBASE != PROJSET.TIM_CTRL_TICKBASE)
|
||||
// UpdateSettings = 1;
|
||||
//if(PROJSET_MEM->TIM_CTRL_AHB_FREQ != PROJSET.TIM_CTRL_AHB_FREQ)
|
||||
// UpdateSettings = 1;
|
||||
}
|
||||
|
||||
|
||||
void UpdateSettingsInMem(void)
|
||||
{
|
||||
//if(UpdateSettings)
|
||||
//{
|
||||
// FLASH_EraseInitTypeDef EraseInitStruct;
|
||||
// PageError = 0x00;
|
||||
//
|
||||
// EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages
|
||||
// EraseInitStruct.Banks = FLASH_BANK_1;
|
||||
// EraseInitStruct.Sector = FLASH_SECTOR_4; //first sector for erase
|
||||
// EraseInitStruct.NbSectors = 1;// num of sector that need to be erased
|
||||
//
|
||||
// HAL_FLASH_Unlock();
|
||||
// HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
|
||||
//
|
||||
//
|
||||
// /* Wait for last operation to be completed */
|
||||
// if(FLASH_WaitForLastOperation((uint32_t)50000U) == HAL_OK)
|
||||
// {
|
||||
// /* If the previous operation is completed, proceed to program the new data */
|
||||
// CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
|
||||
// FLASH->CR |= FLASH_PSIZE_WORD;
|
||||
// FLASH->CR |= FLASH_CR_PG;
|
||||
// *PROJSET_MEM = PROJSET; // save the new settings in mem
|
||||
// }
|
||||
// HAL_FLASH_Lock();
|
||||
// UpdateSettings = 0;
|
||||
//}
|
||||
}
|
||||
|
||||
void FillSettingsWithDefines(void)
|
||||
{
|
||||
// rewrite all setting corresponding to defines
|
||||
|
||||
//FLASH_EraseInitTypeDef EraseInitStruct;
|
||||
//PageError = 0x00;
|
||||
//
|
||||
//EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages
|
||||
//EraseInitStruct.Banks = FLASH_BANK_1;
|
||||
//EraseInitStruct.Sector = FLASH_SECTOR_4; //first sector for erase
|
||||
//EraseInitStruct.NbSectors = 1;// num of sector that need to be erased
|
||||
//
|
||||
//HAL_FLASH_Unlock();
|
||||
//HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
|
||||
//// MODBUS settings
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_DEVICE_ID, MODBUS_DEVICE_ID);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_SPEED, MODBUS_SPEED);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIOX, (uint32_t)MODBUS_GPIOX);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIO_PIN_RX, MODBUS_GPIO_PIN_RX);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIO_PIN_TX, MODBUS_GPIO_PIN_TX);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_MAX_TIMEOUT, MODBUS_MAX_TIMEOUT);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_TIM_AHB_FREQ, MODBUS_TIM_AHB_FREQ);
|
||||
//
|
||||
//// PWM settings
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM_TICKBASE, TIMER_PWM_TICKBASE);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM_AHB_FREQ, TIMER_PWM_AHB_FREQ);
|
||||
//
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL1, TIMER_PWM1_TIM_CHANNEL1);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL2, TIMER_PWM1_TIM_CHANNEL2);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIOx, (uint32_t)TIMER_PWM1_GPIOx);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X1, TIMER_PWM1_GPIO_PIN_X1);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X2, TIMER_PWM1_GPIO_PIN_X2);
|
||||
//
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_INSTANCE, (uint32_t)TIMER_PWM2_INSTANCE);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL1, TIMER_PWM2_TIM_CHANNEL1);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL2, TIMER_PWM2_TIM_CHANNEL2);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIOx, (uint32_t)TIMER_PWM2_GPIOx);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X1, TIMER_PWM2_GPIO_PIN_X1);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X2, TIMER_PWM2_GPIO_PIN_X2);
|
||||
//
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_INSTANCE, (uint32_t)TIMER_PWM3_INSTANCE);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL1, TIMER_PWM3_TIM_CHANNEL1);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL2, TIMER_PWM3_TIM_CHANNEL2);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIOx, (uint32_t)TIMER_PWM3_GPIOx);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X1, TIMER_PWM3_GPIO_PIN_X1);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X2, TIMER_PWM3_GPIO_PIN_X2);
|
||||
//
|
||||
//// CTRL settings
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_CTRL_TICKBASE, TIMER_CTRL_TICKBASE);
|
||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_CTRL_AHB_FREQ, TIMER_CTRL_AHB_FREQ);
|
||||
//HAL_FLASH_Lock();
|
||||
|
||||
}
|
||||
|
||||
void FillStructWithDefines(void)
|
||||
{
|
||||
// rewrite all setting corresponding to defines
|
||||
|
||||
|
||||
// MODBUS settings
|
||||
STRUCT_WRITE_SETTING(PROJSET.MB_DEVICE_ID, MODBUS_DEVICE_ID);
|
||||
STRUCT_WRITE_SETTING(PROJSET.MB_SPEED, MODBUS_SPEED);
|
||||
STRUCT_WRITE_SETTING(PROJSET.MB_GPIOX, MODBUS_GPIOX);
|
||||
STRUCT_WRITE_SETTING(PROJSET.MB_GPIO_PIN_RX, MODBUS_GPIO_PIN_RX);
|
||||
STRUCT_WRITE_SETTING(PROJSET.MB_GPIO_PIN_TX, MODBUS_GPIO_PIN_TX);
|
||||
STRUCT_WRITE_SETTING(PROJSET.MB_MAX_TIMEOUT, MODBUS_MAX_TIMEOUT);
|
||||
STRUCT_WRITE_SETTING(PROJSET.MB_TIM_AHB_FREQ, MODBUS_TIM_AHB_FREQ);
|
||||
|
||||
// PWM settings
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM_TICKBASE, TIMER_PWM_TICKBASE);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM_AHB_FREQ, TIMER_PWM_AHB_FREQ);
|
||||
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_TIM_CHANNEL1, TIMER_PWM1_TIM_CHANNEL1);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_TIM_CHANNEL2, TIMER_PWM1_TIM_CHANNEL2);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_GPIOx, TIMER_PWM1_GPIOx);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_GPIO_PIN_X1, TIMER_PWM1_GPIO_PIN_X1);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_GPIO_PIN_X2, TIMER_PWM1_GPIO_PIN_X2);
|
||||
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_INSTANCE, TIMER_PWM2_INSTANCE);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_TIM_CHANNEL1, TIMER_PWM2_TIM_CHANNEL1);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_TIM_CHANNEL2, TIMER_PWM2_TIM_CHANNEL2);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_GPIOx, TIMER_PWM2_GPIOx);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_GPIO_PIN_X1, TIMER_PWM2_GPIO_PIN_X1);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_GPIO_PIN_X2, TIMER_PWM2_GPIO_PIN_X2);
|
||||
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_INSTANCE, TIMER_PWM3_INSTANCE);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_TIM_CHANNEL1, TIMER_PWM3_TIM_CHANNEL1);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_TIM_CHANNEL2, TIMER_PWM3_TIM_CHANNEL2);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_GPIOx, TIMER_PWM3_GPIOx);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_GPIO_PIN_X1, TIMER_PWM3_GPIO_PIN_X1);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_GPIO_PIN_X2, TIMER_PWM3_GPIO_PIN_X2);
|
||||
|
||||
// CTRL settings
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_CTRL_TICKBASE, TIMER_CTRL_TICKBASE);
|
||||
STRUCT_WRITE_SETTING(PROJSET.TIM_CTRL_AHB_FREQ, TIMER_CTRL_AHB_FREQ);
|
||||
|
||||
}
|
||||
void CheckSettingsInFLASH(void)
|
||||
{
|
||||
//if(CheckIsSettingsValid(PROJSET_MEM))
|
||||
// FillSettingsWithDefines();
|
||||
//
|
||||
//PROJSET = *PROJSET_MEM;
|
||||
}
|
||||
int CheckIsSettingsValid(ProjectSettings_TypeDef *set_struct)
|
||||
{
|
||||
// if some of setting are missing
|
||||
// chech MODBUS
|
||||
if((!IS_UART_BAUDRATE(set_struct->MB_SPEED) || (set_struct->MB_SPEED ) == 0) ||
|
||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->MB_GPIOX)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->MB_GPIO_PIN_TX)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->MB_GPIO_PIN_RX)) ||
|
||||
((set_struct->MB_TIM_AHB_FREQ) == 0))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
// chech control tim
|
||||
if((set_struct->TIM_CTRL_AHB_FREQ) == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
// chech PWM tims
|
||||
if((set_struct->TIM_PWM_AHB_FREQ) == 0 ||
|
||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIOx)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIO_PIN_X1)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIO_PIN_X2)) ||
|
||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM1_TIM_CHANNEL1)) ||
|
||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM1_TIM_CHANNEL2)) ||
|
||||
(!IS_TIM_INSTANCE((TIM_TypeDef *)set_struct->TIM_PWM2_INSTANCE)) ||
|
||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIOx)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIO_PIN_X1)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIO_PIN_X2)) ||
|
||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM2_TIM_CHANNEL1)) ||
|
||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM2_TIM_CHANNEL2)) ||
|
||||
(!IS_TIM_INSTANCE((TIM_TypeDef *)set_struct->TIM_PWM3_INSTANCE)) ||
|
||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIOx)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIO_PIN_X1)) ||
|
||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIO_PIN_X2)) ||
|
||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM3_TIM_CHANNEL1)) ||
|
||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM3_TIM_CHANNEL2)))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,17 +1,44 @@
|
||||
/********************************MODBUS*************************************
|
||||
Данный файл содержит объявления базовых функции и дефайны для реализации
|
||||
MODBUS.
|
||||
Данный файл необходимо подключить в rs_message.h. После подключать rs_message.h
|
||||
к основному проекту.
|
||||
***************************************************************************/
|
||||
#ifndef __PROJ_SETTINGS_H_
|
||||
#define __PROJ_SETTINGS_H_
|
||||
|
||||
#include "stm32f4xx_hal.h"
|
||||
//--------DEFINES FOR SETTING OF SETTINGS-----------
|
||||
#define SETTINGS_FLASH_ADDRESS_SHIFT (0x10000)
|
||||
#define SETTINGS_FLASH_ADDRESS (FLASH_BASE + SETTINGS_FLASH_ADDRESS_SHIFT)
|
||||
|
||||
#define EEPROM_BASE
|
||||
#define SETTINGS_EEPROM_ADDRESS_SHIFT
|
||||
#define SETTINGS_EEPROM_ADDRESS (EEPROM_BASE + SETTINGS_EEPROM_ADDRESS_SHIFT)
|
||||
|
||||
#ifdef USE_EEPROM
|
||||
#define SETTINGS_ADDRESS SETTINGS_EEPROM_ADDRESS
|
||||
#else // USE_EEPROM
|
||||
#define SETTINGS_ADDRESS (SETTINGS_FLASH_ADDRESS)
|
||||
#endif // USE_EEPROM
|
||||
//--------------------------------------------------
|
||||
//------------DEFINES FOR PWM SETTING---------------
|
||||
// settings defines
|
||||
#define HZ_TIMER_CTRL 400
|
||||
#define HZ_TIMER_PWM 1000
|
||||
|
||||
|
||||
// TIM PWM1 SETTINGS
|
||||
#define TIMER_PWM_INSTANCE TIM4
|
||||
#define PWM_MASTER_TIM_NUMB 4
|
||||
#define TIMER_PWM_TICKBASE TIM_TickBase_1US
|
||||
#define TIMER_PWM_AHB_FREQ 72
|
||||
#define TIMER_PWM_TIM_CHANNEL1 TIM_CHANNEL_1
|
||||
#define TIMER_PWM_TIM_CHANNEL2 TIM_CHANNEL_2
|
||||
#define TIMER_PWM_GPIOx GPIOD
|
||||
#define TIMER_PWM_GPIO_PIN_X1 GPIO_PIN_12
|
||||
#define TIMER_PWM_GPIO_PIN_X2 GPIO_PIN_13
|
||||
|
||||
#define TIMER_PWM1_INSTANCE TIM4
|
||||
#define TIMER_PWM1_TIM_CHANNEL1 TIM_CHANNEL_1
|
||||
#define TIMER_PWM1_TIM_CHANNEL2 TIM_CHANNEL_2
|
||||
#define TIMER_PWM1_GPIOx GPIOD
|
||||
#define TIMER_PWM1_GPIO_PIN_X1 GPIO_PIN_12
|
||||
#define TIMER_PWM1_GPIO_PIN_X2 GPIO_PIN_13
|
||||
|
||||
|
||||
|
||||
@@ -39,4 +66,86 @@
|
||||
|
||||
// PWM SETTINGS
|
||||
#define SIN_TABLE_ORIGIN sin_table
|
||||
#define SIN_TABLE_SIZE_MAX 1000
|
||||
#define SIN_TABLE_SIZE_MAX 1000
|
||||
//--------------------------------------------------
|
||||
|
||||
//----------DEFINES FOR MODBUS SETTING--------------
|
||||
#define MODBUS_UART_NUMB 3 // number of used uart
|
||||
#define MODBUS_SPEED 115200
|
||||
#define MODBUS_GPIOX GPIOB
|
||||
#define MODBUS_GPIO_PIN_RX GPIO_PIN_11
|
||||
#define MODBUS_GPIO_PIN_TX GPIO_PIN_10
|
||||
/* accord to this define sets define USED_MB_UART = USARTx */
|
||||
#define MODBUS_TIM_NUMB 7 // number of used uart
|
||||
#define MODBUS_TIM_AHB_FREQ 72
|
||||
/* accord to this define sets define USED_MB_TIM = TIMx */
|
||||
|
||||
/* defines for modbus behaviour */
|
||||
#define MODBUS_DEVICE_ID 1 // number of used uart
|
||||
#define MODBUS_MAX_TIMEOUT 5000 // is ms
|
||||
// custom define for size of receive message
|
||||
//--------------------------------------------------
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// ctrl periph settings
|
||||
uint64_t TIM_CTRL_TICKBASE;
|
||||
uint64_t TIM_CTRL_AHB_FREQ;
|
||||
// pwm peripth settings
|
||||
uint64_t TIM_PWM_TICKBASE;
|
||||
uint64_t TIM_PWM_AHB_FREQ;
|
||||
|
||||
// uint64_t TIM_PWM1_INSTANCE;
|
||||
uint64_t TIM_PWM1_TIM_CHANNEL1;
|
||||
uint64_t TIM_PWM1_TIM_CHANNEL2;
|
||||
uint64_t TIM_PWM1_GPIOx;
|
||||
uint64_t TIM_PWM1_GPIO_PIN_X1;
|
||||
uint64_t TIM_PWM1_GPIO_PIN_X2;
|
||||
|
||||
uint64_t TIM_PWM2_INSTANCE;
|
||||
uint64_t TIM_PWM2_TIM_CHANNEL1;
|
||||
uint64_t TIM_PWM2_TIM_CHANNEL2;
|
||||
uint64_t TIM_PWM2_GPIOx;
|
||||
uint64_t TIM_PWM2_GPIO_PIN_X1;
|
||||
uint64_t TIM_PWM2_GPIO_PIN_X2;
|
||||
|
||||
uint64_t TIM_PWM3_INSTANCE;
|
||||
uint64_t TIM_PWM3_TIM_CHANNEL1;
|
||||
uint64_t TIM_PWM3_TIM_CHANNEL2;
|
||||
uint64_t TIM_PWM3_GPIOx;
|
||||
uint64_t TIM_PWM3_GPIO_PIN_X1;
|
||||
uint64_t TIM_PWM3_GPIO_PIN_X2;
|
||||
|
||||
|
||||
// modbus peripth settings
|
||||
uint64_t MB_DEVICE_ID;
|
||||
uint64_t MB_SPEED;
|
||||
uint64_t MB_GPIOX;
|
||||
uint64_t MB_GPIO_PIN_RX;
|
||||
uint64_t MB_GPIO_PIN_TX;
|
||||
uint64_t MB_MAX_TIMEOUT;
|
||||
uint64_t MB_TIM_AHB_FREQ;
|
||||
|
||||
// uint32_t MB_UART_NUMB;
|
||||
// uint32_t MB_TIM_NUMB;
|
||||
}ProjectSettings_TypeDef;
|
||||
extern ProjectSettings_TypeDef PROJSET;
|
||||
|
||||
//#define PROJSET_MEM ((ProjectSettings_TypeDef *)SETTINGS_ADDRESS)
|
||||
|
||||
|
||||
//#define HAL_FLASH_GET_TYPEPROGRAM(_val_) (sizeof(PROJSET_MEM->MB_DEVICE_ID)/2 - 1)
|
||||
#define HAL_FLASH_GET_TYPEPROGRAM(_val_) FLASH_TYPEPROGRAM_WORD
|
||||
#define FLASH_WRITE_SETTING(_setting_, _val_) HAL_FLASH_Program(HAL_FLASH_GET_TYPEPROGRAM(_setting_), (uint32_t)(&_setting_), (uint32_t)_val_);
|
||||
#define STRUCT_WRITE_SETTING(_setting_, _val_) (_setting_ = _val_)
|
||||
|
||||
|
||||
void FillStructWithDefines(void);
|
||||
void SetFlagUpdateSettingsInMem(void);
|
||||
void UpdateSettingsInMem(void);
|
||||
void WriteSettingsToMem(void);
|
||||
void FillSettingsWithDefines(void);
|
||||
void CheckSettingsInFLASH(void);
|
||||
int CheckIsSettingsValid(ProjectSettings_TypeDef *set_struct);
|
||||
|
||||
#endif // __PROJ_SETTINGS_H_
|
||||
Reference in New Issue
Block a user