SVPWM马鞍波形仿真(python)

SVPWM波的原理不再过多介绍。

最近在学习SVPWM,仿真了一下马鞍波。

python源码贡献出来。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim#############################################
# 我们的目的是根据机械角度,生成电角度,然后根据电角度算出Ta,Tb,Tv0,Tv7
# 动态图部分:机械角度-->电角度-->Ta/Tb/Tv0/Tv7-->马鞍波-->PWM波class SVPWM_WAVE():def __init__(self):self.Udc = 1self.Vk = 2/3*self.Udcself.pwm_act_percent = 0.5self.V_ref = np.sqrt(3)/2*self.Vk*self.pwm_act_percentself.pole_num = 3  # 电机的磁极对数# 电机旋转的角速度self.motor_omiga = 10*2*np.pi# 电机旋转的总时长self.total_time = 0.1 # 单位:s# 电机旋转的总角度self.total_macAng = self.total_time*self.motor_omiga# 仿真时间精度self.time_precision = 0.0002 # 单位:s# 仿真总数据点self.sim_N = np.uint32(self.total_time/self.time_precision)# 仿真时间所有的刻度self.sim_t = np.array([i*self.total_time/self.sim_N for i in range(self.sim_N)])self.machineAng = Noneself.elecAng = Noneself.elecAng_p = Noneself.sector_no = Noneself.v_theta = Noneself.vector_a = Noneself.vector_b = Noneself.Ta = Noneself.Tb = Noneself.Tv7 = Noneself.pwm1_percent = Noneself.pwm2_percent = Noneself.pwm3_percent = None# 每一个点的数据记录self.machineAng_record = []self.elecAng_record = []self.vector_a_record = []self.v_theta_record = []self.Ta_record = []self.Tb_record = []self.Tv0_record = []self.Tv7_record = []self.pwm1_percent_record = []self.pwm2_percent_record = []self.pwm3_percent_record = []# 绘制 电机的 Machine Angleself.machine_position_x = Noneself.machine_position_y = Noneself.electric_position_x = Noneself.electric_position_y = Noneself.fig = Noneself.pwm_total_period = 1000self.pwm_wave_x_line = np.array([i*100/self.pwm_total_period for i in range(self.pwm_total_period)])def machineAng_2_electricAng(self, macAng):self.elecAng = macAng*self.pole_numdef get_elec_sectorno(self):self.elecAng_p = self.elecAngwhile(self.elecAng>=2*np.pi):self.elecAng = self.elecAng - 2*np.piif(self.elecAng >= 5*np.pi/3):self.sector_no = 5self.vector_a = 5*np.pi/3return 0elif(self.elecAng >= 4*np.pi/3):self.sector_no = 4self.vector_a = 4*np.pi/3return 0elif(self.elecAng >= np.pi):self.sector_no = 3self.vector_a = np.pireturn 0elif(self.elecAng >= 2*np.pi/3):self.sector_no = 2self.vector_a = 2*np.pi/3return 0elif(self.elecAng>= np.pi/3):self.sector_no = 1self.vector_a = np.pi/3return 0elif(self.elecAng>=0):self.sector_no = 0self.vector_a = 0return 0def get_TaTb_Tv7(self):'''计算Ta Tb Tv7'''# 公式 Tb*Vk/sin(theta) = Ta*Vk/sin(pi/3-theta) = Vref/sin(2*pi/3)self.v_theta = self.elecAng - self.vector_aself.Ta = self.V_ref/self.Vk*np.sin(np.pi/3-self.v_theta)/np.sin(2*np.pi/3)self.Tb = self.V_ref/self.Vk*np.sin(self.v_theta)/np.sin(2*np.pi/3)self.Tv7 = (self.pwm_act_percent - self.Ta - self.Tb)/2def trans_TaTbTv7_PWM(self):'''...-100-110-010-011-001-101-100-...'''if(self.sector_no == 0):# -0-4-6-7-7-6-4-0-#                    4(100)    6(110)     7(111)self.pwm3_percent = self.Ta + self.Tb + self.Tv7 # bit 2self.pwm2_percent =           self.Tb + self.Tv7 # bit 1self.pwm1_percent =                     self.Tv7 # bit 0elif(self.sector_no == 1):# -0-2-6-7-7-6-2-0-#                    2(010)    6(110)     7(111)self.pwm3_percent =           self.Ta + self.Tv7 # bit 2self.pwm2_percent = self.Tb + self.Ta + self.Tv7 # bit 1self.pwm1_percent =                     self.Tv7 # bit 0elif(self.sector_no == 2):# -0-2-3-7-7-3-2-0-#                    2(010)    3(011)     7(111)self.pwm3_percent =                     self.Tv7 # bit 2self.pwm2_percent = self.Ta + self.Tb + self.Tv7 # bit 1self.pwm1_percent =           self.Tb + self.Tv7 # bit 0elif(self.sector_no == 3):# -0-1-3-7-7-3-1-0-#                    1(001)    3(011)     7(111)self.pwm3_percent =                     self.Tv7 # bit 2self.pwm2_percent =           self.Ta + self.Tv7 # bit 1self.pwm1_percent = self.Tb + self.Ta + self.Tv7 # bit 0elif(self.sector_no == 4):# -0-1-5-7-7-5-1-0-#                    1(001)    5(101)     7(111)self.pwm3_percent =           self.Tb + self.Tv7 # bit 2self.pwm2_percent =                     self.Tv7 # bit 1self.pwm1_percent = self.Ta + self.Tb + self.Tv7 # bit 0elif(self.sector_no == 5):# -0-4-5-7-7-5-4-0-#                    4(100)    5(101)     7(111)self.pwm3_percent =  self.Tb + self.Ta + self.Tv7 # bit 2self.pwm2_percent =                      self.Tv7 # bit 1self.pwm1_percent =            self.Ta + self.Tv7 # bit 0def motor_record_p(self, t):self.machineAng = t*self.motor_omigaself.machineAng_2_electricAng(self.machineAng)self.get_elec_sectorno()self.get_TaTb_Tv7()self.trans_TaTbTv7_PWM()def motor_record(self):for t_i in self.sim_t:self.motor_record_p(t_i)self.machineAng_record.append(self.machineAng)self.elecAng_record.append(self.elecAng_p)self.vector_a_record.append(self.vector_a)self.v_theta_record.append(self.v_theta)self.Ta_record.append(self.Ta)self.Tb_record.append(self.Tb)self.Tv0_record.append(self.Tv7)self.Tv7_record.append(self.Tv7)self.pwm1_percent_record.append(self.pwm1_percent)self.pwm2_percent_record.append(self.pwm2_percent)self.pwm3_percent_record.append(self.pwm3_percent)svpwm.pwm1_percent_record = np.array(svpwm.pwm1_percent_record)svpwm.pwm2_percent_record = np.array(svpwm.pwm2_percent_record)svpwm.pwm3_percent_record = np.array(svpwm.pwm3_percent_record)def graph_pwm_duty(self, duty):duty_low_half = np.uint32(self.pwm_total_period*(1-duty)/2)duty_high = self.pwm_total_period - 2*duty_low_halfc = []a = [0]*duty_low_halfb = [1]*duty_highc.extend(a)c.extend(b)c.extend(a)return np.array(c)def plot_gif_init(self):# 7.8-5.5; 5-3.5self.fig = plt.figure(figsize=(7.8,5))self.machine_position_x = np.cos(self.machineAng_record)self.machine_position_y = np.sin(self.machineAng_record)self.electric_position_x = np.cos(self.elecAng_record)self.electric_position_y = np.sin(self.elecAng_record)pwm1_y = self.graph_pwm_duty(self.pwm1_percent_record[0])pwm2_y = self.graph_pwm_duty(self.pwm2_percent_record[0])pwm3_y = self.graph_pwm_duty(self.pwm3_percent_record[0])plt.subplot(2,3,1)plt.plot(self.machine_position_x, self.machine_position_y, color='k',ls='-.')self.mac_pos_point_x_list = []self.mac_pos_point_y_list = []self.mac_pos_point, = plt.plot(self.machine_position_x[0], self.machine_position_y[0],color='k', marker='o')self.mac_pos_vector_line_x_list = []self.mac_pos_vector_line_y_list = []self.mac_pos_vector_line, = plt.plot([0,self.machine_position_x[0]], [0, self.machine_position_y[0]], color='k')plt.ylabel("Machine Angle")plt.subplot(2,3,4)plt.plot(self.electric_position_x, self.electric_position_y, color='gray',ls='-.')self.ele_pos_point_x_list = []self.ele_pos_point_y_list = []self.ele_pos_point, = plt.plot(self.electric_position_x[0], self.electric_position_y[0], color='gray', marker='o')self.ele_pos_vector_line_x_list = []self.ele_pos_vector_line_y_list = []self.ele_pos_vector_line, = plt.plot([0,self.electric_position_x[0]], [0, self.electric_position_y[0]], color='gray')plt.ylabel("Electric Angle")plt.subplot(3,3,2)plt.plot(self.elecAng_record, self.pwm1_percent_record, color='r')self.pwmx_point_x_list = []self.pwm1_point_y_list = []self.pwm1_point, = plt.plot(self.elecAng_record[0], self.pwm1_percent_record[0], color='r', marker='o',ls='')self.pwmx_marker_line_x_list = []self.pwmx_marker_line_y_list = []self.pwm1_marker_line, = plt.plot([self.elecAng_record[0], self.elecAng_record[0]], [-0.1, 1.1], color='r', ls='-.', alpha= 0.5)plt.subplot(3,3,5)plt.plot(self.elecAng_record, self.pwm2_percent_record, color='g')self.pwm2_point_y_list = []self.pwm2_point, = plt.plot(self.elecAng_record[0], self.pwm2_percent_record[0], color='g', marker='o', ls='')self.pwm2_marker_line, = plt.plot([self.elecAng_record[0], self.elecAng_record[0]], [-0.1, 1.1], color='g', ls='-.', alpha= 0.5)plt.subplot(3,3,8)plt.plot(self.elecAng_record, self.pwm3_percent_record, color='b')self.pwm3_point_y_list = []self.pwm3_point, = plt.plot(self.elecAng_record[0], self.pwm3_percent_record[0], color='b', marker='o', ls='')self.pwm3_marker_line, = plt.plot([self.elecAng_record[0], self.elecAng_record[0]], [-0.1, 1.1], color='b', ls='-.', alpha= 0.5)plt.xlabel("U/V/W Voltage")plt.subplot(3,3,3)self.pwm_wave_x_line_x_list = []self.pwm_wave_1_line_y_list = []self.pwm_wave_1_line, = plt.plot(self.pwm_wave_x_line, pwm1_y, color='r')plt.ylim(-0.5,1.5)plt.subplot(3,3,6)self.pwm_wave_2_line_y_list = []self.pwm_wave_2_line, = plt.plot(self.pwm_wave_x_line, pwm2_y, color='g')plt.ylim(-0.5,1.5)plt.subplot(3,3,9)self.pwm_wave_3_line_y_list = []self.pwm_wave_3_line, = plt.plot(self.pwm_wave_x_line, pwm3_y, color='b')plt.ylim(-0.5,1.5)plt.xlabel("SVPWM Duty")def update_plot(self, num):##############################################################################self.mac_pos_point_x_list = self.machine_position_x[num]self.mac_pos_point_y_list = self.machine_position_y[num]self.mac_pos_vector_line_x_list = [0, self.machine_position_x[num]]self.mac_pos_vector_line_y_list = [0, self.machine_position_y[num]]self.mac_pos_point.set_data(self.mac_pos_point_x_list, self.mac_pos_point_y_list)self.mac_pos_vector_line.set_data(self.mac_pos_vector_line_x_list, self.mac_pos_vector_line_y_list)##############################################################################self.ele_pos_point_x_list = self.electric_position_x[num]self.ele_pos_point_y_list = self.electric_position_y[num]self.ele_pos_vector_line_x_list = [0, self.electric_position_x[num]]self.ele_pos_vector_line_y_list = [0, self.electric_position_y[num]]self.ele_pos_point.set_data(self.ele_pos_point_x_list, self.ele_pos_point_y_list)self.ele_pos_vector_line.set_data(self.ele_pos_vector_line_x_list, self.ele_pos_vector_line_y_list)############################################################################### 更新SVPWM波的占空比self.pwmx_point_x_list = self.elecAng_record[num]self.pwm1_point_y_list = self.pwm1_percent_record[num]self.pwm2_point_y_list = self.pwm2_percent_record[num]self.pwm3_point_y_list = self.pwm3_percent_record[num]self.pwm1_point.set_data(self.pwmx_point_x_list, self.pwm1_point_y_list)self.pwm2_point.set_data(self.pwmx_point_x_list, self.pwm2_point_y_list)self.pwm3_point.set_data(self.pwmx_point_x_list, self.pwm3_point_y_list)# 更新当前角度在SVPWM波的位置self.pwmx_marker_line_x_list = [self.elecAng_record[num], self.elecAng_record[num]]self.pwmx_marker_line_y_list = [-0.1, 1.1]self.pwm1_marker_line.set_data(self.pwmx_marker_line_x_list, self.pwmx_marker_line_y_list)self.pwm2_marker_line.set_data(self.pwmx_marker_line_x_list, self.pwmx_marker_line_y_list)self.pwm3_marker_line.set_data(self.pwmx_marker_line_x_list, self.pwmx_marker_line_y_list)############################################################################### PWM方波pwm1_y = self.graph_pwm_duty(self.pwm1_percent_record[num])pwm2_y = self.graph_pwm_duty(self.pwm2_percent_record[num])pwm3_y = self.graph_pwm_duty(self.pwm3_percent_record[num])self.pwm_wave_x_line_x_list = self.pwm_wave_x_lineself.pwm_wave_1_line_y_list = pwm1_yself.pwm_wave_2_line_y_list = pwm2_yself.pwm_wave_3_line_y_list = pwm3_yself.pwm_wave_1_line.set_data(self.pwm_wave_x_line_x_list, self.pwm_wave_1_line_y_list)self.pwm_wave_2_line.set_data(self.pwm_wave_x_line_x_list, self.pwm_wave_2_line_y_list)self.pwm_wave_3_line.set_data(self.pwm_wave_x_line_x_list, self.pwm_wave_3_line_y_list)def gen_gif_plot(self, save_path):ani = anim.FuncAnimation(fig=self.fig, func=self.update_plot, frames=np.arange(1, self.sim_N), interval=10)# ani.save(save_path)plt.show()if __name__ == "__main__":svpwm = SVPWM_WAVE()svpwm.motor_record()svpwm.plot_gif_init()# plt.show()svpwm.gen_gif_plot('svpwm.gif')

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

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

