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.

[参考译文] 用于单相 Z 源逆变器简单升压控制的 ePWM 编程(LAUNCHXL-F28069M)

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/614105/epwm-programming-for-simple-boost-control-of-single-phase-z-source-inverter-launchxl-f28069m

您好!

最近、我一直在尝试对 F28069M Launchpad 进行编程、以便对单相 Z 源逆变器进行简单的升压控制。 对于 10kHz 开关频率、我希望让逆变器同一桥臂中的开关在一个完整周期内接通33微秒。 我对其中的某些部分进行了编程、但无法对33微秒重叠进行编程

// TI 文件$Revision:/main/2 $

//######################################################################################################################
//
//文件:Example_2806xCpuTimer.c
//
//描述:
//
//此示例配置 CPU Timer0、1和2并递增
//每次定时器发出中断时计数器。
//
//监视变量:
// CpuTimer0.InterruptCount
// CpuTimer1.InterruptCount
// CpuTimer2.InterruptCount
//
//######################################################################################################################

//######################################################################################################################

#include "DSP28x_Project.h"//器件头文件和示例 include 文件
#include
#define RED_DELAY = 170;
#define FED_DELAY = 170;
//此文件中找到的函数的原型语句。
中断空 CPU_timer0_ISR (空);
中断空 CPU_Timer1_ISR (空);
中断 void cpu_timer2_isr (void);
float t=0,w,w2,pi=3.14159265, v;
int i=0、j=0;

float u[1000];
浮点 CH1[334];

//此文件中找到的函数的原型语句。
void InitEPwm1Examples(void);
void InitEPwm2Examples(void);
void InitEPwm3Examples(void);

uint16 ePWM_CMPA_DIRECTION;
uint16 ePWM_CMPB_DIRECTION;
UINT16 EPwmTimerIntCount;
uint16 EPwmMaxCMPA;
uint16 EPwmMinCMPA;
UINT16 EPwmMaxCMPB;
uint16 EPwmMinCMPB;

//为每个计时器配置周期
#define EPWM1_TIMER_TBPRD 4000 //周期寄存器
#define EPWM1_MAX_CMPA 1320
#define EPWM1_MIN_CMPA 50
#define EPWM1_MAX_CMPB 1320
#define EPWM1_MIN_CMPB 50.

#define EPWM2_TIMER_TBPRD 4000 //周期寄存器
#define EPWM2_MAX_CMPA 1320
#define EPWM2_MIN_CMPA 50.
#define EPWM2_MAX_CMPB 1320
#define EPWM2_MIN_CMPB 50.

#define EPWM3_TIMER_TBPRD 4000 //周期寄存器
#define EPWM3_MAX_CMPA 1320
#define EPWM3_MIN_CMPA 50.
#define EPWM3_MAX_CMPB 1320
#define EPWM3_MIN_CMPB 50.

//跟踪比较值的移动方式
#define ePWM_CMP_UP 1.
#define ePWM_CMP_DOWN 0

void main (void)

//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
InitSysCtrl();

//步骤2. 初始化 GPIO:
//此示例函数位于 F2806x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过

EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;// GPIO18 = GPIO18
GpioCtrlRegs.GPADIR.bit.GPIO18=1;// GPIO18=输出->1.

GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;// 0=GPIO、
GpioCtrlRegs.GPADIR.bit.GPIO16=1;// 1=输出、0=输入
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;// 0=GPIO、
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;// 1=输出、0=输入

GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;// GPIO1 = ePWM
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;// GPIO1 = ePWM
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;// GPIO1 = ePWM
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;// GPIO1 = ePWM
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;// GPIO1 = ePWM
GpioCtrlRegs.GPAMUX1.bit.GPIO5=1;// GPIO1= ePWM

EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//启用 ADC 外设时钟
(* Device_cal)();//从 TI OTP 自动校准
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0;//将 ADC 时钟返回到原始状态
EDIS;

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
InitPieVectTable();

//对于此示例,只初始化 ePWM
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

//配置 ADC
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;// ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//使用内部带隙
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//加电带隙
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//加电基准
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//为 ADC 的其余部分加电
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC
// for (i=0;i<5000;i++){}//等待60000个周期= 1ms (每个迭代为12个周期)

AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//在输出锁存之前创建 int 脉冲1个周期

