如何利用C语言实现Clarke变换和Park变换
利用C语言实现Clarke变换
//3S to 2S
void clarke(PARA3S *v1,PARA2S *v2)
{
v2->alpha = v1->a;
v2->beta = (v1->a + 2.0f * v1->b)*(0.57735026918963f); // 1/sqrt(3) = 0.57735026918963
}
//2S to 3S
void iclarke(PARA2S *v1,PARA3S *v2)
{
v2->a = v1->alpha;
v2->b = 0.5f*(1.7320508075*v1->beta - v1->alpha);
v2->c = -v2->a - v2->b;
}
你提到的代码实现与标准的 Clarke 变换公式有一些不同,这些差异可能是由于以下几个原因导致的:
1. 简化处理
在实际的工程实现中,Clarke 变换的简化版本通常会根据具体的应用需求进行调整。例如,在某些情况下,工程师可能知道某些相的电压值为零,或者在对称系统中,V_c
可以被省略。这种简化可以减少计算量,提高系统的实时性。
2. 假设条件
在提供的代码中,clarke
函数中只使用了 v1->a
和 v1->b
,而 v1->c
没有被使用。这意味着代码可能假设输入信号是一个对称系统或者是一个两相系统,即默认 V_c
可以通过 V_a
和 V_b
推导出来。这种假设在一些特定应用中是合理的。
3. 代码与标准公式的比较
Clarke 变换(3S 到 2S)
// 3S to 2S
void clarke(PARA3S *v1, PARA2S *v2)
{
v2->alpha = v1->a;
v2->beta = (v1->a + 2.0f * v1->b) * (0.57735026918963f); // 1/sqrt(3) = 0.57735026918963
}
这个实现中,v2->alpha = v1->a;
对应标准公式中的
V
α
=
V
a
V_\alpha = V_a
Vα=Va。推导过程为:
V α = 2 3 ( V a − 1 2 V b − 1 2 V c ) V_\alpha=\frac{2}{3}\left(V_a-\frac{1}{2} V_b-\frac{1}{2} V_c\right) Vα=32(Va−21Vb−21Vc)
特殊情况:对称系统
在对称系统中,通常假设 V a + V b + V c = 0 V_a + V_b + V_c = 0 Va+Vb+Vc=0,这意味着 V c = − ( V a + V b ) V_c = -(V_a + V_b) Vc=−(Va+Vb)。在这种情况下,公式可以进一步简化: V α = V a V_\alpha = V_a Vα=Va
V β = 3 3 ( V b − V c ) V_\beta=\frac{\sqrt{3}}{3}\left(V_b-V_c\right) Vβ=33(Vb−Vc)
v2->beta
因为对称系统,可通过
V
a
V_a
Va 和
V
b
V_b
Vb 计算得出的:
β
=
1
3
(
V
a
+
2
V
b
)
\beta = \frac{1}{\sqrt{3}}(V_a + 2V_b)
β=31(Va+2Vb)
在标准的 Clarke 变换中,如果输入是对称的三相系统,且 V_a + V_b + V_c = 0
,则该简化是合理的。此时,V_c
的值可以从 V_a
和 V_b
计算得出,因此可以省略。
逆 Clarke 变换(2S 到 3S)
// 2S to 3S
void iclarke(PARA2S *v1, PARA3S *v2)
{
v2->a = v1->alpha;
v2->b = 0.5f * (1.7320508075 * v1->beta - v1->alpha);
v2->c = -v2->a - v2->b;
}
在逆 Clarke 变换中,计算 v2->b
和 v2->c
时,v2->b
使用了 v1->beta
和 v1->alpha
进行计算,并且使用了一个常量 1.7320508075
,它实际上是 sqrt(3)
的值。这个公式表示将两相静止坐标系(α-β
)转换回三相静止坐标系(a-b-c
)。
4. 简化假设的可能性
在一些应用中,如果系统是对称的,那么 V_c
可以表示为 V_c = -V_a - V_b
,这就是为什么在逆 Clarke 变换中,v2->c = -v2->a - v2->b;
可以成立。这种简化减少了计算量,特别是在实时系统中非常有用。
结论
- 你看到的代码和标准的 Clarke 变换公式之间的差异,是因为代码实现对一些输入条件做了假设,进行了简化处理。
- 这种简化处理在特定应用场景下是合理的,能够提高计算效率。
- 标准公式则更通用,但在特定条件下可以被简化。
如果你在开发过程中遇到具体需求的差异,需要在简化和精度之间做出平衡,可以根据应用的实际情况选择合适的实现方式。
利用C语言实现Park变换
使用的Park变换时基于余弦的Park变换
//2S to 2R
void park(PARA2S *v1,PARA2R *v2,SINCOS_t *SC)//基于余弦的Park正变换
{
v2->d=v1->alpha*SC->Cos + v1->beta*SC->Sin; //得到两相旋转坐标系下d轴电压
v2->q=v1->beta*SC->Cos - v1->alpha*SC->Sin; //得到两相旋转坐标系下q轴电压
}
//2R to 2S
void ipark(PARA2R *v1,PARA2S *v2,SINCOS_t *SC)//基于余弦的Park反变换
{
v2->alpha=v1->d*SC->Cos-v1->q*SC->Sin; //得到静止平面坐标系下d轴电压
v2->beta=v1->q*SC->Cos+v1->d*SC->Sin; //得到静止平面坐标系下q轴电压
}
//3S to 2R
void _3sto2r(PARA3S *v1,PARA2R *v2,SINCOS_t *SC)
{
float fbeta= (v1->a + 2.0f * v1->b)*(0.57735026918963f);
v2->d = v1->a*SC->Cos + fbeta*SC->Sin;
v2->q = fbeta*SC->Cos - v1->a*SC->Sin;
}
//2R to 3S
void _2rto3s(PARA2R *v1,PARA3S *v2,SINCOS_t *SC)
{
v2->a = v1->d*SC->Cos-v1->q*SC->Sin;
v2->b = 0.5f*(1.7320508075f*(v1->q*SC->Cos+v1->d*SC->Sin) - v2->a);
v2->c = -v2->a - v2->b;
}
整体变换代码
//***************************************************/
//文件名:clarke_park.c
//功能:克拉克变换和帕克变换子函数
//说明:输入信息采用结构体,使用时改变结构体指针即可改变输入量
// 函数park() 实现帕克变换(Park Transformation)
// 函数clarke() 实现克拉克变换(Clarke Transformation)
//****************************************************/
#include "float.h"
#include "clark_park.h"
// 3S to 2S Clarke变换,将三相静止坐标系(a-b-c)转换为两相静止坐标系(α-β)
void clarke(PARA3S *v1, PARA2S *v2)
{
// α轴分量直接等于a相电压
v2->alpha = v1->a;
// β轴分量计算,等于a相电压和b相电压的线性组合
// 0.57735026918963f = 1/sqrt(3),表示β轴投影系数
v2->beta = (v1->a + 2.0f * v1->b) * (0.57735026918963f);
}
// 2S to 3S 逆Clarke变换,将两相静止坐标系(α-β)转换回三相静止坐标系(a-b-c)
void iclarke(PARA2S *v1, PARA3S *v2)
{
// a相电压直接等于α轴分量
v2->a = v1->alpha;
// b相电压根据β轴和α轴分量计算得出
// 1.7320508075f = sqrt(3),用于恢复b相的电压
v2->b = 0.5f * (1.7320508075f * v1->beta - v1->alpha);
// c相电压等于a相和b相电压的负和
v2->c = -v2->a - v2->b;
}
// 2S to 2R Park变换,将两相静止坐标系(α-β)转换为两相旋转坐标系(d-q)
void park(PARA2S *v1, PARA2R *v2, SINCOS_t *SC) // 基于余弦的Park正变换
{
// d轴分量计算,表示在旋转坐标系下的d轴电压
v2->d = v1->alpha * SC->Cos + v1->beta * SC->Sin;
// q轴分量计算,表示在旋转坐标系下的q轴电压
v2->q = v1->beta * SC->Cos - v1->alpha * SC->Sin;
}
// 2R to 2S 逆Park变换,将两相旋转坐标系(d-q)转换回两相静止坐标系(α-β)
void ipark(PARA2R *v1, PARA2S *v2, SINCOS_t *SC) // 基于余弦的Park反变换
{
// α轴分量计算,表示在静止平面坐标系下的α轴电压
v2->alpha = v1->d * SC->Cos - v1->q * SC->Sin;
// β轴分量计算,表示在静止平面坐标系下的β轴电压
v2->beta = v1->q * SC->Cos + v1->d * SC->Sin;
}
// 3S to 2R 综合变换,直接将三相静止坐标系(a-b-c)转换为两相旋转坐标系(d-q)
void _3sto2r(PARA3S *v1, PARA2R *v2, SINCOS_t *SC)
{
// 计算β轴分量,0.57735026918963f = 1/sqrt(3)
float fbeta = (v1->a + 2.0f * v1->b) * (0.57735026918963f);
// d轴分量计算
v2->d = v1->a * SC->Cos + fbeta * SC->Sin;
// q轴分量计算
v2->q = fbeta * SC->Cos - v1->a * SC->Sin;
}
// 2R to 3S 综合变换,直接将两相旋转坐标系(d-q)转换回三相静止坐标系(a-b-c)
void _2rto3s(PARA2R *v1, PARA3S *v2, SINCOS_t *SC)
{
// 计算a相电压
v2->a = v1->d * SC->Cos - v1->q * SC->Sin;
// 计算b相电压,1.7320508075f = sqrt(3)
v2->b = 0.5f * (1.7320508075f * (v1->q * SC->Cos + v1->d * SC->Sin) - v2->a);
// c相电压等于a相和b相电压的负和
v2->c = -v2->a - v2->b;
}