相关文章

12.16_黑马数据结构与算法笔记Java

目录 167 B树 remove 168 B树 remove 搭架子 169 B树 remove case1-4 170 B树 remove case5-6分析 171 B树 remove case5 旋转 172 B树 remove case5 合并 173 B树 remove case6 174 B树 remove 演示1 175 B树 remove 演示2 176 哈希表 概述 177 哈希表 hash码映射索…

XXE漏洞 [NCTF2019]Fake XML cookbook1

打开题目 查看源代码 发现我们post传入的数据都被放到了doLogin.php下面 访问一下看看 提示加载外部xml实体 bp抓包一下看看 得到flag 或者这样 但是很明显这样是不行的,因为资源是在admin上,也就是用户名那里 PHP引用外部实体,常见的利用…

(2)Linux 操作系统||基本创建与操作

本章将浅谈一下 "操作系统是什么" 的问题,随后通过讲解一些 Linux 下的基本指令,显示目录内容、跳转操作和文件的创建与删除。在讲解的同时我会穿插一些知识点,比如 Linux 隐藏文件、路径等基础知识。 了解操作系统 什么是操作系统…

【Java 并发】三大特性

在 Java 的高并发中,对于线程并发问题的分析通常可以通过 2 个主核心进行分析 JMM 抽象内存模型和 Happens-Before 规则三大特性: 原子性, 有序性和可见性 JMM 抽象内存模型和 Happens-Before 规则, 前面我们讨论过了。这里讨论一下三大特性。 1 原子性 定义: 一个…

