热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎么理解Svpwm原理

这篇文章主要讲解了“怎么理解Svpwm原理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解

这篇文章主要讲解了“怎么理解Svpwm原理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Svpwm原理”吧!

SVPWM

SVPWM是空间矢量脉宽调制(Space Vector Pulse Width  Modulation)的简称,通常由三相逆变器的六个功率开关管组成,经过特定的时序和换相所所产生的脉冲宽度调制波,最终输出的波形可能会十分接近理想的正弦波形。具体如下图所示;左侧为复平面,即空间矢量,右侧为时域的正弦波形;

怎么理解Svpwm原理

IQMATH

TI的片子很香,控制方面,TI无疑是做的最好的方案之一,相对来说资料也非常齐全;另外TI针对没有浮点运算器的定点DSP推出了IQMATH库,在使用Q格式对数据进行分析和处理的过程中,十分方便,代码也变得更加简洁,本文将使用TI的提供的SVPWM算法基于STM32平台实现SVPWM调制。

测试平台参数:硬件:stm32f103软件:标准外设库3.5IDE:MDK-ARM

IQmathLib

本文使用了IQMathLib的Cortex-M3版本,这样一来,对于没有浮点处理器的定点MCU来说,对数据统一进行Q格式的处理会变得更加便捷,并且高效;

首先将IQmathlib解压可以得到如下文件,其中包含各个平台下的静态库,本文使用STM32F1在keil环境下进行开发,需要使用的是rvmdk-cm3。

怎么理解Svpwm原理

打开一个keil工程,在菜单界面点击如下图所示的图标进入project items;

怎么理解Svpwm原理

添加IQmath组,并添加rvmdk-cm3路径下的静态库,和头文件;

怎么理解Svpwm原理

点击下图所示的图标进入工程熟悉的设置;

怎么理解Svpwm原理

添加rvmdk-cm3静态库的路径,和头文件的包含路径,如下图所示;

怎么理解Svpwm原理

怎么理解Svpwm原理

最终,build整个工程即可。

测试部分程序

/** #include "stm32f10x.h" #include  #include   #include "serial_scope.h" #include "common.h" #include "IQmathLib.h" #include "usart_driver.h" #include "clarke.h" #include "park.h" #include "svpwm.h"  /**   * @brief  Main program.   * @param  None   * @retval None   */ sv_mod_t svpwm = SVGEN_DEFAULTS;  #define CLARK  0 #define PARK  1 #define SVPWM  2 #define SVPWM_REG 3  int main(void) {  int user_data[4] = { 0 };  static int16_t time_cnt = 0;  Trig_Components a;  Trig_Components b;  _iq final_angle;  usart_init();    while (1)  {     time_cnt-=32;      clarke_parameter.As = _IQsinPU(time_cnt);   clarke_parameter.Bs = _IQsinPU(time_cnt-0x5555);      if(clarke_parameter.As > 32767){    clarke_parameter.As = 32767;   }   if(clarke_parameter.As < -32768){    clarke_parameter.As = -32768;   }      if(clarke_parameter.Bs > 32767){    clarke_parameter.Bs = 32767;   }   if(clarke_parameter.Bs < -32768){    clarke_parameter.Bs = -32768;   }      clarke_calc(&clarke_parameter);      park_parameter.Alpha = clarke_parameter.Alpha;   park_parameter.Beta = clarke_parameter.Beta;      park_parameter.Sin = trig_functions(time_cnt).hsin;   park_parameter.Cos = trig_functions(time_cnt).hcos;   park_parameter.Angle = -time_cnt;   park_calc(&park_parameter);      svpwm.Ualpha = clarke_parameter.Alpha;   svpwm.Ubeta = clarke_parameter.Beta;      svpwm_calc(&svpwm);      #define FOC_DEBUG  SVPWM_REG #if (FOC_DEBUG == CLEAK)   user_data[0] = clarke_parameter.As;   user_data[1] = clarke_parameter.Bs;   user_data[2] = clarke_parameter.Alpha;   user_data[3] = clarke_parameter.Beta;   #elif (FOC_DEBUG == PARK)   user_data[0] = clarke_parameter.As;   user_data[1] = clarke_parameter.Bs;   user_data[2] = park_parameter.Ds;   user_data[3] = park_parameter.Qs; #elif (FOC_DEBUG == SVPWM)    user_data[0] = (uint16_t)svpwm.Ta;   user_data[1] = (uint16_t)svpwm.Tb;   user_data[2] = (uint16_t)svpwm.Tc;   user_data[3] = svpwm.VecSector*5000; #elif (FOC_DEBUG == SVPWM_REG)      //换算的CCRx寄存器的值   sv_regs_mod_t sv_regs = svpwm_get_regs_mod(7200,&svpwm);      user_data[0] = sv_regs.ccr1;   user_data[1] = sv_regs.ccr2;   user_data[2] = sv_regs.ccr3;   user_data[3] = svpwm.VecSector*1000; #endif   SDS_OutPut_Data_INT(user_data);  }  return 0; }

最终通过串口输出串口图形化软件的Ta,Tb,Tc 如下图所示;

怎么理解Svpwm原理

关于STM32的配置,需要配置三路互补PWM波形输出;例如配置了TIM1的CH1,CH2,CH3这三路PWM输出,然后可以把Ta,Tb,Tc的值分别赋值给CCR1,CCR2,CCR3即可;

具体如下图所示;左侧是复平面的矢量合成动态图;右侧是三路PWM输出通道的比较状态;

怎么理解Svpwm原理

开关状态

附件

怎么理解Svpwm原理

怎么理解Svpwm原理

感谢各位的阅读,以上就是“怎么理解Svpwm原理”的内容了,经过本文的学习后,相信大家对怎么理解Svpwm原理这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程笔记,小编将为大家推送更多相关知识点的文章,欢迎关注!


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
黄承念63772
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有