Thread 中讨论的其他器件:controlSUITE
查找实现变频 SPWM 的示例程序、以便输入电压/基准正弦波频率比保持不变。 请帮助。
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.
查找实现变频 SPWM 的示例程序、以便输入电压/基准正弦波频率比保持不变。 请帮助。
你好! 好的...我会给您发送一个基于28069的单相逆变器源代码,但我在所有型号的 MCU 中都提供了
void device_start (void)
{
if (!fault)
{
开关(OPERAING_MODE)
{
情况0:
full_system_disable();
Inv_Counting ++;
if (INV_Counting>SEC_5)
{INV_Counting = SEC_5;
Control_Init();
OPERAING_MODE = 1;
Inv_Counting = 0;
if (i_bat <-2.0) {full_system_disable();fault = 4;}}
中断;
案例1:
如果(V_dc >(0.98*INV_START))
{INV_COUNTINGIN++;
if (INV_Counting>(SEC_1))
{INV_PWM_ENABLE ();
OPERAT_MODE = 2;AC_PEAK 设置= 0.05;
Inv_Counting = 0;}}
if (V_dc < DC_critical 点) {full_system_disable ();fault = 9;}
if (I_bat > BAT_CUR_MAX) {FULL_SYSTEM_DISABLE ();FAULT = 4;}
if (i_bat <-2.0) {full_system_disable();fault = 5;}
中断;
案例2:
V_dc_ref = inV_start; cur_cntl ();
V_AC_ref = sin1_value;ac_peak_setting+=0.00007;
Relay_load_on;
if (ac_peak_setting > 0.9)
{ac_peak_setting = 0.9;
Inv_Counting ++;
if (INV_Counting>(SEC_1))
{INV_Counting = SEC_1;
OPERAING_MODE = 3;
Inv_Counting = 0;}}
if (V_dc < DC_OUT_MIN) {full_system_disable ();fault = 3;}
if (V_dc < DC_critical 点) {full_system_disable ();fault = 4;}
if (I_bat > BAT_CUR_MAX) {FULL_SYSTEM_DISABLE ();FAULT = 5;}
if (i_bat <-2.0) {full_system_disable();fault = 5;}
中断;
案例3:
V_dc_ref = INV_START;
CUR_CNTL ();
V_AC_ref = sin1_value;
pi_control (vol_err、ac_vol_set_peak、v_ac_peak_f、v_ac_sum、sample_time、ac_VOL_Kp、ac_VOL_Ki、-20.0、20.0);
V_AC_KP = AC_VOL_KP*(AC_VOL_SET_PEAK - V_AC_PEAK);
V_ac_peak_ref =(ac_VOL_SET_PEAK + vol_err);
ac_peak_setting = V_ac_peak_ref / V_dc;
Inv_Counting ++;
if (INV_Counting>(SEC_5))
{INV_Counting = SEC_5;
OPERAING_MODE = 4;
Inv_Counting = 0;}
if (V_dc >(1.02*INV_START) ){no_load_cntl ();}
其他
{V_dc_ref = inV_start; cur_cntl ();
V_AC_ref = sin1_value;INV_CONTROL = 6.0;
pi_control (vol_err、ac_vol_set_peak、v_ac_peak_f、v_ac_sum、sample_time、ac_VOL_Kp、ac_VOL_Ki、-20.0、20.0);
V_AC_KP = AC_VOL_KP*(AC_VOL_SET_PEAK - V_AC_PEAK);
V_ac_peak_ref =(ac_VOL_SET_PEAK + vol_err);
ac_peak_setting = V_ac_peak_ref / V_dc;}
if (V_dc < DC_OUT_MIN) {full_system_disable ();fault = 3;}
if (V_dc < DC_critical 点) {full_system_disable ();fault = 4;}
if (I_bat > BAT_CUR_MAX) {FULL_SYSTEM_DISABLE ();FAULT = 5;}
if (i_bat <-2.0) {full_system_disable();fault = 5;}
中断;
}
fault_checking();
Inv_PWM_Creating();
}
}
void open_loop_cntl (void)
{
EST_theta +=Delta_THETA_60Hz;/// Delta_THETA_60Hz = 2 * 3.14 * 60 * SAMPLE_TIME;
if (est_theta>PI){est_theta = est_theta - PI2;}
if (est_theta<-pi){est_theta = est_theta + PI2;}
}
void INV_PWM_Creating()
{
如果(V_AC_ref > 0) {VOL_POLE = 1;}
否则 {VOL_POLE = 0;}
开关(VOL_POLE)
{案例1:
Inv_ref = ac_peak_Setting * V_ac_ref;
PWM_COUNT_INV_REF[0] = (Int16)(inV_ref*PWM_COUNT_INV_MAX);
PWM_COUNT_INV_REF[1] = 界限1 (PWM_COUNT_INV_REF[0]、PWM_COUNT_INV_MAX);
EPwm1Regs.CMPA.half.CMPA = PWM_COUNT_INV_REF[1];
EPwm2Regs.CMPA.half.CMPA = 0;
中断;
情况0:
Inv_ref = - ac_peak_Setting * V_ac_ref;
PWM_COUNT_INV_REF[2] = (Int16)(inV_ref*PWM_COUNT_INV_MAX);
PWM_COUNT_INV_REF[3] = 界限1 (PWM_COUNT_INV_REF[2]、PWM_COUNT_INV_MAX);
EPwm1Regs.CMPA.half.CMPA = 0;
EPwm2Regs.CMPA.half.CMPA = PWM_COUNT_INV_REF[3];}}
void INV_PWM_ENABLE (void)
{
INV = 1;FD = 0.0;
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=1 ;
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1 ;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1 ;
EDIS;
}
此处使用的开关模式基于双调制。 我觉得它会对 您有所帮助...
作者!
主席先生,
是否有任何单独具有正弦调制 PWM 或具有 V/F 正弦调制 PWM 的逆变器示例(电机示例使用了空间矢量)?
我尝试在向上/向下计数模式下使用 PWM,并在 ISR 中更新比较寄存器(total_period/2)+(total_period/2)* a* sin (2*pi*f*t),通过该寄存器,我可以生成不同的 PWM,并能够在滤波器之后获得正弦波。 您能告诉我这是如何完成的吗?