第十一章 算法复杂度

11.1 大O表示法 它用于描述算法的性能和复杂程度。分析算法时,时常遇到以下几类函数: 11.1.1 理解大O表示法 如何衡量算法的效率?通常是用资源,例如CPU(时间)占用、内存占用、硬盘占用和网络 占用。当讨论…

时序预测 | Python实现GRU电力需求预测

时序预测 | Python实现GRU电力需求预测 目录 时序预测 | Python实现GRU电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比较。使用该…

同义词替换在论文降重中的实际效果评估 快码论文

大家好,今天来聊聊同义词替换在论文降重中的实际效果评估,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:同义词替换在论文降重中的实际效果评…

PMI相关证书的获取步骤及注意内容

近几年很多行业的从业人员都在考取PMI项目管理相关证书,可在中国大陆地区参加考试的认证主要有:PMP, PgMP, PMI-RMP, PMI-ACP, PMI-PBA, CAPM。PfMP, PMI-SP尚未在中国大陆地区开放考试。 现整理该类证书的相关获取步骤及注意内容 一、证书获取步骤 S…

RHEL8_Linux下载ansible

本章内容主要介绍RHEL8中如何安装ansible ansible时如何工作的在RHEL8中安装ansible 1.ansible工作原理 如果管理的服务器很多,如几十台甚至几百台,那么就需要一个自动化管理工具了,ansible就是这样的一种自动化管理工具。 1&…

