472 lines
24 KiB
C
472 lines
24 KiB
C
/********************************MODBUS*************************************
|
||
Данный файл содержит объявления базовых функции и дефайны для реализации
|
||
MODBUS.
|
||
Данный файл необходимо подключить в rs_message.h. После подключать rs_message.h
|
||
к основному проекту.
|
||
***************************************************************************/
|
||
#ifndef __PWM_H_
|
||
#define __PWM_H_
|
||
#include "control.h"
|
||
|
||
|
||
|
||
extern uint32_t sin_table[SIN_TABLE_SIZE_MAX];
|
||
#define int_to_percent(_int_) ((float)_int_/100)
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////
|
||
////////////////////////////---DEFINES---////////////////////////////
|
||
//----------------------------PWM HANDLE----------------------------//
|
||
/**
|
||
* @brief Calc duration of maximum pulse in ticks.
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @return _val_ - количество тиков кратчайшего импульса.
|
||
*/
|
||
#define PWM_Calc_Max_Duty(_hpwm_) ((_hpwm_)->PWM_MaxPulseDur/(_hpwm_)->stim.sTickBaseMHz)
|
||
/**
|
||
* @brief Calc duration of minimum pulse in ticks.
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @return _val_ - количество тиков кратчайшего импульса.
|
||
*/
|
||
#define PWM_Calc_Min_Duty(_hpwm_) ((_hpwm_)->PWM_MinPulseDur/(_hpwm_)->stim.sTickBaseMHz)
|
||
/**
|
||
* @brief Calc Scale Koef for Table & AUTORELOAD REGISTER
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _scale_ - верхняя граница диапазона значений.
|
||
* @return _koef_ - коэффициент для масштабирования.
|
||
* @note Данный макрос рассчитывает коэффициент для приведения значений с диапазоном [0,_scale_]
|
||
к регистру автозагрузки с диапазоном [min, max], где min, max - минимальная и максимальная длительность импульса в тактах.
|
||
*/
|
||
#define PWM_Calc_Duty_Scale(_hpwm_, _scale_) ((float)(PWM_Calc_Max_Duty(_hpwm_)-PWM_Calc_Min_Duty(_hpwm_))/(_scale_))
|
||
|
||
/**
|
||
* @brief Get Table Element Scaled corresponding to TIM ARR register
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _ind_ - номер элемента из таблицы скважностей.
|
||
* @return _val_ - масштабированный под регистры таймера значение.
|
||
* @note Если задана минимальная длительность импульса в тактах n,
|
||
то регистр ARR заполняется так, что диапазон его значений будет [n, ARR-n]
|
||
*/
|
||
#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
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _ind_ - номер элемента из таблицы скважностей.
|
||
* @return _val_ - масштабированный под регистры таймера значение.
|
||
* @note По сути такая же как PWM_Get_Table_Element_Unsigned но добавляется сдвиг на одну амплитуду для учитывания знака.
|
||
(если точнее, то сдвиг добавляется для компенсации сдвига, который имитирует знак)
|
||
* @note 0x8000*(_hpwm_)->Duty_Table_Scale - т.к. первая полуволна находится в диапазоне (0x8000-0xFFFF) вычитаем константу 0x8000 с масштабированием
|
||
*/
|
||
#define PWM_Get_Table_Element_Signed(_hpwm_,_ind_) ((int)(*((_hpwm_)->pDuty_Table_Origin+_ind_)*((_hpwm_)->Duty_Table_Scale))-0x8000*(_hpwm_)->Duty_Table_Scale)
|
||
/**
|
||
* @brief Create pointer to slave PWM from pointer to void in PWM_HandleTypeDef.
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _slavepwm_ - имя слейв pwm.
|
||
* @return _pslavepwm_ - указатель на структуру PWM_SlaveHandleTypeDef.
|
||
*/
|
||
#define PWM_Set_pSlaveHandle(_hpwm_,_slavepwm_) ((PWM_SlaveHandleTypeDef *)_hpwm_->_slavepwm_)
|
||
/**
|
||
* @brief Copy setting from master TIM_SettingsTypeDef to slave TIM_SettingsTypeDef.
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @return _set_ - имя настройки.
|
||
*/
|
||
#define PWM_Slave_CopyTimSetting(_hspwm_, _set_) ((_hspwm_)->stim._set_ = (_hspwm_)->hMasterPWM->stim._set_)
|
||
|
||
//---------------------------TIMER REGS----------------------------//
|
||
/**
|
||
* @brief Set PWM autoreload value (max duty value).
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _val_ - значение, которое нужно записать в Compare.
|
||
*/
|
||
#define PWM_Get_Autoreload(_hpwm_) __HAL_TIM_GET_AUTORELOAD(&((_hpwm_)->stim.htim))
|
||
|
||
/**
|
||
* @brief Get PWM Duty on corresponding channel.
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _val_ - значение, которое нужно записать в Compare.
|
||
*/
|
||
#define PWM_Get_Compare1(_hpwm_) __HAL_TIM_GET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel1)
|
||
#define PWM_Get_Compare2(_hpwm_) __HAL_TIM_GET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel2)
|
||
|
||
/**
|
||
* @brief Set PWM Duty on corresponding channel.
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _val_ - значение, которое нужно записать в Compare.
|
||
*/
|
||
#define PWM_Set_Compare1(_hpwm_, _val_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel1, (_val_))
|
||
#define PWM_Set_Compare2(_hpwm_, _val_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel2, (_val_))
|
||
|
||
/**
|
||
* @brief Set PWM Duty From PWM_Value Percent
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _channel_ - канал для выставления скважности.
|
||
*/
|
||
#define PWM_Set_Duty_From_Value(_hpwm_, _channel_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), _channel_, ((_hpwm_)->PWM_Value/100)*(PWM_Get_Autoreload(_hpwm_)+1))
|
||
/**
|
||
* @brief Set PWM Duty From PWM_DutyBridge Percent
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _channel_ - канал для выставления скважности.
|
||
*/
|
||
#define PWM_Set_Duty_From_DutyBridge(_hpwm_, _channel_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), _channel_, ((_hpwm_)->PWM_DutyBridge/100)*(PWM_Get_Autoreload(_hpwm_)+1))
|
||
/**
|
||
* @brief Set PWM Duty From table
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _channel_ - канал для выставления скважности.
|
||
* @param _ind_ - номер элемента из таблицы скважностей.
|
||
*/
|
||
#define PWM_Set_Duty_From_Table(_hpwm_, _channel_, _ind_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), _channel_, (PWM_Get_Table_Element_Unsigned((_hpwm_), (_ind_))+1))
|
||
|
||
/**
|
||
* @brief Set PWM Duty From PWM_Value Percent
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _channel_ - канал для выставления скважности.
|
||
*/
|
||
#define PWM_Set_SlaveDuty_From_Value(_hpwm_, _channel_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), _channel_, ((_hpwm_)->hMasterPWM->PWM_Value/100)*(PWM_Get_Autoreload(_hpwm_)+1))
|
||
|
||
/**
|
||
* @brief Set PWM Duty From PWM_DutyBridge Percent
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _channel_ - канал для выставления скважности.
|
||
*/
|
||
#define PWM_Set_SlaveDuty_From_DutyBridge(_hpwm_, _channel_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), _channel_, ((_hpwm_)->hMasterPWM->PWM_DutyBridge/100)*(PWM_Get_Autoreload(_hpwm_)+1))
|
||
/**
|
||
* @brief Set PWM Duty From table
|
||
* @param _hpwm_ - указатель на хендл pwm.
|
||
* @param _channel_ - канал для выставления скважности.
|
||
* @param _ind_ - номер элемента из таблицы скважностей.
|
||
*/
|
||
#define PWM_Set_SlaveDuty_From_Table(_hpwm_, _channel_, _ind_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), _channel_, (PWM_Get_Table_Element_Unsigned((_hpwm_)->hMasterPWM, (_ind_))+1))
|
||
|
||
|
||
// MODE DEFINES
|
||
#define PWM_DC_MODE_Pos (0) // 0 - PWM has Sine form duty, 1 - PWM has DC duty
|
||
#define PWM_BRIDGE_MODE_Pos (1) // 0 - PWM generated only on one channel (@ref PWM_ACTIVECHANNEL_MODE)
|
||
// 1 - PWM generated at two channels of phase (@ref PWM_PHASE_MODE)
|
||
#define PWM_PHASE_MODE_Pos (2) // 0 - PWM generated only at phase "A", 1 - PWM generated and three phase "A", "B", "C"
|
||
#define PWM_ACTIVECHANNEL_MODE_Pos (3) // 0 - One channel PWM doesnt generated, 1 - PWM generated on corresponting channel № "PWM_ACTIVECHANNEL_MODE"
|
||
|
||
#define PWM_DC_MODE (1<<(PWM_DC_MODE_Pos)) // 0 - PWM has Sine form duty, 1 - PWM has DC duty
|
||
|
||
#define PWM_BRIDGE_MODE (1<<(PWM_BRIDGE_MODE_Pos)) // 0 - PWM generated only on one channel (@ref PWM_ACTIVECHANNEL_MODE)
|
||
// 1 - PWM generated at two channels of phase (@ref PWM_PHASE_MODE)
|
||
#define PWM_PHASE_MODE (1<<(PWM_PHASE_MODE_Pos)) // 0 - PWM generated only at phase "A", 1 - PWM generated and three phase "A", "B", "C"
|
||
|
||
#define PWM_ACTIVECHANNEL_MODE (0x7<<(PWM_ACTIVECHANNEL_MODE_Pos)) // 0 - One channel PWM doesnt generated, 1 - PWM generated on corresponting channel № "PWM_ACTIVECHANNEL_MODE"
|
||
#define PWM_ACTIVECHANNEL_DISABLE (0x0<<(PWM_ACTIVECHANNEL_MODE_Pos))
|
||
#define PWM_ACTIVECHANNEL_A0 (0x1<<(PWM_ACTIVECHANNEL_MODE_Pos))
|
||
#define PWM_ACTIVECHANNEL_A1 (0x2<<(PWM_ACTIVECHANNEL_MODE_Pos))
|
||
#define PWM_ACTIVECHANNEL_B0 (0x3<<(PWM_ACTIVECHANNEL_MODE_Pos))
|
||
#define PWM_ACTIVECHANNEL_B1 (0x4<<(PWM_ACTIVECHANNEL_MODE_Pos))
|
||
#define PWM_ACTIVECHANNEL_C0 (0x5<<(PWM_ACTIVECHANNEL_MODE_Pos))
|
||
#define PWM_ACTIVECHANNEL_C1 (0x6<<(PWM_ACTIVECHANNEL_MODE_Pos))
|
||
|
||
#define PWM_Get_Mode(_hpwm_, _mode_) ((_hpwm_)->sPWM_Mode&(_mode_))
|
||
/* Structure for PWM modes */
|
||
typedef enum
|
||
{
|
||
// SINE MODES
|
||
PWM_SINE_SINGLE = 0, /* set pwm duty from table with PWM_Value Hz */
|
||
PWM_SINE_BRIDGE = PWM_BRIDGE_MODE, /* set pwm duty from table with PWM_Value Hz on two channels (positive and negative halfes) */
|
||
PWM_SINE_3PHASE = PWM_BRIDGE_MODE|PWM_PHASE_MODE, /* set pwm table duty on three phase with PWM_Value Hz */
|
||
// DC MODES
|
||
PWM_DC_SINGLE = PWM_DC_MODE, /* set pwm duty PWM_Value (in percent) on one channel (@ref PWM_ACTIVECHANNEL_MODE) */
|
||
PWM_DC_BRIDGE = PWM_DC_MODE|PWM_BRIDGE_MODE, /* set pwm duty PWM_DutyBridge (in percent) on two channel with PWM_Value Hz */
|
||
PWM_DC_3PHASE = PWM_DC_MODE|PWM_BRIDGE_MODE|PWM_PHASE_MODE, /* set pwm PWM_DutyBridge duty on three phase with PWM_Value Hz, with requested shift */
|
||
|
||
// Variables of signel channel modes
|
||
PWM_SINE_SINGLE_A0 = PWM_ACTIVECHANNEL_A0, /* set sine pwm on Phase A channel 0 */
|
||
PWM_SINE_SINGLE_A1 = PWM_ACTIVECHANNEL_A1, /* set sine pwm on Phase A channel 1 */
|
||
PWM_SINE_SINGLE_B0 = PWM_ACTIVECHANNEL_B0, /* set sine pwm on Phase B channel 0 */
|
||
PWM_SINE_SINGLE_B1 = PWM_ACTIVECHANNEL_B1, /* set sine pwm on Phase B channel 1 */
|
||
PWM_SINE_SINGLE_C0 = PWM_ACTIVECHANNEL_C0, /* set sine pwm on Phase C channel 0 */
|
||
PWM_SINE_SINGLE_C1 = PWM_ACTIVECHANNEL_C1, /* set sine pwm on Phase C channel 1 */
|
||
PWM_SINE_BRIDGE_A0 = PWM_DC_MODE|PWM_ACTIVECHANNEL_A0, /* set DC pwm on Phase A channel 0) */
|
||
PWM_SINE_BRIDGE_A1 = PWM_DC_MODE|PWM_ACTIVECHANNEL_A1, /* set DC pwm on Phase A channel 1) */
|
||
PWM_SINE_BRIDGE_B0 = PWM_DC_MODE|PWM_ACTIVECHANNEL_B0, /* set DC pwm on Phase B channel 0) */
|
||
PWM_SINE_BRIDGE_B1 = PWM_DC_MODE|PWM_ACTIVECHANNEL_B1, /* set DC pwm on Phase B channel 1) */
|
||
PWM_SINE_BRIDGE_C0 = PWM_DC_MODE|PWM_ACTIVECHANNEL_C0, /* set DC pwm on Phase C channel 0) */
|
||
PWM_SINE_BRIDGE_C1 = PWM_DC_MODE|PWM_ACTIVECHANNEL_C1, /* set DC pwm on Phase C channel 1) */
|
||
}PWM_ModeTypeDef;
|
||
|
||
/**
|
||
* @brief Structure for PWM modbus coils.
|
||
*/
|
||
typedef struct // PWM_ModeCoilsTypeDef
|
||
{
|
||
unsigned reserved:1; /* reserved bits */
|
||
unsigned DC:1; /* DC mode: PWM duty, Sine mode: frequency*/
|
||
unsigned BRIDGE:1; /* Bridge mode: */
|
||
unsigned PHASE:1; /* minimum pulse duration for PWM in us*/
|
||
unsigned POLARITY:1; /* minimum pulse duration for PWM in us*/
|
||
unsigned ACTIVECHANNEL:3; /* minimum pulse duration for PWM in us*/
|
||
|
||
|
||
}PWM_ModeCoilsTypeDef;
|
||
|
||
/**
|
||
* @brief Structure for PWM modbus registers.
|
||
*/
|
||
typedef struct // PWM_ModeRegsTypeDef
|
||
{
|
||
|
||
uint16_t Value; /* DC mode: PWM duty, Table mode: frequency*/
|
||
uint16_t TIMFreqHz; /* frequency of pwm timer */
|
||
uint16_t DutyBridge; /* frequency of pwm timer */
|
||
uint16_t MaxPulseDur; /* maximum pulse duration for PWM in us*/
|
||
uint16_t MinPulseDur; /* minimum pulse duration for PWM in us*/
|
||
uint16_t DeadTime; /* dead-Time between switches half waves (channels) in us */
|
||
uint16_t TableSize; /* */
|
||
|
||
}PWM_ModeRegsTypeDef;
|
||
|
||
/**
|
||
* @brief Structure for PWM config.
|
||
*/
|
||
typedef struct // PWM_ConfigTypeDef
|
||
{
|
||
PWM_ModeCoilsTypeDef *PWM_Mode;
|
||
PWM_ModeRegsTypeDef *PWM_Settings;
|
||
}PWM_ConfigTypeDef;
|
||
|
||
typedef struct {
|
||
|
||
/* Controller gains */
|
||
float Kp;
|
||
float Ki;
|
||
float Kd;
|
||
|
||
/* Derivative low-pass filter time constant */
|
||
float tau;
|
||
|
||
/* Output limits */
|
||
float limMin;
|
||
float limMax;
|
||
|
||
/* Integrator limits */
|
||
float limMinInt;
|
||
float limMaxInt;
|
||
|
||
/* Sample time (in seconds) */
|
||
float SampleT;
|
||
|
||
/* Controller "memory" */
|
||
float integrator;
|
||
float prevError; /* Required for integrator */
|
||
float differentiator;
|
||
float prevMeasurement; /* Required for differentiator */
|
||
|
||
/* input */
|
||
float setpoint;
|
||
|
||
} PWM_RampHandleTypeDef;
|
||
/**
|
||
* @brief Handle for PWM.
|
||
* @note Prefixes: h - handle, s - settings, f - flag
|
||
*/
|
||
typedef struct // PWM_HandleTypeDef
|
||
{
|
||
/* PWM VARIABLES */
|
||
PWM_ModeTypeDef sPWM_Mode; /* PWM current mode */
|
||
PWM_ConfigTypeDef sPWM_Config; /* PWM modbus config */
|
||
float PWM_Value; /* DC mode: PWM duty, Table mode: frequency*/
|
||
float PWM_DutyBridge; /* Duty for DC bridge mode */
|
||
uint32_t PWM_MaxPulseDur; /* maximum pulse duration for PWM in us*/
|
||
uint32_t PWM_MinPulseDur; /* minimum pulse duration for PWM in us*/
|
||
uint32_t PWM_DeadTime; /* dead-Time between switches half waves (channels) in us */
|
||
PWM_RampHandleTypeDef hramp; /* handle for ramp */
|
||
uint8_t PWM_enHardware; /* enable PWM output on transistor */
|
||
|
||
/* SETTINGS FOR TIMER */
|
||
TIM_SettingsTypeDef stim; /* settings for TIM */
|
||
TIM_OC_InitTypeDef sConfigOC; /* settings for oc channel */
|
||
unsigned fActiveChannel; /* flag for active oc channel: 0 - first channel, 1 - second channel */
|
||
uint16_t PWM_Channel1; /* instance of first channel */
|
||
uint16_t PWM_Channel2; /* instance of second channel */
|
||
|
||
/* VARIABLES FOR TABLE DUTY PARAMETERS */
|
||
uint32_t *pDuty_Table_Origin; /* pointer to table of pwm duties */
|
||
uint32_t Duty_Table_Size; /* size of duty table */
|
||
float Duty_Table_Ind; /* current ind of duty table */
|
||
float Duty_Table_Scale; /* scale for TIM ARR register */
|
||
|
||
/* SETTIGNS FOR PWM OUTPUT */
|
||
GPIO_TypeDef *GPIOx; /* GPIO port for PWM output */
|
||
uint32_t GPIO_PIN_X1; /* GPIO pin for PWM output */
|
||
uint32_t GPIO_PIN_X2; /* GPIO pin for PWM output (second half wave) */
|
||
|
||
/* SLAVES PWM */
|
||
void *hpwm2;
|
||
void *hpwm3;
|
||
|
||
}PWM_HandleTypeDef;
|
||
extern PWM_HandleTypeDef hpwm1;
|
||
|
||
/**
|
||
* @brief Handle for Slave PWM.
|
||
* @note Prefixes: h - handle, s - settings, f - flag
|
||
*/
|
||
typedef struct // PWM_SlaveHandleTypeDef
|
||
{
|
||
/* MASTER PWM*/
|
||
PWM_HandleTypeDef *hMasterPWM; /* master pwm handle */
|
||
|
||
/* SETTINGS FOR TIMER */
|
||
TIM_SettingsTypeDef stim; /* slave tim handle */
|
||
unsigned fActiveChannel; /* flag for active oc channel: 0 - first channel, 1 - second channel */
|
||
uint16_t PWM_Channel1; /* instance of first channel */
|
||
uint16_t PWM_Channel2; /* instance of second channel */
|
||
|
||
/* VARIABLES FOR TABLE DUTY PARAMETERS */
|
||
float Duty_Shift_Ratio; /* Ratio of table shift: 0.5 shift - shift = Table_Size/2 */
|
||
|
||
/* SETTIGNS FOR PWM OUTPUT */
|
||
GPIO_TypeDef *GPIOx; /* GPIO port for PWM output */
|
||
uint32_t GPIO_PIN_X1; /* GPIO pin for PWM output */
|
||
uint32_t GPIO_PIN_X2; /* GPIO pin for PWM output (second half wave) */
|
||
}PWM_SlaveHandleTypeDef;
|
||
extern PWM_SlaveHandleTypeDef hpwm2;
|
||
extern PWM_SlaveHandleTypeDef hpwm3;
|
||
|
||
//--------------------------------PWM FUNCTIONS----------------------------------
|
||
/**
|
||
* @brief reInitialization of PWM TIM.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @note Перенастраивает таймер согласно принятным настройкам в pwm_ctrl.
|
||
*/
|
||
void PWM_Sine_ReInit(PWM_HandleTypeDef *hpwm);
|
||
|
||
/**
|
||
* @brief Initialization of Slave PWM TIM.
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @note Вызывает функции инициализации и включения слейв ШИМ.
|
||
*/
|
||
void PWM_SlavePhase_Init(PWM_SlaveHandleTypeDef *hspwm);
|
||
/**
|
||
* @brief reInitialization of Slave PWM TIM.
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @note Перенастраивает таймер согласно принятным настройкам в pwm_ctrl.
|
||
*/
|
||
void PWM_SlavePhase_reInit(PWM_SlaveHandleTypeDef *hspwm);
|
||
|
||
/**
|
||
* @brief Filling table with one period of sinus values.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @param table_size - размер таблицы.
|
||
* @note Формирует таблицу синусов размером table_size.
|
||
*/
|
||
uint32_t PWM_Fill_Sine_Table(PWM_HandleTypeDef *hpwm, uint32_t table_size);
|
||
|
||
/**
|
||
* @brief Calc and update new Duty Table Scale.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @note Используется, когда изменяется значение регистра ARR.
|
||
*/
|
||
void PWM_Update_DutyTableScale(PWM_HandleTypeDef *hpwm);
|
||
//---------------------this called from TIM_PWM_Handler()------------------------
|
||
// MASTER PWM FUNCTIONS
|
||
/**
|
||
* @brief PWM Handler.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @note Управляет скважность ШИМ в режиме PWM_TABLE.
|
||
* @note This called from TIM_PWM_Handler
|
||
*/
|
||
void PWM_Handler(PWM_HandleTypeDef *hpwm);
|
||
/**
|
||
* @brief .
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
||
*/
|
||
void PWM_Sine_Bridge_Mode(PWM_HandleTypeDef *hpwm, uint16_t rotate_ind_A, uint16_t rotate_ind_B, uint16_t rotate_ind_C);
|
||
/**
|
||
* @brief .
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
||
*/
|
||
void PWM_SingleChannel_Mode(PWM_HandleTypeDef *hpwm, uint16_t rotate_ind_A, uint8_t SineOrDC);
|
||
/**
|
||
* @brief .
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
||
*/
|
||
void PWM_DC_Bridge_Mode(PWM_HandleTypeDef *hpwm, uint16_t rotate_ind_A, uint16_t rotate_ind_B, uint16_t rotate_ind_C);
|
||
/**
|
||
* @brief Getting ind for Duty Table.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @param FreqTIM - частота таймера ШИМ.
|
||
* @note Рассчитывает индекс для таблицы скважностей.
|
||
* PWM_Value в hpwm - частота с которой эта таблица должна выводиться на ШИМ
|
||
* @note This called from TIM_PWM_Handler
|
||
*/
|
||
uint32_t PWM_Get_Duty_Table_Ind(PWM_HandleTypeDef *hpwm, float FreqTIM);
|
||
|
||
/**
|
||
* @brief Create Dead Time when switches channels.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @param LocalDeadTimeCnt - указатель на переменную для отсчитывания дедтайма.
|
||
* @param LocalActiveChannel - указатель на переменную для отслеживания смены канала.
|
||
*/
|
||
void PWM_CreateDeadTime(PWM_HandleTypeDef *hpwm, float *LocalDeadTimeCnt, unsigned *LocalActiveChannel);
|
||
|
||
// SLAVE PWM FUNCTIONS
|
||
/**
|
||
* @brief Set Duty from table on Slave PWM at one channel by sin_ind of the Master PWM.
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
||
*/
|
||
uint16_t PWM_SlavePhase_Calc_TableInd(PWM_SlaveHandleTypeDef *hspwm, uint16_t sin_ind);
|
||
|
||
/**
|
||
* @brief Check is all Slave channels works properly.
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @note Проверка работает ли только один из каналов, и проверка чтобы CCRx <= ARR
|
||
* @note В мастере проверка происходит напрямую в PWM_Handler.
|
||
*/
|
||
void PWM_SlavePhase_Check_Channels(PWM_SlaveHandleTypeDef *hspwm);
|
||
/**
|
||
* @brief Create Dead Time for Slave PWM when switches channels.
|
||
* @param hspwm - указатель на хендл слейв ШИМ.
|
||
* @param LocalDeadTimeCnt - указатель на переменную для отсчитывания дедтайма.
|
||
* @param LocalActiveChannel - указатель на переменную для отслеживания смены канала.
|
||
* @note Аналог функции PWM_CreateDeadTime но для слейв ШИМов.
|
||
*/
|
||
void PWM_SlavePhase_CreateDeadTime(PWM_SlaveHandleTypeDef *hspwm, float *LocalDeadTimeCnt, unsigned *LocalActiveChannel);
|
||
//---------------------this called from TIM_CTRL_Handler()-----------------------
|
||
/**
|
||
* @brief Update PWM parameters.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @note Проверка надо ли обновлять параметры ШИМ, и если надо - обновляет их.
|
||
* @note This called from TIM_CTRL_Handler
|
||
*/
|
||
void Update_Params_For_PWM(PWM_HandleTypeDef *hpwm);
|
||
/**
|
||
* @brief PID for ramp.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @note ПИД-регулятор, который управляет скважностью ШИМ и не дает её изменяться резко.
|
||
*/
|
||
void PWM_Ramp_ControlPWMValue(PWM_HandleTypeDef *hpwm);
|
||
/**
|
||
* @brief Reset PID for ramp.
|
||
* @param hpwm - указатель на хендл ШИМ.
|
||
* @note Сбрасывает переменные ПИД-регулятора, чтобы потом его запустить "с чистого листа".
|
||
*/
|
||
void PWM_Ramp_Reset(PWM_HandleTypeDef *hpwm);
|
||
|
||
|
||
//---------------------------this called from main()-----------------------------
|
||
/**
|
||
* @brief First set up of PWM Two Channel.
|
||
* @note Первый инит ШИМ. Заполняет структуры и инициализирует таймер для генерации синуоидального ШИМ.
|
||
* Скважность ШИМ меняется по закону синусоиды, каждый канал генерирует свой полупериод синуса (от -1 до 0 И от 0 до 1)
|
||
* ШИМ генерируется на одном канале.
|
||
* @note This called from main OR by setted coil
|
||
*/
|
||
void PWM_Sine_FirstInit(void);
|
||
|
||
|
||
#endif // __PWM_H_
|