//将 S/H 窗口设置为6个时钟周期(112.5ns)
AdcRegs.ADCSOC0CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC1CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC2CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC4CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC5CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC6CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC9CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC8CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC10CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC12CTL.bit.ACQPS = 8;
AdcRegs.ADCSOC14CTL.bit.ACQPS = 8;


AdcRegs.INTSEL1N2.bit.INT1SEL = 12;// ADCCH12 (ADC-B4) EOC 导致 ADCInterrupt 1
AdcRegs.INTSEL1N2.bit.INT1CONT = 1;//将 ADCInterrupt 1设置为自动 CLR
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADC 中断1

//请注意,SOC3、7、11、13和15是有效的,但未配置这些 SOC
//因为 controlSTICK 上不存在这些 ADC 输出。 配置
//为可读性而按原样配置。

//EOC =转换事件结束;SOC =转换事件开始
AdcRegs.ADCINTSOCSEL.bit.SOC0 = 1;// ADCInterrupt 1引起 SOC0
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 1;
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 1;
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 1;
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 1;
AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 1;

//选择在接收到 SOCx 时要转换的通道
AdcRegs.ADCSOC0CTL.bit.CHSEL=0;//在接收到 SOC0时转换 ADC-A0 (CH0)
AdcRegs.ADCSOC1CTL.bit.CHSEL=1;//在收到 SOC1时转换 ADC-A1 (CH1)
AdcRegs.ADCSOC2CTL.bit.CHSEL=2;
AdcRegs.ADCSOC4CTL.bit.CHSEL=4;
AdcRegs.ADCSOC5CTL.bit.CHSEL=5;
AdcRegs.ADCSOC6CTL.bit.CHSEL=6;
AdcRegs.ADCSOC8CTL.bit.CHSEL=8;
AdcRegs.ADCSOC9CTL.bit.CHSEL=9;//在收到 SOC9时转换 ADC-B1 (CH9)
AdcRegs.ADCSOC10CTL.bit.CHSEL=10;
AdcRegs.ADCSOC12CTL.bit.CHSEL=12;
AdcRegs.ADCSOC14CTL.bit.CHSEL=14;


EDIS;

AdcRegs.ADCSOCFRC1.ALL = 0x1000;//通过引起 SOC12事件来启动 ADC


InitEPwm1Examples();
InitEPwm2Examples();
InitEPwm3Examples();

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.TINT0 =&CPU_timer0_ISR;
PieVectTable.TINT1 =&CPU_Timer1_ISR;
PieVectTable.TINT2 =&CPU_timer2_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

//步骤4. 初始化器件外设。 该函数可以是
//可在 F2806x_CpuTimers.c 中找到
InitCpuTimer();//对于此示例,只初始化 CPU 计时器

//将 CPU 定时器0、1和2配置为每秒中断一次:
// 80MHz CPU 频率,1秒周期(以 uSeconds 为单位)

ConfigCpuTimer (&CpuTimer0、80、60);
ConfigCpuTimer (&CpuTimer1、80、1000000);
ConfigCpuTimer (&CpuTimer2、80、1000000);

//为了确保精确的时序,使用只写指令写入整个寄存器。 因此、如果有的话
配置位的//在 ConfigCpuTimer 和 InitCpuTimers (在 F2806x_CpuTimer.h 中)中更改、
//下面的设置也必须更新。

CpuTimer0Regs.TCR.ALL = 0x4001;//使用只写指令将 TSS 位设置为0
CpuTimer1Regs.TCR.ALL = 0x4001;//使用只写指令将 TSS 位设置为0
CpuTimer2Regs.TCR.ALL = 0x4001;//使用只写指令将 TSS 位设置为0

//步骤5. 特定于用户的代码、启用中断:


//启用连接到 CPU 定时器0、CPU INT13的 CPU INT1
//连接到 CPU 定时器1,CPU int 14连接
//到 CPU 定时器2:
IER |= M_INT1;
IER |= M_INT13;
IER |= M_INT14;

//在 PIE 中启用 TINT0:组1中断7
PieCtrlRegs.PIEIER1.bit.INTx7=1;

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

///默认值
//将输出继电器设置为打开
GpioDataRegs.GPADD.bit.GPIO19=1;//pin 25 relay1打开
GpioDataRegs.GPADD.bit.GPIO16=1;//引脚24 Relay2打开


//步骤6. 空闲循环。 只需坐下来循环(可选):
for (;;);


中断空 CPU_timer0_ISR (空)

