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

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

手里有一个英飞凌的板子,现在用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);
}
欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容