主题中讨论的其他器件:C2000WARE
工具/软件:Code Composer Studio
大家好、我正在为 SEPIC 转换器控制执行电流编程模式。 我想知道如何使用斜坡发生器和目标的比较器块来实现它。
我尝试执行下一个代码、但示波器中的信号为100kHz 99%占空比。 我想获取50%占空比信号。 感谢你能抽出时间
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
#include
#include
//f deseada en kHz
float f=100;
浮点周期=90000/100;
浮子 TOFF;
浮点 h;
float vo;
浮点 IO;
浮点 IP;
浮动 VP;
float VP=0;
float io=0;
float IP=0;
浮点 Vo=0;
int contador = 0;
浮子 KP=0.2990;
float Ki = 676.7921;
float TM=1/100000;
float Vref=0;
float Salpi[2];
float EntPI[2];
悬空 ACW;
//此文件中找到的函数的原型语句。
void ADC_Config (void);
空 InitEPwm2 (空);
void InitEPwm2Gpio (void);
MAIN ()
{
InitSysCtrl();
InitEPwm2Gpio();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
InitAdc ();//对于此示例,初始化 ADC
AdcOffsetSelfCal();
IER |= M_INT14;
PieCtrlRegs.PIEIER1.bit.INTx7=1;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//配置 GPIO
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//禁用 GPIO0上的上拉电阻(EPWM1A)
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;//禁用 GPIO1上的上拉电阻(EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;//将 GPIO0配置为 EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;//将 GPIO1配置为 EPWM1B
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//禁用 GPIO2上的上拉电阻(EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//禁用 GPIO3上的上拉电阻(EPWM2B)
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将 GPIO2配置为 EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;//将 GPIO3配置为 EPWM2B
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1;//禁用 GPIO4上的上拉电阻(EPWM3A)
GpioCtrlRegs.GPAPUD.bit.GPIO5=1;//禁用 GPIO5上的上拉电阻(EPWM3B)
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//将 GPIO4配置为 EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;//将 GPIO5配置为 EPWM3B
GpioCtrlRegs.GPADIR.bit.GPIO4=1;
GpioCtrlRegs.GPADIR.bit.GPIO5=1;
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO8上的上拉电阻(EPWM5A)
GpioCtrlRegs.GPAMUX1.bit.GPIO8=1;//将 GPIO1配置为 EPWM5A
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 2;
//将 GPIO31配置为 GPIO 输出引脚(Evalkit 蓝色 LED)
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
//红色 OCP LED
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
// GPIO 10作为输入(使能开关)
GpioCtrlRegs.GPAPUD.bit.GPIO10=1;//禁用 GPIO10上的上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0;// GPIO10 = GPIO10
GpioCtrlRegs.GPADIR.bit.GPIO10 = 0;// GPIO10 =输入
GpioCtrlRegs.GPACTRL.bit.QUALPRD1=10;//双周期= SYSCLKOUT/10
GpioCtrlRegs.GPAQSEL1.bit.GPIO10=2;// 6个样本
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//电源 ADC 带隙
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//电源基准
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//电源 ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部带隙
EDIS;
InitEPwm2();
PieCtrlRegs.PIEIER1.bit.INTx7=1;
//在 PIE 中启用 ePWM INTn:组2中断1
PieCtrlRegs.PIEIER2.bit.INTx1 = 1;
//在 PIE:组3中断1中启用 EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//在 PIE:组3中断2中启用 EPWM2_INT
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
//在 PIE:组3中断4中启用 EPWM4_INT
PieCtrlRegs.PIEIER3.bit.INTx4 = 1;
//在 PIE:组1中启用 ADC
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
//启用全局中断和更高优先级的实时调试事件:
PieCtrlRegs.PIEACX.ALL = 0xFFFF;
//等待 ADC 中断
}
空 InitEPwm2Gpio (空)
{
EALLOW;
/*禁用所选输出引脚的内部上拉电阻
以降低功耗*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//禁用 GPIO2上的上拉电阻(EPWM2A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//禁用 GPIO3上的上拉电阻(EPWM2B)
/*使用 GPIO 寄存器配置 EPWM-2引脚*/
//这指定哪些可能的 GPIO 引脚将是 EPWM2功能引脚。
//注释掉其他不需要的行。
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将 GPIO2配置为 EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;//将 GPIO3配置为 EPWM2B
EDIS;
}
空 InitEPwm2()
{
EALLOW;
// fórmula 40MHz/50kHz=800周期、TBCLK 计数
EPwm1Regs.TBPRD =周期;
//EPwm1Regs.TBPHS.Half.TBPHS = 0;
//EPwm1Regs.TBPHS = 0x0000;//将相位寄存器设置为零
EPwm1Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零
EPwm1Regs.TBCTR = 0;//清除 TB 计数器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//相位加载被禁用
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;// TBCLK = SYSCLK
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;// CTR 上的负载=零
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
//
//运行时间
//==== ===== ===== ===== ====
//EPwm1Regs.CMPA.half.CMPA = 0.5;//调整输出 EPWM1A 的占空比
Comp1Regs.COMPCTL.bit.COMPDACEN = 1;
Comp1Regs.COMPCTL.bit.SYNCSEL = 1;
Comp1Regs.COMPCTL.bit.CMPINV = DC_BLANK_NOTINV;
Comp1Regs.COMPCTL.bit.COMPSOURCE = 0;
Comp1Regs.COMPCTL.bit.QUALSEL = 0;
COMP1Regs.DACCTL.bit.RAMPSOURCE = 0;
Comp1Regs.DACCTL.bit.DACSOURCE = 1;
COMP1Regs.DACCTL.bit.FREE_SOFT = 0;
COMP1Regs.DACVAL.ALL = 1024;
Comp1Regs.RAMPDECVAL_Shdw = 20000;
COMP1Regs.RAMPMAXREF_Shdw = 49000;
Comp1Regs.DACVAL.bit.DACVAL=310;
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL=0;// DCAH =比较器输出
EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL=8;
EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_HI;// DCAEVT2 =(当比较器输出变为高电平时将变为有效)
EPwm1Regs.DCACTL.bit.EVT2SRCSEL = 1;//DC_EVT2;// DCAEVT2 = DCAEVT2 (未滤波)
EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = 1;//采用同步路径
EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI;// EPWM1A 将变为低电平
EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;// EPWM1A 将变为低电平
EPwm1Regs.TZEINT.BIT.DCAEVT2 = 1;
EPwm1Regs.DCFCTL.bit.PULSESEL = 0;//时基计数器等于零(TBCTR = 0x0000)-开始空定时器
EPwm1Regs.DCFCTL.bit.BLANKINV=0;
EPwm1Regs.DCFCTL.bit.Blanke=1;
EPwm1Regs.DCFCTL.bit.SRCSEL = 3;//源是 DCAEVT2信号
EPwm1Regs.DCFOFFSET = 0;//无偏移
EPwm1Regs.DCFWINDOW = 255;//消隐窗口
EDIS;
}