工具/软件:Code Composer Studio
我只想为单相逆变器构建迟滞控制器。 我使用信号生成模块生成80Hz 1Sin 振幅信号作为电流基准信号。 我使用 ADC 读取 LEM 以测量实际电流信号。 这两个信号将产生一个误差信号,用于与增带和减带进行比较。 这将产生一个互补 PWM 组合。 这是一个问题、我能够生成互补 PWM 信号。 Lem 和 ADC 都经过了良好校准。 我使用 RL 负载并使用相位2和相位3。 代码似乎一切正常、每个器件都经过良好的单独调试和测试。 但是、当我通过可变直流源施加直流链路电压时、我使用2A、20V 电压、没有电流流过。 我不知道为什么、下面给出了代码、有人可以看一下、给我一些建议吗? 我只想使用没有比较器的强制软件、这将是下一个阶段。
//用于错误识别的组合 ADC 和信号生成代码(用于互补 PWM)
//
// ADC:
// ADC A2 SOC0---> LEM V --- > AdcResultsa1
// ADC B0 SOC0---> Vfb-bus --- > AdcResultsb1.
//
// ePWM:
// EPWM4A-->20kHz SOCA LEM 和 DC_LINK ADC
// PWM2A --> PWMvH
// PWM2B --> PWMvL
// PWM3A --> PWMwH
// PWM3B --> PWMwL
//
//##############################################################################################################
//
//包含的文件
//
#include "F28x_Project.h"
#include "IQmathLib.h"// IQ 数学
#include //信号生成(16位)
//
//函数原型
//
void SignalGeneration (void);//
void ConfigureEPWM (void);//
void ConfigureADC (void);//
void SetupADCEPWM (void);//
中断 void adca1_ISR (void);//
中断 void adcb1_ISR (void);//
//
//信号生成(电流基准)
//
SGENT_1 sgen = SGENT_1_DEFAULTS;//
float32 sg_final;//
//
// ADCa1-LEM 相位 u
//
float32 AdcResultsa1;//
#define ADC_OFFSET 1.65;//
#define ADC_SCALE 3/4096;//
#define ADC_GAIN 10.2852;//针对交流7.2727针对直流
float32 Adca1_one;
float32 Adca1_second;//
volatile float32 Adca1_final;//
//
//互补 PWM 计算过程
//
uint32符号;
float32错误;//
//
// adC-b0表示直流链路电压
//
float32 AdcResultsb1;//
//
//主代码
//
void main (void)
{
//步骤1. 初始化系统控制
//禁用看门狗系统时钟200MHz
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
InitSysCtrl();
//
//步骤2. 初始化系统 GPIO
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
InitGpio();//
InitEPwm2Gpio();//初始化 EPWM4 GPIO 2 3 4、上拉和多路复用器
InitEPwm3Gpio();
InitEPwm4Gpio();
//
//步骤3. 清除所有中断、初始化 PIE 矢量表和系统中断
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Dint;//禁用所有中断
InitPieCtrl();
IER = 0x0000;//
IFR=0x0000;//
InitPieVectTable();//
IER |=M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//
EALLOW;//
PieVectTable.ADCA1_INT=&adca1_ISR;// ADCA 中断的函数1.
PieVectTable.ADCB1_INT=&adcb1_ISR;// ADCA 中断的函数2.
EDIS;//
PieCtrlRegs.PIEIER1.bit.INTx1=1;// ADCA1中断
PieCtrlRegs.PIEIER1.bit.INTx2=1;// ADCB1中断
//步骤4. 信号生成模块配置
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SignalGeneration();
//步骤5. PWM 配置
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EALLOW;//
CpuSysRegs.PCLKCR2.bit.EPWM2=1;//启用 EPWM2 3 4时钟
CpuSysRegs.PCLKCR2.bit.EPWM3=1;
CpuSysRegs.PCLKCR2.bit.EPWM4=1;
EDIS;//
EALLOW;//
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;//
EDIS;//
ConfigureEPWM();
EALLOW;//
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;//
EDIS;//
//步骤6. ADC 配置
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ConfigureADC();
SetupADCEPWM();
//步骤7. 参数初始化
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sign=0;//
//
//主代码
//
while (1)
{
静态 float32 ERROR_P= 0.3;// 0.3A
静态 float32 ERROR_N=-0.3;//-0.3A
静态 float32 CURRENT_P=3;// 3A 限制
静态 float32 CURRENT_L=-3;//-3A 限制
//
//信号生成模块
//
sgen.calc(&sgen);
sg_final =_IQ15toF (sgen.out);//将 IQ15数字转换为浮点数
error= sg_final - Adca1_final;
如果(ERROR > ERROR_P)
{
sign=1;
EPwm2Regs.AQCSFRC.bit.CSFA=2;// EPWM2A 设置为高电平
EPwm2Regs.AQCSFRC.bit.CSFB=1;// EPWM2B 设置为低电平
EPwm3Regs.AQCSFRC.bit.CSFA=1;// EPWM3A 设置为低电平
EPwm3Regs.AQCSFRC.bit.CSFB=2;// EPWM3B 置为高电平
}
否则、如果(ERROR < ERROR_N)
{
sign=2;
EPwm2Regs.AQCSFRC.bit.CSFA=1;// EPWM2A 设置为低电平
EPwm2Regs.AQCSFRC.bit.CSFB=2;// EPWM2B 设置为高电平
EPwm3Regs.AQCSFRC.bit.CSFA=2;// EPWM3A 设置为高电平
EPwm3Regs.AQCSFRC.bit.CSFB=1;// EPWM3B 置为低电平
}
否则、如果(Adca1_final > Current_P || Adca1_final < Current_L)
{
sign=3;
EPwm2Regs.AQCSFRC.bit.CSFA=1;//持续低电平2A
EPwm2Regs.AQCSFRC.bit.CSFB=1;//持续低2B
EPwm3Regs.AQCSFRC.bit.CSFA=1;//持续低电流3A
EPwm3Regs.AQCSFRC.bit.CSFB=1;//持续低3B
}
}
}
//
//信号生成函数原型
//
void SignalGeneration (空)
{
sgen.freq=8590;// 80Hz 信号
sgen.step_max=1000;//最大频率= 302.57Hz
sgen.alpha=0;//无相移
sgen.gain=0x7fff;// q15中的 gain=1
sgen.offset=0;//无直流偏移
}
//
// ePWM 函数原型
//
空配置 EPWM (空)
{
EALLOW;
//
// v 相的 EPWM2
//
EPwm2Regs.TBCTL.bit.HSPCLKDIV=0;//除以1
EPwm2Regs.TBCTL.bit.CLKDIV=0;//除以1
EPwm2Regs.AQSFRC.bit.RLDSF=3;//强制软件立即加载
//
// EPWM2死区
//
EPwm2Regs.DBCTL.bit.out_mode=3;// DBM 已完全启用
EPwm2Regs.DBCTL.bit.POLSEL=2;//高电平有效互补
EPwm2Regs.DBCTL.bit.IN_MODE=0;// EPWMA 是下降沿和上升沿延迟的源
EPwm2Regs.DBRED.bit.DBRED=200;//死区时间2us
EPwm2Regs.DBFED.bit.DBFED=200;//死区时间2us
//
// EPWM3用于 w 相
//
EPwm3Regs.TBCTL.bit.HSPCLKDIV=0;//除以1
EPwm3Regs.TBCTL.bit.CLKDIV=0;//除以1
EPwm3Regs.AQSFRC.bit.RLDSF=3;//强制软件立即加载
//
// EPWM3死区
//
EPwm3Regs.DBCTL.bit.out_mode=3;// DBM 已完全启用
EPwm3Regs.DBCTL.bit.POLSEL=2;//高电平有效互补
EPwm3Regs.DBCTL.bit.IN_MODE=0;// EPWMA 是下降沿和上升沿延迟的源
EPwm3Regs.DBRED.bit.DBRED=200;//死区时间2us
EPwm3Regs.DBFED.bit.DBFED=200;//死区时间2us
//
// EPWM4用于 LEM 和 DC_LINK
//
EPwm4Regs.ETSEL.bit.SOCAEN=1;//启用 ADC SOCA 脉冲
EPwm4Regs.ETSEL.bit.SOCASEL=2;//当事件计数器等于周期时启用 SOCA
EPwm4Regs.ETPS.bit.SOCAPRD=1;//在第一个事件上生成 SOCA 脉冲
EPwm4Regs.TBCTL.bit.HSPCLKDIV=0;//除以1
EPwm4Regs.TBCTL.bit.CLKDIV=0;//除以1
EPwm4Regs.TBPRD=5000;// EPWMCLK 100MHz 20kHz 周期 ePWM
EPwm4Regs.TBCTL.bit.CTRMODE=0;//向上计数模式
EDIS;
}
//
// ADC 配置函数原型
//
空配置 ADC (空)
{
EALLOW;
//
//可调整
//
AdcaRegs.ADCCTL2.bit.prescale=6;// 200MHz/4=50MHz ADCCLK
AdcSetMode (ADC_ADCA、ADC_Resolution_12位、ADC_SIGNALMODE_SINGLE);//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;//转换结束时产生中断脉冲
AdcaRegs.ADCCTL1.bit.ADCPWDNZ=1;//为 ADC 加电
//
// ADCB
//
AdcbRegs.ADCCTL2.bit.prescale=6;// 200MHz/4=50MHz ADCCLK
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);//
AdcbRegs.ADCCTL1.bit.INTPULSEPOS=1;//
AdcbRegs.ADCCTL1.bit.ADCPWDNZ=1;
DELAY_US (1000);//延迟1ms 以允许 ADC 加电时间
EDIS;
}
void SetupADCEPWM (void)
{
EALLOW;
//
// LEM Adca SOC0
//
AdcaRegs.ADCSOC0CTL.bit.CHSEL=2;// ADCA 的 SOC0将转换引脚 A2 (LEM)
AdcaRegs.ADCSOC0CTL.bit.ACQPS=14;// 75ns 采样充电时间
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL=11;// ePWM4 SOCA 上的触发器
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL=0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E=1;// ADCAINT1中断被启用
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1=1;// INT1标志被清除
//
//直流链路电压 ADCB SOC0
//
AdcbRegs.ADCSOC0CTL.bit.CHSEL=0;// ADCB 的 SOC0将转换引脚 B0 (DC-link)
AdcbRegs.ADCSOC0CTL.bit.ACQPS=14;// 75ns 采样充电时间
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL=11;// ePWM4 SOCA 上的触发器
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL=0;// SOC0结束将设置 INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E=1;// ADCbINT1中断被启用
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1=1;// INT1标志被清除
EDIS;
}
//
// Adca1中断 LEM 结果
//
中断 void adca1_ISR (void)
{
AdcResultsa1=(_iq12) AdcResultRegs.ADCRESULT0;
Adca1_one=AdcResultsa1 * adc_scale;
Adca1_second= Adca1_one - adc_offset;
Adca1_final = Adca1_second* adc_gain;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1=1;// INT1标志被清除
PieCtrlRegs.PIEACK.All= PIEACK_Group1;
}
//
// Adcb1中断 DC_link 电压结果
//
中断空 adcb1_ISR (空)
{
AdcResultsb1=AdcbResultRegs.ADCRESULT0;// 16位 ADC 结果
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1=1;// INT1标志被清除
PieCtrlRegs.PIEACK.All= PIEACK_Group1;
}