三相锁相环仿真及其代码验证,附C语言源码

三相锁相环仿真及其代码验证,附C语言源码

锁相环

原理

众所周知,三相电的锁相环只需要进行Clark变换和Park变换得到dq分量,进行PI运算就可以轻松的完成锁相,这里就不简述Clark变换和Park变换了,网上一搜一大把资料,在此简单阐述

锁相环的原理:

锁相环就是讲ABC三相通过clark变换和Park变换转换成dq分量,通过dq来进行锁相,锁相环框图如下
在这里插入图片描述

clark变换:将abc 变换到 静止 的αβ 坐标系下。

设ABC三相电压为:
在这里插入图片描述

通过U=x+ac+a^c变换合成矢量为
在这里插入图片描述

在这里插入图片描述
如图所示,将它们投影到αβ轴上,有
Clark transformation 3s−2s(仅考虑三相三线制情形,零序分量被忽略,详细推导可参考陈伯时《电力拖动自动控制系统-运动控制系统》第三版 P263)

在这里插入图片描述

Park变换:将abc 变换到 旋转 的 dq 坐标系下
在这里插入图片描述
在这里插入图片描述

clark变换到park变换
在这里插入图片描述
变换矩阵为
在这里插入图片描述

仿真

在这里插入图片描述

源码

主要代码



//
// Included Files
//
#include <math.h>
#include "Interrupt.h"

/* ABC电压值变量定义  */
FLOAT32 g_f32Ua;
FLOAT32 g_f32Ub;
FLOAT32 g_f32Uc;

typedef struct STRUCT_SPLL
{
    /* input data */
    FLOAT32 g_f32VoltD;
    FLOAT32 g_f32VoltQ;
    FLOAT32 g_f32Theta;
    /* output data */
    FLOAT32 g_f32SinWT;
    FLOAT32 g_f32CosWT;
    /* parameter */
    FLOAT32 g_f32VoltAlpha;
    FLOAT32 g_f32VoltBeta;
    PI_CONTROL_STRUCT PllLoop;
}ST_SPLL;
/* 锁相环PI控制    */
#define PLL_MAX_OUT     2000
#define PLL_MIN_OUT    -2000

#define PLL_KP          48.0 * 2.0//12       // 0.3
#define PLL_KI          0.1 * 2.0//0.04    // 0.001




ST_SPLL g_stSpll = {0};

UINT16 g_u16VoltageIndex = 0;
UINT16 g_u16SendFlag = 0;
FLOAT32 g_f32VoltageSample[3] = {0};

void ISR_APP_ThreePhaseSPLL(ST_SPLL *t_spll, const FLOAT32 *VABC, UINT32 Ts);

//中断频率50k
#pragma CODE_SECTION(ISR_InterruptTask, ".TI.ramfunc");
__interrupt void ISR_InterruptTask(void)
{

	g_u16VoltageIndex++;
	if(g_u16VoltageIndex > 1000)
		g_u16VoltageIndex = 0;
	g_f32VoltageSample[0] = sinf(2 * M_PI * 100 / 1000 * g_u16VoltageIndex);//模拟输出A相电压,可由adc采样值替换
	g_f32VoltageSample[1] = sinf(2 * M_PI * 100 / 1000 * g_u16VoltageIndex - 2*M_PI/3.0f);//模拟输出B相电压
	g_f32VoltageSample[2] = sinf(2 * M_PI * 100 / 1000 * g_u16VoltageIndex + 2*M_PI/3.0f);//模拟输出C相电压

	g_f32Ua = g_f32VoltageSample[0];
	g_f32Ub = g_f32VoltageSample[1];
	g_f32Uc = g_f32VoltageSample[2];
	ISR_APP_ThreePhaseSPLL(&g_stSpll, g_f32VoltageSample, 1000);//锁相环函数

}


