最近学习了一下基本原理,想着实物上跑跑,学习一下!
手里有一个英飞凌的板子,现在用GTM模块去控制电机转动,先简单学习了解一下这个模块!
image.png使用的是GTM 模块下的TOM模块生成三相互补的PWM波形,并设置死区时间,PWM的频率为10000hz,占空比则由SVWM计算出的Ta,Tb,Tc赋值。
参考代码
/*-----------------------------------------------------Includes------------------------------------------------------*/
/*********************************************************************************************************************/
#include "GTM_TOM_3_Phase_Inverter_PWM.h"
#include "Ifx_Types.h"
#include "IfxGtm_Tom_PwmHl.h"
#include "IfxCpu_Irq.h"
#include"FOC.h"
void configureAtomPwmCenterAligned(Ifx_GTM_ATOM *atom, IfxGtm_Atom_Ch channel, IfxGtm_Cmu_Clk clock, Ifx_ActiveState activeState, IfxGtm_Atom_Ch_ResetEvent resetEvent, IfxGtm_Atom_Ch_OutputTrigger trigger, uint32 period, uint32 dutyCycle)
{
// 配置ATOM通道的PWM模式
IfxGtm_Atom_Ch_configurePwmMode(atom, channel, clock, activeState, resetEvent, trigger);
// 设置比较值,用于生成PWM信号
// 这里的period和dutyCycle应根据实际需要设置
IfxGtm_Atom_Ch_setCompareZeroShadow(atom, channel, period);
IfxGtm_Atom_Ch_setCompareOneShadow(atom, channel, dutyCycle);
// 启动PWM
IfxGtm_Atom_Agc_trigger(&atom->AGC);
}
#define PWM_FREQ_HZ 10000 // 定义PWM开关频率值,单位为Hz
#define PWM_DEAD_TIME 0.5e-6 // 定义死时间,单位为秒
#define PWM_MIN_PULSE_TIME 1.0e-6 // 定义允许的最小脉冲宽度,单位为秒
// 定义三相PWM输出的管脚
#define PHASE_U_HS &IfxGtm_TOM1_2_TOUT28_P33_6_OUT // 相U高侧PWM输出
#define PHASE_U_LS &IfxGtm_TOM1_3_TOUT29_P33_7_OUT // 相U低侧PWM输出
#define PHASE_V_HS &IfxGtm_TOM1_4_TOUT30_P33_8_OUT // 相V高侧PWM输出
#define PHASE_V_LS &IfxGtm_TOM1_5_TOUT40_P32_4_OUT // 相V低侧PWM输出
#define PHASE_W_HS &IfxGtm_TOM1_6_TOUT74_P15_3_OUT // 相W高侧PWM输出 IfxGtm_ATOM1_6_TOUT42_P23_1_OUT IfxGtm_TOM0_6_TOUT42_P23_1_OUT
#define PHASE_W_LS &IfxGtm_TOM1_7_TOUT64_P20_8_OUT // 相W低侧PWM输出 IfxGtm_TOM0_7_TOUT64_P20_8_OUT IfxGtm_TOM1_7_TOUT64_P20_8_OUT
#define GTM_TOM_MASTER IfxGtm_Tom_1 // 定义使用的定时器
#define GTM_TOM_MASTER_TIMER_CH IfxGtm_Tom_Ch_1 // 定义使用的定时器通道
// 定义不同占空比的值
#define DUTY_25_PERCENT 0.25 // 定义25%占空比
#define DUTY_50_PERCENT 0.50 // 定义50%占空比
#define DUTY_75_PERCENT 0.75 // 定义75%占空比
#define DUTY_STEP 0.1 // 定义占空比步进
#define DUTY_MIN 0.1 // 定义最小占空比(10%)
#define DUTY_MAX 0.9 // 定义最大占空比(90%)
/*********************************************************************************************************************/
/*-------------------------------------------------Data Structures---------------------------------------------------*/
/*********************************************************************************************************************/
/* 用于三相PWM输出配置和处理的结构体 */
typedef struct
{
IfxGtm_Tom_Timer timer; // 定时器驱动
IfxGtm_Tom_PwmHl pwm; // GTM TOM PWM驱动对象
Ifx_TimerValue pwmOnTimes[3]; // 三相PWM的ON时间
} Pwm3PhaseOutput;
/*********************************************************************************************************************/
/*-------------------------------------------------Global variables--------------------------------------------------*/
/*********************************************************************************************************************/
Pwm3PhaseOutput g_pwm3PhaseOutput; // 全局变量,用于三相PWM输出实例
/*********************************************************************************************************************/
/*---------------------------------------------Function Implementations----------------------------------------------*/
/*********************************************************************************************************************/
/* 该函数初始化TOM */
void initGtmTomPwm(void)
{
/* 使能GTM模块 */
IfxGtm_enable(&MODULE_GTM);
/* 设置GTM全局时钟频率 */
IfxGtm_Cmu_setGclkFrequency(&MODULE_GTM, IfxGtm_Cmu_getModuleFrequency(&MODULE_GTM));
/* 设置GTM可配置时钟频率 */
IfxGtm_Cmu_setClkFrequency(&MODULE_GTM, IfxGtm_Cmu_Clk_0, IfxGtm_Cmu_getGclkFrequency(&MODULE_GTM));
/* 使能FXU时钟 */
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK);
// 定时器配置
IfxGtm_Tom_Timer_Config timerConfig;
{
IfxGtm_Tom_Timer_initConfig(&timerConfig, &MODULE_GTM); // 初始化默认参数
timerConfig.base.frequency = PWM_FREQ_HZ; // 设置定时器频率
timerConfig.clock = IfxGtm_Tom_Ch_ClkSrc_cmuFxclk0; // 定义使用的CMU时钟
timerConfig.tom = GTM_TOM_MASTER; // 定义使用的定时器
timerConfig.timerChannel = GTM_TOM_MASTER_TIMER_CH; // 定义使用的通道
IfxGtm_Tom_Timer_init(&g_pwm3PhaseOutput.timer, &timerConfig); // 初始化TOM
}
// PWM通道配置
{
IfxGtm_Tom_PwmHl_Config pwmHlConfig;
IfxGtm_Tom_ToutMapP ccx[] = // 高侧PWM通道数组
{
PHASE_U_HS, // 相U高侧PWM
PHASE_V_HS, // 相V高侧PWM
PHASE_W_HS // 相W高侧PWM
};
IfxGtm_Tom_ToutMapP coutx[] = // 低侧PWM通道数组
{
PHASE_U_LS, // 相U低侧PWM
PHASE_V_LS, // 相V低侧PWM
PHASE_W_LS // 相W低侧PWM
};
IfxGtm_Tom_PwmHl_initConfig(&pwmHlConfig); // 初始化配置结构体
// pwmHlConfig.initPins = FALSE;
pwmHlConfig.base.channelCount = sizeof(ccx) / sizeof(IfxGtm_Tom_ToutMapP); // 计算PWM通道数量
pwmHlConfig.base.deadtime = PWM_DEAD_TIME; // 设置死时间
pwmHlConfig.base.minPulse = PWM_MIN_PULSE_TIME; // 设置最小脉冲宽度
pwmHlConfig.base.outputMode = IfxPort_OutputMode_pushPull; // 设置ccx和coutx引脚的输出模式
pwmHlConfig.base.outputDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1; // 设置ccx和coutx引脚的输出驱动
pwmHlConfig.base.ccxActiveState =Ifx_ActiveState_high ; // 设置高侧PWM激活状态
pwmHlConfig.base.coutxActiveState = Ifx_ActiveState_high; // 设置低侧PWM激活状态
pwmHlConfig.ccx = ccx; // 分配高侧开关的通道
pwmHlConfig.coutx = coutx; // 分配低侧开关的通道
pwmHlConfig.timer = &g_pwm3PhaseOutput.timer; // 初始化定时器对象
pwmHlConfig.tom = timerConfig.tom; // 设置定时器
IfxGtm_Tom_PwmHl_init(&g_pwm3PhaseOutput.pwm, &pwmHlConfig); // 初始化PWM
IfxGtm_Tom_PwmHl_setMode(&g_pwm3PhaseOutput.pwm, Ifx_Pwm_Mode_centerAligned); // 设置PWM模式为中心对齐
IfxGtm_Tom_Timer_updateInputFrequency(&g_pwm3PhaseOutput.timer); // 更新输入频率
}
// 运行定时器
IfxGtm_Tom_Timer_run(&g_pwm3PhaseOutput.timer);
// 计算PWM占空比
g_pwm3PhaseOutput.pwmOnTimes[0] = g_pwm3PhaseOutput.pwm.timer->base.period * DUTY_25_PERCENT;
g_pwm3PhaseOutput.pwmOnTimes[1] = g_pwm3PhaseOutput.pwm.timer->base.period * DUTY_50_PERCENT;
// g_pwm3PhaseOutput.pwmOnTimes[2] = g_pwm3PhaseOutput.pwm.timer->base.period * DUTY_75_PERCENT;
//更新PWM占空比
IfxGtm_Tom_Timer_disableUpdate(&g_pwm3PhaseOutput.timer);
IfxGtm_Tom_PwmHl_setOnTime(&g_pwm3PhaseOutput.pwm, g_pwm3PhaseOutput.pwmOnTimes);
IfxGtm_Tom_Timer_applyUpdate(&g_pwm3PhaseOutput.timer);
}
/* 此函数设置PWM信号的占空比 */
void updateGtmTomPwmDutyCycles(void)
{
Ifx_TimerValue period; // 定义定时器周期变量
Ifx_TimerValue dutyStep; // 定义占空比步进变量
Ifx_TimerValue dutyStepMin; // 定义占空比最小步进变量
Ifx_TimerValue dutyStepMax; // 定义占空比最大步进变量
/* 获取定时器周期 */
period = g_pwm3PhaseOutput.pwm.timer->base.period;
PWM_Period = period;
/* 计算占空比步进,DUTY_STEP是定义的占空比步进比例 */
dutyStep = period * DUTY_STEP;
/* 计算PWM占空比的界限 */
dutyStepMin = period * DUTY_MIN; // 计算最小占空比
dutyStepMax = period * DUTY_MAX; // 计算最大占空比
/* 直接设置PWM占空比 */
g_pwm3PhaseOutput.pwmOnTimes[0] = Duty_Ta;
g_pwm3PhaseOutput.pwmOnTimes[1] = Duty_Tb;
g_pwm3PhaseOutput.pwmOnTimes[2] = Duty_Tc;
/* 限制PWM占空比在dutyStepMin和dutyStepMax之间 */
if(g_pwm3PhaseOutput.pwmOnTimes[0] >= dutyStepMax)
{
g_pwm3PhaseOutput.pwmOnTimes[0] = dutyStepMin; // 如果超过最大占空比,则设置为最小占空比
}
if(g_pwm3PhaseOutput.pwmOnTimes[1] >= dutyStepMax)
{
g_pwm3PhaseOutput.pwmOnTimes[1] = dutyStepMin; // 同上
}
if(g_pwm3PhaseOutput.pwmOnTimes[2] >= dutyStepMax)
{
g_pwm3PhaseOutput.pwmOnTimes[2] = dutyStepMin; // 同上
}
/* 更新新的PWM占空比 */
/* 禁用定时器更新,准备进行占空比更新 */
IfxGtm_Tom_Timer_disableUpdate(&g_pwm3PhaseOutput.timer);
/* 设置新的PWM占空比 */
IfxGtm_Tom_PwmHl_setOnTime(&g_pwm3PhaseOutput.pwm, g_pwm3PhaseOutput.pwmOnTimes);
/* 应用更新到定时器 */
IfxGtm_Tom_Timer_applyUpdate(&g_pwm3PhaseOutput.timer);
}
欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!
网友评论