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

目录

目录

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.讨论

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何降低TCP在局域网环境下的数据传输延迟

以Ping为例。本案例是一个测试题目&#xff0c;只有现象展示&#xff0c;不含解决方案。 ROS_Kinetic_26 使用rosserial_windows实现windows与ROS master发送与接收消息_windows 接收ros1 消息 什么是ping&#xff1f; AI&#xff1a; ping是互联网控制消息协议&#xff08;…

国内 github.com经常打不开的解决办法

1、打开网站http://tool.chinaz.com/dns/ 2、在A类型中填写github.com,再点击监测按钮 3、复制下面任意一个ip 4、打开电脑文件C:\Windows\System32\drivers\etc下的host文件 5、在host文件的最后一刚加入刚才复制的IP 6、重新打开GitHub

tensorRT模型性能测试

目录 前言1. 模型训练1.1 模型1.2 数据集1.3 xml2yolo1.4 yolo2json1.5 json2yolo1.6 训练 2. TRT模型转换2.1 YOLOv5 ONNX导出2.2 YOLOv6 ONNX导出2.3 YOLOv5 engine生成2.4 YOLOv6 engine生成 3. TRT模型测试3.1 YOLOv5 engine mAP测试3.2 YOLOv5 engine 速度测试3.3 YOLOv6 …

第120天:免杀对抗-防朔源防流量防特征CDN节点SSL证书OSS存储上线

知识点 #知识点&#xff1a; 1、CS-CDN节点-防拉黑 2、CS-SSL证书-防特征 3、CS-OSS存储-防流量#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 代码加载面-D…

【ARM】内核驱动之设备树的学习-长文

❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑! 文章目录 一、什么是设备树,为什么叫设备树?二、如何编译设备树?三、…

【语音控制SU-03T的使用】

语音控制SU-03T的使用 最近入手了SU-03T型号的语音模块&#xff0c;下面记录一下使用方式。相对于LD3320语音模块来说SU-03T更智能、使用更方便&#xff0c;从价格来讲也相对便宜&#xff0c;需要的可以在淘宝自行购买。 引脚详解一、智能公元/AIOT产品化平台配置 智能公元链接…

React井字棋游戏官方示例

在本篇技术博客中&#xff0c;我们将介绍一个React官方示例&#xff1a;井字棋游戏。我们将逐步讲解代码实现&#xff0c;包括游戏的组件结构、状态管理、胜者判定以及历史记录功能。让我们一起开始吧&#xff01; 项目概览 在这个井字棋游戏中&#xff0c;我们有以下组件&am…

【数据预测】基于蜣螂优化算法DBO的VMD-KELM光伏发电功率预测 短期功率预测【Matlab代码#53】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 蜣螂优化算法DBO2. 变分模态分解VMD3. 核极限学习机KELM4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. 蜣螂…

Vulnhub: hacksudo: search靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.170 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.170 80端口目录爆破 feroxbuster -k -d 1 --url http://192.168.111.170 -w /opt/zidian/SecLists-2022.2/Discovery/Web…

机器学习之Boosting和AdaBoost

1 Boosting和AdaBoost介绍 1.1 集成学习 集成学习 (Ensemble Learning) 算法的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。 集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分类器/模型&#xff0c;各自独立地学…

ChatGPT长文本对话输入方法

ChatGPT PROMPTs Splitter 是一个开源工具&#xff0c;旨在帮助你将大量上下文数据分成更小的块发送到 ChatGPT 的提示&#xff0c;并根据如何处理所有块接收到 ChatGPT&#xff08;或其他具有字符限制的语言模型&#xff09;的方法。 推荐&#xff1a;用 NSDT设计器 快速搭建可…

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中&#xff0c;遇到了实时音视频呼叫通知&#xff0c;当App未打开或者App在后台时候&#xff0c;需要通知到用户&#xff0c;用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…

【雕爷学编程】MicroPython动手做(17)——掌控板之触摸引脚

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

ChatGLM-6B 部署与 P-Tuning 微调实战-使用Pycharm实战

国产大模型ChatGLM-6B微调部署入门-使用Pycharm实战 1.ChatGLM模型介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本…

【指针二:穿越编程边界的超能力】

本章重点 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 五、函数指针 首先看一段代码&#xff1a; 输出的是两个地址相同&#xff0c;这两个相同的地址都是 test 函数的地址。 那我们的函数的地址要想保存起来&#xff0c;怎么保存&#xff1f; 下面我…

Install the Chinese input method on Linux

Open terminal and input: sudo -i apt install fcitx fcitx-googlepinyinWait for it to finish. Search fcitx: "设置"-->"输入法": Finally, we get the following result&#xff1a; Ctrl Space&#xff1a;Switch the input method. The test …

HbuilderX运行时遇见文件找不到问题

错误类型 解决方法 找到报错的文件 系统提示crypto-js 和 sm-crypto 找不到&#xff0c;然后注释掉找不到的文件 运行成功&#xff01;&#xff01;&#xff01;

【OpenCV • c++】图像几何变换 | 图像坐标映射

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

今天学学消息队列RocketMQ:消息类型

RocketMQ支持的消息类型有三种&#xff1a;普通消息、顺序消息、延时消息、事务消息。以下内容的代码部分都是基于rocketmq-spring-boot-starter做的。 普通消息 普通消息是一种无序消息&#xff0c;消息分布在各个MessageQueue当中&#xff0c;以保证效率为第一使命。这种消息…

AI绘画Stable Diffusion原理之Autoencoder-Latent

前言 传送门&#xff1a; stable diffusion&#xff1a;Git&#xff5c;论文 stable-diffusion-webui&#xff1a;Git Google Colab Notebook&#xff1a;Git kaggle Notebook&#xff1a;Git 今年AIGC实在是太火了&#xff0c;让人大呼许多职业即将消失&#xff0c;比如既能帮…