📄 c_pwm1.c
字号:
u_dc_temp = ADC1_DATA; /*read ADC1 and ADC2 result in sequence*/
i_a = ADC1_DATA;
i_b = ADC1_DATA;
u_dc.control = ADC1_DATA;
u_ab.nonce = ADC2_DATA;
u_bc.nonce = ADC2_DATA;
temp = ADC2_DATA;
temp = ADC2_DATA;
ADC12_STOP; /*stop ADC1 and ADC2*/
/*零偏调整*/
i_a += I_A_E;
i_b += I_B_E;
u_dc_temp -= U_DC_E;
u_ab.nonce -= U_AB_E;
u_bc.nonce += U_BC_E;
u_dc_temp &= 0x0FFF;
i_a &= 0x0FFF;
i_b &= 0x0FFF;
u_dc.control &= 0x0FFF;
u_ab.nonce &= 0x0FFF;
u_bc.nonce &= 0x0FFF;
if (u_dc_temp >= 2048) u_dc_temp -= 4096;
if (i_a >= 2048) i_a -= 4096;
if (i_b >= 2048) i_b -= 4096;
if (u_dc.control >= 2048) u_dc.control -= 4096;
if (u_ab.nonce >= 2048) u_ab.nonce -= 4096;
if (u_bc.nonce >= 2048) u_bc.nonce -= 4096;
if (u_dc.control <= 0) u_dc.control = 0;
if ((u_bc.former < 0) && (u_bc.nonce >= 0)) phase.angle = 0; /*检测A相电压上升沿过零点*/
/*u_a_array[t_step] = u_ab.nonce;
u_b_array[t_step] = u_bc.nonce;
u_c_array[t_step] = u_bc.nonce;
u_dc_array[t_step] = u_dc_temp;
i_a_array[t_step] = i_a;
i_b_array[t_step] = i_b; */
/* 预测电网电压的空间矢量的值 */
u_ab.forecast = u_ab.nonce + ((u_ab.nonce - u_ab.former)>>1);
u_bc.forecast = u_bc.nonce + ((u_bc.nonce - u_bc.former)>>1);
u_ab.forecast = SLONGMUL(u_ab.forecast, K_V_A, 12);
u_bc.forecast = SLONGMUL(u_bc.forecast, K_V_B, 12);
u_ca.forecast = - u_ab.forecast - u_bc.forecast;
u_ac_set.d = ((u_ab.forecast - u_ca.forecast)>>1);
u_ac_set.q = SLONGMUL((SQUARE_3), u_bc.forecast, 12);
/* 对直流电压采样值用平均值方法进行滤波 */
u_dc_temp = SLONGMUL(u_dc_temp , K_V_DC , 12);
u_dc_sam_array[p_u_dc_sam] = u_dc_temp;
p_u_dc_sam++;
if (p_u_dc_sam >= 16) p_u_dc_sam = 0;
/*直流侧电压滤波*/
u_dc.sam = 0;
for (i = 0; i < 16; i++) u_dc.sam += u_dc_sam_array[i] >> 4;
if (u_dc_temp > U_DC_HIGHEST)
{
DISABLE_PWM;
ERROR;
}
else if (u_dc_temp < U_DC_LOWEST)
{
DISABLE_PWM;
ERROR;
}
else
{
if (SWITCH_ON)
{
ENABLE_PWM;
RUNNING;
}
}
asm(" SETC OVM") ; /*当有溢出时,ACC被填充为最大值*/
if(u_dc.set >= U_DC_SET) u_dc.set = U_DC_SET;
else u_dc.set++;
u_dc.err = u_dc.set - u_dc.sam;
u_dc.err_I = u_dc.err_I + SLONGMUL(u_dc.err , K_DC_I , 12);
/* 防止溢出 */
if (u_dc.err_I >= U_DC_ERR_MAX) u_dc.err_I = U_DC_ERR_MAX;
if (u_dc.err_I <= -U_DC_ERR_MAX) u_dc.err_I = -U_DC_ERR_MAX;
i_set.amp = u_dc.err_I + SLONGMUL(u_dc.err , K_DC_P1 ,12);
if (i_set.amp > I_SET_MAX) i_set.amp = I_SET_MAX; /* 限制i_set的幅度 */
if (-i_set.amp > I_SET_MAX) i_set.amp = -I_SET_MAX;
/* C相电流计算 */
i_a = SLONGMUL(i_a , K_I_A , 12);
i_b = SLONGMUL(i_b , K_I_B , 12);
/*由于接线的原因,电流需要反相*/
i_a = -i_a;
i_b = -i_b;
i_c = - i_a - i_b;
/*判断是否过流,是则进入保护*/
if ((i_a > I_AC_MAX) || (i_b > I_AC_MAX) || (i_c > I_AC_MAX))
{
over_current();
}
if ((i_a < -I_AC_MAX) || (i_b < -I_AC_MAX) || (i_c < -I_AC_MAX))
{
over_current();
}
/* d,q轴电流计算 */
i_sam.d = i_a - ((i_b + i_c)>>1);
i_sam.q = SLONGMUL((SQUARE_3) , (i_b - i_c) , 12);
/*相位控制*/
phase.angle++;
if (phase.angle >= 100){
phase.angle = 0;
}
i_set.q = SLONGMUL(i_set.amp , sin_table[phase.angle], 15);
if (phase.angle < 75)
i_set.d = SLONGMUL(i_set.amp , sin_table[phase.angle + 25], 15);
else
i_set.d = SLONGMUL(i_set.amp , sin_table[phase.angle - 75], 15);
/* 电流环P调节计算 */
if (k_i_p < K_I_P_MAX) k_i_p ++;
else k_i_p = K_I_P_MAX;
i_err.d = i_set.d - i_sam.d;
i_err.q = i_set.q - i_sam.q;
i_err.d = SLONGMUL(i_err.d , k_i_p , 12);
i_err.q = SLONGMUL(i_err.q , k_i_p , 12);
/* 由i_err得到电感上的压降 u_l */
u_l.d = SLONGMUL(i_err.d , K_V_L ,12);
u_l.q = SLONGMUL(i_err.q , K_V_L ,12);
/* Put the value in the array */
u_set_d_array[t_step] = u_ac_set.d;
u_set_q_array[t_step] = u_ac_set.q;
/* 计算逆变器交流侧要表现出的电压 */
u_ac_set.d = u_ac_set.d - u_l.d;
u_ac_set.q = u_ac_set.q - u_l.q;
/*u_ac_set还要乘以0.810283*/
u_ac_set.d = SLONGMUL(u_ac_set.d, SQUARE_2_3, 12);
u_ac_set.q = SLONGMUL(u_ac_set.q, SQUARE_2_3, 12);
if(u_ac_set.d >= U_AC_SET_MAX) u_ac_set.d = U_AC_SET_MAX;
if(u_ac_set.d <= -U_AC_SET_MAX) u_ac_set.d = -U_AC_SET_MAX;
if(u_ac_set.q >= U_AC_SET_MAX) u_ac_set.q = U_AC_SET_MAX;
if(u_ac_set.q <= -U_AC_SET_MAX) u_ac_set.q = -U_AC_SET_MAX;
/* 计算逆变器交流侧要表现出的电压的标么值 */
u_ac_dc.d =((sint)h_divide(u_ac_set.d , u_dc.sam));
u_ac_dc.q =((sint)h_divide(u_ac_set.q , u_dc.sam));
/* 根据u_ac_dc.d,q的值来计算phase.sector */
temp_d = SLONGMUL(u_ac_dc.d, SQUARE_3_3, 12);
temp_q = u_ac_dc.q;
if (u_ac_dc.q >= 0)
{
if (temp_q < temp_d) phase.sector = 0;
else if ((temp_q > temp_d) && (temp_q > -temp_d)) phase.sector = 1;
else phase.sector = 2;
}
else
{
if (temp_q > temp_d) phase.sector = 3;
else if ((temp_q < temp_d) && (temp_q < -temp_d)) phase.sector = 4;
else phase.sector = 5;
}
/* Put the value in the array */
u_a_array[t_step] = u_ab.forecast;
u_b_array[t_step] = u_bc.forecast;
u_c_array[t_step] = u_ca.forecast;
i_a_array[t_step] = i_a;
i_b_array[t_step] = i_b;
u_dc_array[t_step] = u_dc.sam;
u_dc_err_I_array[t_step] = u_l.d;
i_set_amp_array[t_step] = u_l.q;
i_err_d_array[t_step] = i_sam.d;
i_err_q_array[t_step] = i_sam.q;
i_set_d_array[t_step] = i_set.d;
i_set_q_array[t_step] = i_set.q;
phase_angle_array[t_step] = phase.angle;
/* 计算各比较寄存器的装载值 */
cmpr1=SLONGMUL(u_ac_dc.d , decomp[phase.sector][0][0],12) + SLONGMUL(u_ac_dc.q , decomp[phase.sector][1][0],12);
cmpr1=SLONGMUL(cmpr1 , T1_PER,12);
if (cmpr1 < 0) cmpr1 = 0;
cmpr2 = SLONGMUL(u_ac_dc.d , decomp[phase.sector][0][1],12) + SLONGMUL(u_ac_dc.q , decomp[phase.sector][1][1],12);
cmpr2 = SLONGMUL(cmpr2 , T1_PER,12);
if (cmpr2 < 0) cmpr2 = 0;
cmpr0 = (T1_PER - cmpr2 - cmpr1) >> 1;
if (cmpr0 < 0)
{
cmpr2 = cmpr2 + cmpr0;
cmpr1 = cmpr1 + cmpr0;
cmpr0 = 0;
}
cmpr1 += cmpr0;
cmpr2 += cmpr1;
if (cmpr0 <= 50) cmpr0 = 50;
if (cmpr1 <= 50) cmpr1 = 50;
if (cmpr2 <= 50) cmpr2 = 50;
if (cmpr0 > (T1_PER - 50)) cmpr0 = T1_PER - 50;
if (cmpr1 > (T1_PER - 50)) cmpr1 = T1_PER - 50;
if (cmpr2 > (T1_PER - 50)) cmpr2 = T1_PER - 50;
cmpr0_array[t_step] = cmpr0;
cmpr1_array[t_step] = cmpr1;
cmpr2_array[t_step] = cmpr2;
switch(phase.sector) {
case 0 : *CMPR1=cmpr0; *CMPR2=cmpr1; *CMPR3=cmpr2; break;
case 1 : *CMPR2=cmpr0; *CMPR1=cmpr1; *CMPR3=cmpr2; break;
case 2 : *CMPR2=cmpr0; *CMPR3=cmpr1; *CMPR1=cmpr2; break;
case 3 : *CMPR3=cmpr0; *CMPR2=cmpr1; *CMPR1=cmpr2; break;
case 4 : *CMPR3=cmpr0; *CMPR1=cmpr1; *CMPR2=cmpr2; break;
case 5 : *CMPR1=cmpr0; *CMPR3=cmpr1; *CMPR2=cmpr2; break;
default: break;}
*ACTR = 0x0666; /*Configure PWM outputs*/
/* 数组指针控制 */
t_step++;
if (t_step >= 300){
t_step = 0;
}
asm(" CLRC INTM " );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -