This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:适用于三相逆变器的基于 DSP 的 SPWM

Guru**** 1709640 points
Other Parts Discussed in Thread: TMS320F28379D, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1377992/tms320f28379d-dsp-based-spwm-for-three-phase-inverter

器件型号:TMS320F28379D
Thread 中讨论的其他器件: C2000WARE

工具与软件:

大家好! 我是一个初学者、我尝试使用 Code Composer Studio 为三相逆变器实现基于 DSP 的正弦脉宽调制(SPWM)、我使用的是 TMS320F28379D 版本:2.0。 我已经观看了几个 YouTube 视频,并设法写了一个代码。 不过、当我实施时、我在示波器上没有看到任何信号。 如果任何人有参考代码可以帮助我完成该项目、在我的截止日期即将到来时、我将不胜感激。 提前感谢您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:TMS320F28379D

    工具与软件:

     我试图在 CCS 上调试此代码、但调试器的进度没有超过"int main (void)"行。 如何解决此问题?

    /*
    * PWM.c
    *
    *创建时间: 2024年5月23日
    *作者:QUDUS
    */
    #include "F28x_Project.h"
    #include //包含 sinf 和 M_PI 的 math.h
    #include "F2837xD_ePWM.h"
    #include "F2837xD_pievect.h"
    #include "F2837xD_GPIO.h"

    #define PWM_PERIOD 10000 //使用100 MHz SYSCLK 时、适用于10kHz 载波频率
    #define SINE_TABLE_SIZE 256.
    #define PHASE_SHIFT (SINE_TABLE_SIZE / 3)// 120度相移
    #define SINE_UPDATE_INTERVAL 78 // 78.125微秒(对于50Hz 基频)

    //正弦波查找表
    float sine_table[sine_table_size];

    //函数原型
    void InitEPwm1();
    void InitEPwm2 ();
    void InitEPwm3 ();
    void InitSineTable();

    int main (void)

    InitSysCtrl();//初始化系统控制
    dint;//禁用 CPU 中断
    InitPieCtrl();//初始化 PIE 控制寄存器
    IER = 0x0000;//禁用 CPU 中断并清除所有 CPU 中断标志
    IFR = 0x0000;//清除所有 CPU 中断标志
    InitPieVectTable();//初始化 PIE 向量表

    InitGpio ();//初始化 EPWM 的 GPIO

    InitSineTable ();//初始化正弦表

    InitEPwm1 ();//初始化 ePWM1
    InitEPwm2 ();//初始化 ePWM2
    InitEPwm3 ();//初始化 ePWM3

    while (1)

    内部 I;
    对于(I = 0;I < SINE_TABLE_SIZE;I++)

    // Update ePWM1 (更新 ePWM1)
    EPwm1Regs.CMPA.bit.CMPA =(PWM_PERIODE/2)*(SINE_TABLE[i]+ 1);

    //更新 ePWM2 (相移120度)
    int idx2 =(I + PHASE_SHIFT)% SINE_TABLE_SIZE;
    EPwm2Regs.CMPA.bit.CMPA =(PWM_PERIODE/2)*(sine_table[idx2]+ 1);

    //更新 ePWM3 (相移240度)
    int idx3 =(I + 2 * PHASE_SHIFT)% SINE_TABLE_SIZE;
    EPwm3Regs.CMPA.bit.CMPA =(PWM_PERIODE/2)*(sine_table[idx3]+ 1);

    DELAY_US (SINE_UPDATE_INTERVAL);//延迟以实现50Hz 基频
    }
    }
    }

    void InitEPwm1()

    EALLOW;

    //设置 ePWM1
    EPwm1Regs.TBPRD = PWM_PERIOD - 1;//设置 PWM 周期
    EPwm1Regs.TBPHS.all = 0x00000000;// Phase 为0
    EPwm1Regs.TBCTR = 0x0000;//清除计数器

    //设置比较值
    EPwm1Regs.CMPA.bit.CMPA = 0;//设置初始比较 A 值

    //设置计数器模式
    EPwm1Regs.TBCTL.bit.CTRMODE = tb_count_updown;//向上计数和向下计数
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;// Disable phase loading (禁用相位加载)
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置动作限定符
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//针对事件 A 设置 PWM1A、向上计数
    EPwm1Regs.AQCTLA.bit.CAD = AQ_Clear;//在发生事件 A 时清除 PWM1A、向下计数

    EDIS;
    }

    void InitEPwm2 ()

    EALLOW;

    //设置 ePWM2
    EPwm2Regs.TBPRD = PWM_PERIOD - 1;//设置 PWM 周期
    EPwm2Regs.TBPHS.all = PWM_PERIOD / 3;// 120度的相移
    EPwm2Regs.TBCTR = 0x0000;//清除计数器

    //设置比较值
    EPwm2Regs.CMPA.bit.CMPA = 0;//设置初始比较 A 值

    //设置计数器模式
    EPwm2Regs.TBCTL.bit.CTRMODE = tb_count_updown;//向上计数和向下计数
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;// Enable phase loading (启用相位加载)
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//与 ePWM1同步
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置动作限定符
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//针对事件 A 设置 PWM2A、向上计数
    EPwm2Regs.AQCTLA.bit.CAD = AQ_Clear;//在发生事件 A 时清除 PWM2A、向下计数

    EDIS;
    }

    void InitEPwm3 ()

    EALLOW;

    //设置 ePWM3
    EPwm3Regs.TBPRD = PWM_PERIOD - 1;//设置 PWM 周期
    EPwm3Regs.TBPHS.all =(2 * PWM_PERIOD)/3;// 240度的相移
    EPwm3Regs.TBCTR = 0x0000;//清除计数器

    //设置比较值
    EPwm3Regs.CMPA.bit.CMPA = 0;//设置初始比较 A 值

    //设置计数器模式
    EPwm3Regs.TBCTL.bit.CTRMODE = tb_count_updown;//向上计数和向下计数
    EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;// Enable phase loading (启用相位加载)
    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//与 ePWM1同步
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
    EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置动作限定符
    EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;//针对事件 A 设置 PWM3A、向上计数
    EPwm3Regs.AQCTLA.bit.CAD = AQ_Clear;//在发生事件 A 时清除 PWM3A、向下计数

    EDIS;
    }

    void InitSineTable()

    内部 I;
    对于(I = 0;I < SINE_TABLE_SIZE;I++)

    SINE_TABLE[i]= sinf ((2 * M_PI * i)/ SINE_TABLE_SIZE);
    }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    将两个相关的线程组合在一起。

    调试器进程未经过"int main (void)"行

    您在 main()中看到程序停止的代码行是什么? 请使用"Step Over"(单步执行)和"Step Into"(单步执行进入)按钮逐步进入功能、以便我们可以确定哪个行是导致某些问题的具体原因。  您是否参考过任何 C2000ware 软件示例? 如果是、哪一个?

    有关 SPWM 指南、请 参阅这些类似主题(您可能还可以在 E2E 论坛中筛选更多主题)。 虽然它们引用不同的器件、但对于 F28379D、实现方式将类似:

    此致、

    Allison