将html的radio单选框自定义样式为正方形和对号

将html的radio单选框自定义样式为正方形和对号 背景&#xff1a; 如何能把html的<input type"radio" name"option">改成自定义的样式呢&#xff1f;比如想要把他变成正方形&#xff0c;选中的时候是对号。默认的样式太丑了 默认样式&#xff1a; 自…

2023前端面试题总结:JavaScript篇完整版

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 JavaScript基础知识 JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; Number&#xff08;数字&#xff09;: 用于表示数值&#xff0c;可…

LLM Agent发展演进历史(观看metagpt视频笔记)

LLM相关的6篇重要的论文&#xff0c;其中4篇来自谷歌&#xff0c;2篇来自openai。技术路径演进大致是&#xff1a;SSL (Self-Supervised Learning) -> SFT (Supervised FineTune) IT (Instruction Tuning) -> RLHF。 word embedding的问题&#xff1a;新词如何处理&…

【二分查找】自写二分函数的总结

作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的基础知识点 二分查找算法合集 自写二分函数 的封装 我暂时只发现两种&#xff1a; 一&#xff0c;在左闭右开的区间寻找最后一个符合条件的元素&#xff0c;我封装成FindEnd函数。…

Linux---进程概念

目录 一、冯诺依曼体系结构 二、操作系统 1.关于下三层的理解 2.关于上三层的理解 三、进程 1.进程(也叫做任务)对应的标识符---pid 2.fork---用代码创建进程(系统接口) 1&#xff09;初步认识一下fork 2&#xff09;fork函数的返回值 3&#xff09;fork的原理 问题1…

