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.

[参考译文] CCS/TMS320F28379D:DesignDRIVE 单相逆变器迟滞控制器

Guru**** 2580485 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/685067/ccs-tms320f28379d-designdrive-single-phase-inverter-hysteresis-controller

器件型号:TMS320F28379D

工具/软件: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;

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

    在设置矢量之前、中断看起来是被启用的。 没有 ISR。 建议从控制套件复制一些工作项目、根据您的需求对其进行修整、然后重做费用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    序列正常,我可以正确地看到 ADC 结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Min、

    看起来您没有在 PWM2和 PWM3的 TBPRD 寄存器中编程值。 我认为您应该使用一个大于您可能的最大死区值的值(此处代码中为200)、否则死区可能会耗尽所有 PWM 脉冲。 我会将其设为最大死区值的2倍甚至5倍、因为这一点无论如何都不重要、因为 PWM 输出直接由 s/w 控制

    但愿这对您有所帮助。

    Hrishi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好,我把 TBPRD 修改为1000和400,系统仍然不工作,我不知道我是否需要做一些 CTRMODE? 我将其设置为0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Min、

    您是否能够解决此问题?

    如果没有、您是否尝试查看 ADC 结果? 它们是否有可能一直满足这个条件-(Adca1_final > Current_P || Adca1_final < Current_L)? 或者、它们永远不能满足这两个条件中的任何一个-(ERROR > ERROR_P)和(ERROR < ERROR_N)?

    Hrishi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我解决了问题 thx。 没关系