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.
您好!
在 F280049上使用 ePWM 模块的半桥逆变器正弦输出电压存在失真问题。
此设计通过 ePWM2A 和 ePWM2B 输出的互补输出生成正弦 PWM。 以下是与代码相关的片段:
/*------------------------------------------------------------------------------------------------------------------------------------------ */
/*--PWM 初始化--*/
EALLOW;
//时基子模块寄存器
ePWM_setPeriodLoadMode (base、ePWM_Period_shadow_load);
EPWM_setTimeBaseCounterMode (base、EPWM_COUNTER_MODE_UP_DOWN);
EPWM_disablePhaseShiftLoad (base);
ePWM_setClockPrescaler (base、ePWM_CLOCK_DIVIDER_1、ePWM_HSCLOCK_DIVIDER_1);
ePWM_setTimeBasePeriod (base、PWM_PERIOD_TICK);//设置 PWM 周期
EPWM_setTimeBaseCounter (base、0);
EPWM_setPhaseShift (base、0);
//计数器比较子模块寄存器
EPWM_setCounterCompareValue (base、EPWM_COUNTER_COMPARE_A、0);
EPWM_setCounterCompareValue (base、EPWM_COUNTER_Compare_B、0);
EPWM_setCounterCompareShadowLoadMode (base、EPWM_COUNTER_COMPARE_A、EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareShadowLoadMode (base、EPWM_COUNTER_COMPARE_B、EPWM_COMP_LOAD_ON_CNTR_ZERO);
//设置为立即模式
EPWM_disableCounterCompareShadowLoadMode (base、EPWM_COUNTER_COMPARE_A);
EPWM_disableCounterCompareShadowLoadMode (base、EPWM_COUNTER_COMPARE_B);
//动作限定器子模块寄存器
//要开始,请不要将 PWM 配置为执行任何操作
HWREGH (base + ePWM_O_AQCTLA)=0;
HWREGH (base + ePWM_O_AQCTLB)=0;
EPWM_setActionQualifierAction (base、EPWM_AQ_OUTPUT_A、
ePWM_AQ_OUTPUT_HIGH、ePWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction (base、EPWM_AQ_OUTPUT_A、
ePWM_AQ_OUTPUT_LOW、ePWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
//互补 PWM,OUTA 和 OUTB 的 PWMA 源
EPWM_setDeadBandCounterClock (base、EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
EPWM_setRisingEdgeDelayCount (base、PWM_dbred_ticks);
EPWM_setFallingEdgeDelayCount (base、PWM_dbred_ticks);
ePWM_setDeadBandDelayMode (base、ePWM_DB_RED、TRUE);//寄存器 DBCTL 位 OUT_MODE;S1=1->信号路径中的红色
ePWM_setDeadBandDelayMode (base、ePWM_DB_FED、TRUE);//寄存器 DBCTL 位 OUT_MODE;S0=-> FED IN B 信号路径
ePWM_setRisingEdgeDeadBandDelayInput (base、ePWM_DB_INPUT_EPWMA);//寄存器 DBCTL 位 in_mode;S4=0 -> RED 和 FED 的输入信号 ePWMA
ePWM_setFallingEdgeDeadBandDelayInput (base、ePWM_DB_INPUT_EPWMA);//Reg DBCTL 位 DEDB_MODE (S8)=0;IN_MODE S5=0 ->馈送的输入信号 ePWMA
EPWM_setDeadBandDelayPolarity (base、EPWM_DB_FED、EPWM_DB_POLICY_ACTIVE_LOW);// Reg DBCTL 位 POLSEL (S3)=1 -> OUTB 反转
EPWM_setDeadBandDelayPolarity (base、EPWM_DB_RED、EPWM_DB_POLICY_ACTIVE_HIGH);//Reg DBCTL 位 POLSEL (S2)=0->OUTA 未反转
/*--ISR 中的 PWM 在开环中生成--*/
invDutyPU =(spll1.sine)* invVoRefInst * 0.8;
invDutyPU=(invDutyPU>(Float)(0.8)?(float)(0.8):invDutyPU;
invDutyPU=(invDutyPU<(float)(-0.8)?(float)(-0.8):invDutyPU;
EPWM_setCounterCompareValue (INV_PWM_BASE、EPWM_COUNTER_COMPARE_A、(uint16_t)(pwmDutyVar +(pwmDutyVar*invDutyPU)));//pwmDutyVar 是 PWM 周期计数的一半
/*------------------------------------------------------------------------------------------------------------------------------------------ */
请参阅使用上述代码生成的输出电压波形(随附图像中的蓝色波形)。 在负半个周期内、波形出现小幅失真。 为了确保失真是由 PWM 模块生成的 PWM 导致的、我们交换了逆变器晶体管驱动器输出、保持输入不变。 然后失真出现在正半周期。
您能帮助我们了解一下这是否与我们怀疑的 PWM 生成相关吗?
此致、
维贾伊
Vijay、您好!
您是否有可能直接获得 PWM 输出的示波器屏幕截图? 也许我们会发现一些故障、即 PWM 输出与基于配置代码的预期输出不匹配。
谢谢!
卢克
Luke、您好!
请在下图中查看微控制器的 PWMA 和 PWMB 的 PWM 输出波形。
此致、
维贾伊
感谢 Vijay、
您的 PWM 输出似乎有很大的噪声。 这可能是正弦波输出出现毛刺脉冲的原因。 在正占空比期间、PWM 周期开始时会出现非常大的尖峰。 您能否确定导致此噪声的原因可能是什么?
谢谢!
卢克
Luke、您好!
我们将研究并消除干扰。 同时、我们在栅极驱动器输入端添加了一个小型滤波器来滤除噪声。 请在下方查看栅极驱动器输入引脚处的波形。 噪声降到最低、但逆变器输出中的失真问题仍然存在。
Vijay、您好!
在您刚刚发送的图像中、PWM 输出似乎没有任何问题。 如果您可以指出 PWM 输出似乎有问题的特定内容、我可以帮助您找到正确的配置。 但是、问题似乎出在逆变器本身。 我会将该主题分配给另一位可以更好地为您提供帮助的专家。
与此同时、您应用滤波器后能否发送逆变器输出的更新示波器屏幕截图?
谢谢!
卢克
Luke、您好!
如果 有人能指导您的工作、那将非常有帮助。 正如我在初始消息中所说的、当驱动晶体管的 PWM 输出发生相互作用时、失真会从负半周期变为正半周期。 如果逆变器中存在问题、而不是 PWM 生成问题、则当 PWM 输出互换时、失真不应从正半周期变为负半周期。
此致、
维贾伊
Vijay、您好!
为了帮助尝试并找到能够 提供适当帮助的专家、 在创建系统时、您是否参考了任何参考设计或 C2000库(例如数字电源或电机控制)?
此致、
阿米尔·奥马尔
Vijay、即使在没有负载的情况下您是否也碰巧观察到失真?
您好、Omer:
我们曾审阅过 Digital Power SDK 中的设计、将其作为类似工作概念的参考(\DigitalPowerSDK\C2000 Ware_Digital SDK_3_01_00_00\solutions\tidm_hv_1ph_dcac)、但我们拥有的系统(硬件和软件)是我们自己的设计。
上述设计是额定电压为600VA 的全桥逆变器、而我们拥有的逆变器是额定电压为3000VA 的半桥逆变器。
此致、
维贾伊·利马耶
你好、Navaneeth:
我们观察到的失真在轻阻性负载上。 如果负载有问题、为什么当驱动器输出相互改变时、失真会从负半周期 tp 正半周期变为其他周期?
此致、
维贾伊
Vijay、您好!
我将 在 F28004x 控制卡上尝试您的代码、并告知您。 PWM 波形以固定间隔(7.5us)失真。 随机代码可能导致此问题(也可能来自硬件)。
请等待2天等待我的答复。
谢谢。此致、
乌坦姆
Uttam 您好、
感谢你的帮助。 如前所述、为了验证逆变器输出中的失真是否由于 PWM 中的失真导致、我们在驱动器输入之前添加了 RC 滤波器。 请参阅之前的回复中使用滤波器的驱动器输入 PWM 波形。 与清理滤波器的 PWM 波形一样、反相器中的失真仍保持不变。
此致、
维贾伊
Vijay、您好!
代码看起来不错。
我想知道 C2000器件是在硬件上(基板)还是在您的应用中使用 controlCARD。 如果是 controlCARD、我们可以在没有基板的情况下运行代码、并查看是否正确生成了 PWM?
此致!
乌坦姆
Vijay、您好!
请问您是否仍然看到此问题?
谢谢。此致、
乌坦姆
Uttam 您好、
C2000器件位于我们定制的电路板上。 问题仍然存在。
此致、
维贾伊
Vijay,
在 PWM 上添加 RC 滤波器后、您可以共享输出电流波形吗? 为了进一步调试、
1.这可能是由于硬件上的交叉耦合、如果您愿意与我们分享硬件设计以供专家审阅、请告诉我。
2. 您是否可以在 任何 LaunchPad/控制卡上运行相同的开环代码、然后探测 PWM 输出以确认 SW 具有任何不对称中断导致该代码。 (或者)我可以看看代码、并从终端开始尝试。
此致、
乌坦姆
Uttam 您好、
我将研究从 controlCARD 运行此代码并检查结果的可能性。 这应该能够明确问题是硬件还是软件。
此致、
维贾伊
Uttam 您好、
我们使用 F280049C controlCARD 测试了相同的代码。 请参阅随附的快照-使用 controlCARD 的 PWM 输出时出现相同的失真。
此致、
Vijay、您好!
感谢您在控制卡上对其进行测试。 您能否探测控制卡的 PWM 输出并在此处分享代码片段?
此致、
乌坦姆
Uttam 您好、
请查看 controlCARD PWM 输出快照。
此致、
维贾伊
Vijay、您好!
我认为这可能是由于后台运行了一些外部代码造成的。 您能否与我分享代码以便我可以在控制卡上运行它、以便为您提供更好的帮助。 同时、我也可以向其他专家提问。
谢谢。此致、
乌坦姆
Uttam 您好、
请参阅下面逆变器 PWM 的 ISR 代码。
dcBusVoltageSamplePU =((float32_t)(READ_DC_BUS_AD_RESULT2)*ADC_PU_SCALE_factor;
offset1V65SamplePU =((float32_t)(READ_OFFSET1V65_AD_RESULT))* adc_pu_scale_factor;
inverterOut.i =((((float32_t)(READ_OP_CUR_AD_RESULT))*ADC_PU_SCALE_FACTOR)-(偏移1V65PU))*2.0;
inverterout.v =((((float32_t)(READ_INV_VOLT_AD_RESULT))* adc_pu_SCALE_factor)-(offset1V65pu))* 2.0;
inputVoltageLE.v =((((float32_t)(READ_IP_VOLT_LE_AD_RESULT))*ADC_PU_SCALE_factor)- offset1V65PU)*2.0;
//闭合电压和电流环路
invVoRefInst = sinf (0.007853981634 * sampleCount)* invVoRef * 0.8;
VOLTAGE_ERROR= invVoRefInst - inverterOut.v;
gv_out= DCL_runDF22_c1 (&gv_pr1、volte_error)
+ DCL_runDF22_C1 (&gv_r3、VOLTAGE_ERROR)
+ DCL_runDF22_C1 (&gv_R5、VOLTAGE_ERROR)
+ DCL_runDF22_c1 (&gv_r7、voltage_error);
gv_out=(gv_out>(float)(0.8)?(float)(0.8):gv_out;
gv_out=(gv_out<(float)(-0.8)?(float)(-0.8):gv_out;
gv_lead_lag_out= DCL_runDF22_c1 (&gv_lead_lag、gv_out);
gv_lead_lag_out=(gv_lead_lag_out>(float)(0.8)?(float)(0.8):gv_lead_lag_out;
gv_lead_lag_out=(gv_lead_lag_out<(float)(-0.8)?(float)(-0.8):gv_lead_lag_out;
invIoRefInst =(gv_lead_lag_out);
GI_OUT= DCL_runDF22_C1 (&gi、(invIoRefInst - inverterOut.I));
gi_out=(gi_out>(float)(0.8)?(float)(0.8):gi_out;
gi_out=(gi_out<(float)(-0.8)?(float)(-0.8):gi_out;
invDutyPU= invVoRefInst;
if ((enable)&&(ONOFF))
{
INV_PWMH_OFF = 0x0;
INV_PWML_OFF = 0x0;
if (invVoRef < 1.0)
{
invVoRef+= INV_VO_REF_INC_PU;
}
否则
{
invVoRef = 1.0;
}
}
否则
{
INV_PWMH_OFF = 0x01;
INV_PWML_OFF = 0x01;
invVoRef = 0.0;
}
invDutyPU=(invDutyPU>(Float)(0.8)?(float)(0.8):invDutyPU;
invDutyPU=(invDutyPU<(float)(-0.8)?(float)(-0.8):invDutyPU;
//逆变器 PWM 更新
INV_PWM_CMPA =(uint16_t)((float)(pwmDutyVar)+((float)(pwmDutyVar)*invDutyPU);
Vijay,
在探测 ePWM 输出时、您能否确认何时仅使用控制卡。 您的 HW 未连接到半桥逆变器是否正确?
谢谢。此致、
乌坦姆
Uttam 您好、
以下是探测 controlCARD 的 ePWM 输出时的设置:
controlCARD 的 ePWM 输出连接到驱动器 IC (ISO5451)的输入。 驱动器 IC 的隔离式输出连接到逆变器。 但是、逆变器电源电路处于关闭状态、即逆变器直流母线未通电。
此致、
维贾伊
Vijay、您好!
我明白了、
您是否能够 仅从控制卡示波器上观察 HSEC 上的波形 、而不将其提供 给硬件上的驱动程序。
理想情况下、如果没有电源电路、则应显示相同的结果。 但我想从主板上排除可能出现 GND 束的情况。
谢谢。此致、
乌坦姆
Uttam 您好、
请查看现在与驱动器以及电源电路处于关闭状态时断开的 controlCARD PWM 输出。
此致、
维贾伊
Vijay、我认为上述代码没问题。
要在无法运行代码的情况下确定问题是很困难的。 如有可能、请通过分享给您的电子邮件发送完整代码。
谢谢。
乌坦姆
Uttam 您好、
目前不在办公室几天,将很快发送代码
此致、
维贾伊
Uttam 您好、
我尝试将代码发送到您共享的电子邮件 ID。 但我会收到送达失败通知。
我将稍后重试。
此致、
维贾伊
Uttam 您好、
我再次尝试将代码发送 到您共享的电子邮件 ID。 但我会收到送达失败通知。
要求您通过 ID 向我发送一封电子邮件、以便我可以回复该电子邮件。
此致、
维贾伊
Vijay、您好!
我给你发了一封私信。 请发送至同一个共享的电子邮件。
谢谢。此致、
乌坦姆
Uttam 您好、
我已将该代码发送到您共享的电子邮件中。
此致、
维贾伊
Vijay、您好!
关闭该 E2E 主题。 随着我们的对话被移至电子邮件中、
谢谢。此致、
乌坦姆