您好!
最近、我一直在尝试对 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 打开周期
}
我应该怎么做? 我对其进行了错误编程吗?
谢谢你