void APP_InitSpll(ST_SPLL *t_spll)
{
    t_spll->g_f32VoltD = 0;
    t_spll->g_f32VoltQ = 0;
    t_spll->g_f32Theta = 0;
    /* output data */
    t_spll->g_f32SinWT = 0;
    t_spll->g_f32CosWT = 0;
    /* parameter */
    t_spll->g_f32VoltAlpha = 0;
    t_spll->g_f32VoltBeta = 0;

    t_spll->PllLoop.m_u16CtrFlg = INCREMENTAL_CONTROL;		/* 增量式PI控制标志  */

    t_spll->PllLoop.m_f32Ref = 0;							/* 给定                       */
    t_spll->PllLoop.m_f32Fed = 0;               			/* 反馈                       */

    t_spll->PllLoop.m_f32Err = 0;               			/* 误差                       */
    t_spll->PllLoop.m_f32ErrPre = 0;            			/* 前拍误差                */

    t_spll->PllLoop.m_f32Kp = PLL_KP;                		/* 比例参数                 */
    t_spll->PllLoop.m_f32Ki = PLL_KI;                		/* 积分参数                 */

    t_spll->PllLoop.m_f32Acc = 0;               			/* 积分累加               */
    t_spll->PllLoop.m_f32LoopOut = 0;           			/* 输出                       */
    t_spll->PllLoop.m_f32KiMaxACC = PLL_MAX_OUT;          	/* 积分累加最大限幅  */
    t_spll->PllLoop.m_f32KiMinACC = PLL_MIN_OUT;          	/* 积分累加最小限幅  */
    t_spll->PllLoop.m_f32MaxOutput = PLL_MAX_OUT;         	/* 输出最大限幅           */
    t_spll->PllLoop.m_f32MinOutput = PLL_MIN_OUT;         	/* 输出最小限幅           */
}
#pragma CODE_SECTION(ISR_APP_ABC2ab, ".TI.ramfunc");
void ISR_APP_ThreePhaseSPLL(ST_SPLL *t_spll, const FLOAT32 *VABC, UINT32 Ts)
{

    FLOAT32 t_f32TempValue = 0;
    t_spll->g_f32VoltAlpha = 0.6666667f * (VABC[0]-(0.5f*VABC[1])-(0.5*VABC[2]));//Clark变换
    t_spll->g_f32VoltBeta = 0.6666667f*(((sqrtf(3)/2)*VABC[1])-((sqrtf(3)/2)*VABC[2]));

    #if 0                       //开环
    theta = 2 * M_PI * 50;
    #endif
	
	//Park变换
    t_spll->g_f32VoltD = t_spll->g_f32CosWT * t_spll->g_f32VoltAlpha + t_spll->g_f32SinWT * t_spll->g_f32VoltBeta;
    t_spll->g_f32VoltQ = -t_spll->g_f32SinWT * t_spll->g_f32VoltAlpha + t_spll->g_f32CosWT * t_spll->g_f32VoltBeta;
	
	//锁相环环路计算
    t_spll->PllLoop.m_f32Ref = t_spll->g_f32VoltD;//0;
    t_spll->PllLoop.m_f32Fed = 0;//t_spll->g_f32VoltD;
    
    t_spll->PllLoop.m_f32Err = t_spll->PllLoop.m_f32Ref - t_spll->PllLoop.m_f32Fed;

    t_f32TempValue = t_spll->PllLoop.m_f32Ki * t_spll->PllLoop.m_f32Err;                              /* 积分计算  */
    t_f32TempValue += t_spll->PllLoop.m_f32Kp * (t_spll->PllLoop.m_f32Err - t_spll->PllLoop.m_f32ErrPre);          /* 比例计算  */
    t_spll->PllLoop.m_f32LoopOut += t_f32TempValue;/* 增量运算  */

    t_spll->PllLoop.m_f32ErrPre = t_spll->PllLoop.m_f32Err;

    if (t_spll->PllLoop.m_f32LoopOut > t_spll->PllLoop.m_f32MaxOutput)                                    /* 输出限幅   */
    {
        t_spll->PllLoop.m_f32LoopOut = t_spll->PllLoop.m_f32MaxOutput;
    }

    if (t_spll->PllLoop.m_f32LoopOut < t_spll->PllLoop.m_f32MinOutput)
    {
        t_spll->PllLoop.m_f32LoopOut = t_spll->PllLoop.m_f32MinOutput;
    }


    t_spll->g_f32Theta += (t_spll->PllLoop.m_f32LoopOut / Ts);//环路输出即为w,需要t积分

    if(t_spll->g_f32Theta > (2 * M_PI))
    {
        t_spll->g_f32Theta = t_spll->g_f32Theta - (2 * M_PI);
    }
    if(t_spll->g_f32Theta < 0)
    {
        t_spll->g_f32Theta = t_spll->g_f32Theta + (2 * M_PI);
    }
    t_spll->g_f32SinWT = sinf(t_spll->g_f32Theta);
    t_spll->g_f32CosWT = cosf(t_spll->g_f32Theta);
}

//
// End of File
//

  • 68
    点赞
  • 397
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 三相锁相环是一种常用的控制系统,它可监控和控制三相交流电源,并可实现相位和频率的同步。在Matlab中,我们可以通过仿真来模拟三相锁相环运作的情况。 首先,我们需要建立一个三相电源模型。这个模型包括产生三相电压信号的函数、电源的电压频率和相位等参数。接下来,在Matlab中,我们使用Phase-Locked Loop Toolbox来建立锁相环控制器,它可以实现对信号的同步跟踪和相位同步。 在仿真中,我们可以模拟不同工作条件下的三相锁相环运动情况。例如,我们可以模拟电源频率的变化以及不同负载下的运行效果等。通过这些仿真,我们可以更好地了解锁相环的控制特性,并优化锁相环设计。 在实际应用中,三相锁相环被广泛应用于工业自动化、电力系统等领域,并在高速运转的电机和发电机中发挥着重要作用。因此,掌握三相锁相环仿真技术是非常重要的。 ### 回答2: 三相锁相环是一种常用于电力系统中的电路控制器,可以通过锁相的方式实现稳定而准确的电压、频率和相位控制。在现代电力系统中,三相锁相环具有重要的应用价值和意义。为了实现最佳的控制效果,研究人员需要通过模拟和仿真验证、优化和验证控制器的性能。这就需要使用MATLAB等仿真软件来进行模拟。 三相锁相环的MATLAB仿真通常涉及建立控制器的数学模型、确定控制器的参数和进行仿真分析等步骤。在建立数学模型时,需要考虑系统的物理特性和控制器的工作原理等因素,例如系统的传输函数、控制器的比例、积分和微分参数等。在确定控制器参数时,需要根据控制目标和系统反馈确定最佳参数值,并在仿真验证控制器的稳定性和性能是否满足要求。 在进行仿真分析时,需要对控制器的输出进行分析,并根据仿真结果进行调整和优化。通常可以采用MATLAB的模拟工具箱和仿真工具来进行三相锁相环仿真,例如Simscape和Simulink等。通过仿真,研究人员可以获得系统响应速度、稳态误差、噪声容忍度和鲁棒性等指标,并根据仿真结果进行更加准确和可靠的控制器设计和优化。 总之,三相锁相环的MATLAB仿真是一项极其重要和必要的工作,它可以帮助研究人员评估和验证控制器的性能,并进一步提高电力系统的控制效率和稳定性。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值