请教各位大牛:双向户外电源如何通过ADC检测AC频率和相位
正在开发双向逆变电源,需要检测输入AC的频率和相位。要做到50Hz,60Hz兼容,大家有什么样的思路?以前做其他产品用过光耦采集过零点,但是抗干扰稳定性不太理想。 可以看看自动重合闸的设计思路 很早之前用电压电流FFT计算相位差,不知道是否可以用于你说的情况。 如果做逆变器产品,还在考虑这个问题建议趁早放弃,数字锁相环是逆变器的入门环节。当然如果你是做毕业设计那就另说哈。 数字锁相环,坛里有个仿真的,可以找来看看.搜索PSIM就有. 这几年搞新能源的很火?看一下搞逆变和BMS工资好高,上次有家给我35/38,没去.我一直干的是自动化,{:lol:} 我用PSIM仿真过三相的,可以检查出频率和相位,AD采样后,clark->park->PID->积分->反馈到park变换. void SimulationStep(double t, double delt, double *in, double *out,
int *pnError, char * szErrorMsg,
void ** reserved_UserData, int reserved_ThreadIndex, void * reserved_AppPtr)
{
g_nStepCount++;
Time_20KHz++;
if(Time_20KHz==50/clock)//20KHz
{
Time_20KHz=0;
U=in;
U=U;
U=U-U;
U=U;
Ual=U; //U
Ube=63.6646*(U*0.2+U*0.8); //U
angle=angle_temp;
Ud= Ual*cos(angle)+Ube*sin(angle);
Uq=-Ual*sin(angle)+Ube*cos(angle);
//********************* ***************************//
//一阶低通滤波
Uq_rms=0.1*Uq_rms+0.9*Uq;
PLC_Error_1 = PLC_Error_0; //
PLC_Error_0 =Uq_rms; // ( )
PLC_PID+=( PLC_Kp *PLC_Error_0-PLC_Ki *PLC_Error_1 );
//PLC_PID=PLC_PID+PLC_Kp*PLC_Error_0-PLC_Ki*PLC_Error_1;
//PLC_PID=PLC_PID+PLC_kp*(PLC_Error_0-PLC_Error_1)+PLC_ki*PLC_Error_0;
count++;
Hz_sum+=PLC_PID;
angle_temp+=PLC_PID;
if(angle_temp>PI2)
angle_temp=0;
if( count==400)//50us*400=20000us=20ms
{
count=0;
Hz=Hz_sum/400*3180; //3184W=2*pi*f =>f=W/2Pi=(Hz_sum/400)*20*1000/2Pi20*1000/6.2831853=3184
Hz_sum=0;
}
out=Ud;
out=Hz;
out=angle_temp;
} 程序很简单,这个是检测是单相锁相环的.没搞懂单相如何转成Ualf和Ubet,就是下面几句.
U=in;
U=U;
U=U-U;
U=U;
Ual=U; //U
Ube=63.6646*(U*0.2+U*0.8); //U Stm32Motor 发表于 2023-8-15 08:58
程序很简单,这个是检测是单相锁相环的.没搞懂单相如何转成Ualf和Ubet,就是下面几句.
U=in;
...
(引用自9楼)
感谢!
就是时下流行做法 SOGI PLL。 Stm32Motor 发表于 2023-8-15 08:58
程序很简单,这个是检测是单相锁相环的.没搞懂单相如何转成Ualf和Ubet,就是下面几句.
U=in;
...
(引用自9楼)
alpha 和 beta 是SOGI 的输出,通过一次积分和二次积分获得。
gumogumo 发表于 2023-8-14 14:15
很早之前用电压电流FFT计算相位差,不知道是否可以用于你说的情况。
(引用自3楼)
这样其实也可以,但是实时性欠佳。 那个63.6648怎么来的,还有后面的0.2和0.8 Stm32Motor 发表于 2023-8-18 07:54
那个63.6648怎么来的,还有后面的0.2和0.8
(引用自13楼)
这个代码比较清晰,x1,x2 就是alpha,beta vectors
void updateSOGI(SOGI *sogi, double input, double frequency, double samplingTime) {
double omega = 2.0 * M_PI * frequency;
double alpha = 1.0 / (1.0 + omega * samplingTime);
sogi->x1 = alpha * (sogi->x1 + omega * sogi->x2 + input * samplingTime);
sogi->x2 = alpha * (sogi->x2 - omega * sogi->x1 + input * samplingTime);
} hushaoxin 发表于 2023-8-14 14:20
如果做逆变器产品,还在考虑这个问题建议趁早放弃,数字锁相环是逆变器的入门环节。当然如果你是做毕业设计 ...
(引用自4楼)
感谢指明方向:)
页:
[1]