美文网首页
FOC电机控制之英飞凌TC264三相互补信号输出配置

FOC电机控制之英飞凌TC264三相互补信号输出配置

作者: 那个混子 | 来源:发表于2024-08-23 11:17 被阅读0次

    最近学习了一下基本原理,想着实物上跑跑,学习一下!

    手里有一个英飞凌的板子,现在用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);
    }
    
    欢迎关注本人微信公众号:那个混子
    记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!

    相关文章

      网友评论

          本文标题:FOC电机控制之英飞凌TC264三相互补信号输出配置

          本文链接:https://www.haomeiwen.com/subject/vkibkjtx.html