虚拟机性能监控、故障处理工具

虚拟机性能监控、故障处理工具 二、基础故障处理工具4.2.1 jps&#xff1a;虚拟机进程状况工具4.2.2 jstat:虚拟机统计信息监视工具4.2.3 jinfo:Java配置信息工具4.2.4 jmap:java内存映像工具4.2.5 jhat:虚拟机堆转储快照分析工具4.2.6 jstack&#xff1a;Java堆栈跟踪工具4.2.…

四舍五入浮点数

1.题目如下&#xff1a; 2.方法一&#xff1a; 直接取出小数部分第一位来判断。 1. 先乘以10。 2. 强制类型转换为整型&#xff0c;去掉小数部分。 3. 再模10&#xff0c;相当于取出原数的小数第一位。 代码实现&#xff1a; int way1(double n) {int a (int)(n * 10);int b…

后端开发——统一处理异常Spring MVC机制

一、Spring MVC的统一处理异常机制 在Spring MVC中&#xff0c;存在统一处理异常的机制&#xff0c; 具体表现为&#xff1a;无论是哪个处理请求的过程中出现异常&#xff0c;每种类型的异常只需要编写一段处理异常的代码即可&#xff01; 统一处理异常的核心是定义处理异常的…

【k8s】使用Finalizers控制k8s资源删除

文章目录 词汇表基本删除操作Finalizers是什么&#xff1f;Owner References又是什么&#xff1f;强制删除命名空间参考 你有没有在使用k8s过程中遇到过这种情况: 通过kubectl delete指令删除一些资源时&#xff0c;一直处于Terminating状态。 这是为什么呢&#xff1f; 本文将…

智能优化算法应用:基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.静电放电算法4.实验参数设定5.算法结果6.…

FME之FeatureReader转换器按表格内容读取矢量数据

问题&#xff1a;平时会遇到只用某个大数据里某小部分数据参与下一步数据处理&#xff0c;此时我们会用到FeatureReader转换器&#xff0c;一般是通过空间关系&#xff08;相交、包含&#xff09;来读取相应涉及的图斑矢量&#xff0c;但就有一个问题&#xff0c;加入你的启动器…