Psim 2022电力仿真--锁相环控制程序

news2024/11/18 3:44:55

目录

目录

1.原理

2.代码实现

3.仿真实现

4.仿真结果

5.讨论



1.原理

三相锁相环是一种用于控制交流(AC)信号的相位、频率和波形的电路,其原理和应用也广泛用于电源领域。使用三相锁相环可以使交流电源输出的电压稳定、精准地与输入信号同步,并且减少噪声、谐波和其他干扰。

在电源领域中,三相锁相环应用于以下方面:

  1. 电网同步:电网同步是指电源系统输出的交流信号与电网输入的交流信号保持同步。三相锁相环可以用于测量输入的电网信号和输出信号的相位差,并加以纠正,使输出电源与电网保持同步。

  2. 电源输出过程中的纹波、谐波抑制:三相锁相环可以对电源输出的交流信号进行纹波、谐波抑制。通过比较参考信号和输出

  3. 信号,可以生成一个误差信号并对其进行调节,从而减小输出电源中的纹波和谐波。

  4. 交流电源的频率锁定:三相锁相环可以锁定输出电源的频率,确保输出信号频率稳定且与所需频率匹配。

  5. 电源反馈控制:三相锁相环也用于电源反馈控制中,根据输出功率实时调整电源输出电压、电流。

综上所述,三相锁相环在电源领域能够对电源信号进行相位同步、频率锁定、纹波、谐波抑制和反馈控制,保证输出信号质量和稳定性。

2.代码实现

由于三相锁相环实现涉及硬件电路,因此此处提供的C语言代码仅为应用程序范畴内的参考代码。

此处的程序仅实现了一个简单的三相锁相环,其工作主要是将输入信号与参考信号进行比较,然后控制VCO的输出,使之与参考信号同步。实现的示例代码如下:



#include <stdio.h>

#define PI 3.14159265358979323846

int main() {
    double f_ref = 50.0; // 参考频率
    double f_in = 50.5; // 输入频率
    double k_p = 0.1; // 比例系数
    double k_i = 0.01; // 积分系数
    double k_d = 0.01; // 微分系数
    double phase = 0.0; // 相位偏差
    double err_prev = 0.0; // 上一个误差
    double err_int = 0.0; // 误差的积分值
    double err_diff = 0.0; // 误差的微分值

    while(1) {
        // 比较输入信号和参考信号的相位差
        phase = fmod(phase, 2*PI);
        double err = atan2(sin(2*PI*f_in), cos(2*PI*f_in)) - 
                      atan2(sin(2*PI*f_ref + phase), cos(2*PI*f_ref + phase));

        // 控制VCO
        double ctrl = k_p * err + k_i * err_int + k_d * err_diff;

        // 更新误差积分和微分值
        err_int += err;
        err_diff = err - err_prev;
        err_prev = err;

        // 输出控制信号
        printf("Control Signal: %lf\n", ctrl);

        // 延时
        // 此处应和VCO输出数据频率相匹配
    }

    return 0;
}

其中,程序通过比较输入信号和参考信号的相位差来计算误差,然后通过比例、积分和微分控制VCO输出,以消除误差。

注意,由于三相锁相环需要与交流电源的正弦波信号同步,因此需要将程序与外部电路相结合,以实现实时输入数据和输出数据的同步。

这里提供了一个简单的三相锁相环参考代码,具体还需根据实际情况进行实现和调试。

以下代码是对之前的代码改进,将三相锁相环的实现封装为了一个函数:

该函数通过传入参考频率、输入频率以及比例、积分、微分系数,返回相应的控制信号,以实现相位同步。这种通过函数封装的方式,不仅方便调用,也使得整个程序更易于理解和维护。



#include <stdio.h>
#include <math.h>

#define PI 3.14159265358979323846

double PLL(double f_ref, double f_in, double k_p, double k_i, double k_d) {
    // 初始化
    double phase = 0.0;
    double err_prev = 0.0;
    double err_int = 0.0;
    double err_diff = 0.0;

    // 计算相位同步
    while(1) {
        double phase_in = phase + 2*PI*f_in;
        double t_ref = 1/f_ref;
        double t_in = 1/f_in;
        int cnt = (int)(phase_in/t_ref);
        double phase_ref = 2*PI*f_ref*(phase_in - t_ref*cnt)/f_in;
        double err = phase_ref - phase;

        // 控制VCO
        double ctrl = k_p * err + k_i * err_int + k_d * err_diff;

        // 更新误差积分和微分值
        err_int += err;
        err_diff = err - err_prev;
        err_prev = err;

        // 更新相位
        phase += 2*PI*(f_ref + ctrl);

        // 返回控制信号
        return ctrl;
    }
}

int main() {
    // 测试
    double f_ref = 50.0; // 参考频率
    double f_in = 50.5; // 输入频率
    double k_p = 0.1; // 比例系数
    double k_i = 0.01; // 积分系数
    double k_d = 0.01; // 微分系数
    printf("Control Signal: %lf\n", PLL(f_ref, f_in, k_p, k_i, k_d));
    return 0;
}