CpuTimer0.InterruptCount++;

GpioDataRegs.GPADD.bit.GPIO18 = 1;//用于控制环路时序
W= 2*PI*50;
//w2= 120* pi/180;

如果(t>=100)
T=0;
t = t + 60e-6;

EPwm1Regs.CMPA.half.CMPA =(800*sin (w*t)+ 800);
EPwm1Regs.CMPB =(800*sin (w*t)+ 800);

EPwm2Regs.CMPA.half.CMPA =(800*sin (w*t)+ 800);
EPwm2Regs.CMPB =(800*sin (w*t)+800);

//EPwm3Regs.CMPA.half.CMPA =(1000*sin (w*t-(w2)+1000);
//EPwm3Regs.CMPB =(1000*sin (w*t-(w2)+1000);
V=(AdcResult.ADCRESULT0*3.3)/4095;

if (j>334)
J=0;
CH1[j]=V;
J=j+1;


GpioDataRegs.GPADAT.bit.GPIO18 = 0;

//确认此中断以从组1接收更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

中断空 CPU_Timer1_ISR (空)

CpuTimer1.InterruptCount++;
// CPU 确认中断。


中断空 CPU_timer2_ISR (空)
{EALLOW;
CpuTimer2.InterruptCount++;


GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;//每个周期切换 GPIO34一次


EDIS;
// CPU 确认中断。



空 InitEPwm1Examples()

//设置 TBCLK
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器

//设置比较值
EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA;//设置比较 A 值
EPwm1Regs.CMPB = EPWM1_MAX_CMPB;//设置比较 B 值

//设置计数器模式
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//设置隐藏
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

//设置操作
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM1A、递增计数
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM1A,递减计数

EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;//在事件 B 上设置 PWM1B、递增计数
EPwm1Regs.AQCTLB.bit.CBD = AQ_SET;//在事件 B 上清除 PWM1B,倒计数
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
//EPwm1Regs.DBFED = 170;// FED = 50 TBCLK
//EPwm1Regs.DBRED = 170;//最初红色= 50 TBCLK

空 InitEPwm2Examples()

//设置 TBCLK
EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm2Regs.TBPHS.Half.TBPHS = 0;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器

//设置比较值
EPwm2Regs.CMPA.half.CMPA = EPWM2_MIN_CMPA;//设置比较 A 值
EPwm2Regs.CMPB = EPWM2_MIN_CMPB;//设置比较 B 值

//设置计数器模式
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//设置隐藏
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

//设置操作
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM1A、递增计数
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM1A,递减计数

EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR;//在事件 B 上设置 PWM1B、递增计数
EPwm2Regs.AQCTLB.bit.CBD = AQ_SET;//在事件 B 上清除 PWM1B,倒计数
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
//EPwm2Regs.DBFED = 170;// FED = 50 TBCLK
//EPwm2Regs.DBRED = 170;//最初红色= 50 TBCLK

EPwm2Regs.AQCTLB.bit.ZRO = 0;//清零 PWM2B
EPwm2Regs.AQCTLB.bit.PRD = 1;//设置 PWM2B 导通周期


空 InitEPwm3Examples(空)

//设置 TBCLK
EPwm3Regs.TBPRD = EPWM3_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm3Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm3Regs.TBCTR = 0x0000;//清除计数器

//设置比较值
EPwm3Regs.CMPA.half.CMPA = EPWM3_MIN_CMPA;//设置比较值
EPwm3Regs.CMPB = EPWM3_MIN_CMPB;//设置比较 B 值

//设置计数器模式
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;

//设置隐藏
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

//设置操作
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM1A、递增计数
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;//在事件 A 上清除 PWM1A,递减计数

EPwm3Regs.AQCTLB.bit.CBU = AQ_CLEAR;//在事件 B 上设置 PWM1B、递增计数
EPwm3Regs.AQCTLB.bit.CBD = AQ_SET;//在事件 B 上清除 PWM1B,倒计数
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
//EPwm3Regs.DBFED = 170;// FED = 50 TBCLK
//EPwm3Regs.DBRED = 170;//最初为50 TBCLK

EPwm3Regs.AQCTLB.bit.ZRO = 0;//清零 PWM3B
EPwm3Regs.AQCTLB.bit.PRD = 1;//设置 PWM3B 打开周期


我应该怎么做? 我对其进行了错误编程吗?  

谢谢你