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