采用中断方式实现上述代码:


#include <stdio.h>
#include <math.h>
#include "stm32f4xx.h"

#define PI 3.14159265358979323846

double f_ref = 50.0; // 参考频率
double f_in = 50.5; // 输入频率
double k_p = 0.1;   // 比例系数
double k_i = 0.01;  // 积分系数
double k_d = 0.01;  // 微分系数

double phase = 0.0;         // 相位偏差
double err_prev = 0.0;      // 上一个误差
double err_int = 0.0;       // 误差的积分值
double err_diff = 0.0;      // 误差的微分值
volatile double ctrl = 0.0; // 控制信号

void TIM3_IRQHandler(void) {
    // 计算相位同步
    double phase_in = phase + 2 * PI * f_in;
    double t_ref = 1 / f_ref;
    double t_in = 1 / f_in;
    int cnt = (int)(phase_in / t_ref);
    double phase_ref = 2 * PI * f_ref * (phase_in - t_ref * cnt) / f_in;
    double err = phase_ref - phase;

    // 控制VCO
    ctrl = k_p * err + k_i * err_int + k_d * err_diff;

    // 更新误差积分和微分值
    err_int += err;
    err_diff = err - err_prev;
    err_prev = err;

    // 更新相位
    phase += 2 * PI * (f_ref + ctrl);

    // 清除中断标志位
    TIM3->SR &= ~TIM_SR_UIF;
}

int main(void) {
    // 使能定时器时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    // 定时器配置
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1; // 定时器周期 1ms
    TIM_TimeBaseInitStruct.TIM_Prescaler = 42000 - 1; // 分频系数 42MHz/42000=1KHz
    TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

    // 使能定时器中断
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

    // 使能定时器
    TIM_Cmd(TIM3, ENABLE);

    while (1) {
        // 在此处进行相应操作,例如控制输出等
    }
}

在该程序中,定时器TIM3的时钟频率为42MHz,定时器周期为1ms,因此定时器中断会每1ms触发一次,然后在中断服务程序中进行三相锁相环算法的计算,并将计算结果存储在控制信号变量ctrl中,可以在后续的代码中进行控制输出等操作。

3.仿真实现

三相可控整流带PFC仿真

 

 锁相角为theta

4.仿真结果

锁相成功,锁住A相-270度位置。

5.讨论

如果大家在开发的过程中遇到类似的问题,欢迎一起交流。请先私信我,再行联系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin基础(九):对象和委托

前言 本文主要讲解kotlin对象和委托。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 对象 在Kotlin中&#xff0c;对象&#xff08;Object&#xff09;是一个具有特殊用途的单例实例。它是一种创建单个实例的方式&#xff0c;确保在整个应用程序中只存在一个特…

C语言:扫雷(递归+清屏)详细讲解

目录 一.前言 二.功能功能实现 1.游戏菜单/雷盘定义 menu: 雷盘定义&#xff1a; 2.定义布局(数组)/初始化雷盘 数组&#xff1a; 初始化雷盘: 3.打印棋盘 4.布置雷&#xff08;利用随机数&#xff09; 5.排查雷(判断周围雷) 1.判断周围雷数&#xff1a; 2.递归排查…

卡特兰数 公式及其应用

卡特兰数可用于两种场景&#xff08;编程&#xff09; n个元素入栈&#xff0c;共有几种出栈方法n个不同的元素可以组成多少种不同形态的二叉树 卡特兰数的公式是 比如说&#xff1a; 5个元素入栈 那么一共有 种出栈方法 再比如说&#xff08;干咳一声&#xff09; 有4个不…

【雕爷学编程】MicroPython动手做(20)——掌控板之三轴加速度3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

读发布!设计与部署稳定的分布式系统(第2版)笔记27_安全性下

1. 安全配置出现失误 1.1. 攻击者已经通过使用开箱默认的admin登录名和密码&#xff0c;进入了不少应用程序、网络设备和数据库 1.2. 出现配置的遗漏 1.2.1. 服务器默认启用不需要的特性 1.2.1.1. 我们忘记&#xff08;或不知道&#xff09;禁用它们&#xff0c;从而开放了…

C++ 多线程编程导论(下)

文章目录 参考资料线程安全&#xff08;续&#xff09;门闩与屏障——latch 对象与 barrier 对象门闩&#xff08;latch&#xff09;屏障&#xff08;barrier&#xff09; 一次性调用——once_flag 对象与 call_once 函数 异步任务未来与承诺——future 对象与 promise 对象fut…

Ubuntu网络设置之固定IP详解

尊敬的家人们&#xff0c;欢迎观看我的文章&#xff01;今天&#xff0c;我们将为您介绍Ubuntu22.04操作系统中固定IP的设置方法&#xff0c;帮助您更好地管理网络连接并提高网络稳定性。 什么是固定IP&#xff1f; 在网络中&#xff0c;IP地址是设备在网络上的唯一标识。通常…

用html+javascript打造公文一键排版系统9:主送机关排版

一、主送机关的规定 公文一般在标题和正文之间还有主送机关&#xff0c;相关规定为&#xff1a; 主送机关 编排于标题下空一行位置&#xff0c;居左顶格&#xff0c;回行时仍顶格&#xff0c;最后一个机关名称后标全角冒号。如主送机关名称过多导致公文首页不能显示正文时&…

哨兵模式原理

哨兵模式原理 一、定义二、作用三、故障转移机制主节点的选举: 哨兵的模式一、哨兵对主从复制集群进行监控二、哨兵与哨兵之间互相进行监控三、监控的目的 故障切换的原理?cluster模式cluster模式同步两种方式 一、定义 哨兵(sentinel):是一个分布式系统&#xff0c;用于对主…

pytest 入门

1,安装pytest 打开终端或命令提示符窗口,在终端中运行以下命令来安装pytest: pip install pytestpip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest 确保您的系统上已经安装了Python。您可以在终端中运行以下命令来检查Python的安装情况: pytest --version…

MATLAB | 如何绘制这样的描边散点图?

part.-1 前前言 最近略忙可能更新的内容会比较简单&#xff0c;见谅哇&#xff0c;今日更新内容&#xff1a; part.0 前言 看到gzhBYtools科研笔记(推荐大家可以去瞅瞅&#xff0c;有很多有意思的图形的R语言复现&#xff01;&#xff01;)做了这样一张图&#xff1a; 感觉很…

RK3588平台开发系列讲解(LCD篇)FrameBuffer 操作步骤

文章目录 一、FrameBuffer 介绍二、屏幕参数信息的获取三、刷新 FrameBuffer四、FrameBuffer 例程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在应用程序中,操作/dev/fbX 的一般步骤进行介绍。 打开 FrameBuffer 设备;获取 FrameBuffer 设备的固定信息和可变信息;…

生成对抗网络DCGAN学习实践

在AI内容生成领域&#xff0c;有三种常见的AI模型技术&#xff1a;GAN、VAE、Diffusion。其中&#xff0c;Diffusion是较新的技术&#xff0c;相关资料较为稀缺。VAE通常更多用于压缩任务&#xff0c;而GAN由于其问世较早&#xff0c;相关的开源项目和科普文章也更加全面&#…

809协议服务端程序解码程序

809协议服务端程序解码程序 目录概述需求&#xff1a; 设计思路实现思路分析1.服务端2.code: 拓展实现性能参数测试&#xff1a;1.功能测试 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip…

【LeetCode】探索杨辉三角模型

一、题目描述 力扣原题 首先我们要来了解一下题目本身在说些什么&#xff0c;通过下方的动图我们可以更加清楚地看到杨辉三角是怎样一步步生成的。给到的示例中我们通过输入杨辉三角的行数&#xff0c;然后通过计算得到这个杨辉三角的每一行是什么具体的数值 二、模型选择 首先…

大数据技术之ClickHouse---入门篇---介绍

星光下的赶路人star的个人主页 一棵树长到它想长到的高度之后&#xff0c;它才知道怎样的空气适合它 文章目录 1、Clickhouse入门1.1 什么是Clickhouse1.1.1 Clickhouse的特点1.1.1.1 列示储存1.1.1.2 DBMS的功能1.1.1.3 多样化引擎1.1.1.4 高吞吐写入能力1.1.1.5 数据分区与线…

JAVA SE -- 第十三天

&#xff08;全部来自“韩顺平教育”&#xff09; 集合 一、集合框架体系 集合主要是两组&#xff08;单列集合、双列集合&#xff09; Collection接口有两个重要的子接口List 、Set&#xff0c;它们的实现子类都是单列集合 Map接口的实现子类是双列集合&#xff0c;存放的…

进阶C语言——再识结构体

1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 2 结构的声明 struct tag {member-list; }variable-list;如果下面来描述一个学生的话&#xff0c;我们会想到学生的姓名&#xff0c;成绩&#xff0c;性别等&#…

【序列化工具JdkSerialize和Protostuff】

序列化工具对比 JdkSerialize&#xff1a;java内置的序列化能将实现了Serilazable接口的对象进行序列化和反序列化&#xff0c; ObjectOutputStream的writeObject()方法可序列化对象生成字节数组 Protostuff&#xff1a;google开源的protostuff采用更为紧凑的二进制数组&#…

1-linux下mysql8.0.33安装

在互联网企业的日常工作/运维中&#xff0c;我们会经常用到mysql数据库&#xff0c;而linux下mysql的安装方式有三种&#xff1a; 1.mysql rpm安装 2.mysql二进制安装 3.mysql源码安装 今天就为大家讲讲linux下mysql8.0.33版本rpm方式的安装。 1.前提 1.1.系统版本 Cent…