对不起!这篇Svpwm来晚了!

开发 前端
SVPWM是空间矢量脉宽调制(Space Vector Pulse Width Modulation)的简称,通常由三相逆变器的六个功率开关管组成,经过特定的时序和换相所所产生的脉冲宽度调制波,最终输出的波形可能会十分接近理想的正弦波形。

 [[379610]]

本文转载自微信公众号「小麦大叔」,可以通过以下二维码关注。转载本文请联系小麦大叔公众号。

SVPWM

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

关于SVPWM原理的文章非常多,这里可以推荐一下网上一个非常不错的教程《SVPWM的原理及法则推导和控制算法详解第五修改版》,本文将如何实现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。

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

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

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

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

最终,build整个工程即可。

测试部分程序

  1. /** 
  2. #include "stm32f10x.h" 
  3. #include <stdio.h> 
  4. #include <stdint.h> 
  5.  
  6. #include "serial_scope.h" 
  7. #include "common.h" 
  8. #include "IQmathLib.h" 
  9. #include "usart_driver.h" 
  10. #include "clarke.h" 
  11. #include "park.h" 
  12. #include "svpwm.h" 
  13.  
  14. /** 
  15.   * @brief  Main program. 
  16.   * @param  None 
  17.   * @retval None 
  18.   */ 
  19. sv_mod_t svpwm = SVGEN_DEFAULTS; 
  20.  
  21. #define CLARK  0 
  22. #define PARK  1 
  23. #define SVPWM  2 
  24. #define SVPWM_REG 3 
  25.  
  26. int main(void) 
  27.  int user_data[4] = { 0 }; 
  28.  static int16_t time_cnt = 0; 
  29.  Trig_Components a; 
  30.  Trig_Components b; 
  31.  _iq final_angle; 
  32.  usart_init();  
  33.  
  34.  while (1) 
  35.  {   
  36.   time_cnt-=32; 
  37.    
  38.   clarke_parameter.As = _IQsinPU(time_cnt); 
  39.   clarke_parameter.Bs = _IQsinPU(time_cnt-0x5555); 
  40.    
  41.   if(clarke_parameter.As > 32767){ 
  42.    clarke_parameter.As = 32767; 
  43.   } 
  44.   if(clarke_parameter.As < -32768){ 
  45.    clarke_parameter.As = -32768; 
  46.   } 
  47.    
  48.   if(clarke_parameter.Bs > 32767){ 
  49.    clarke_parameter.Bs = 32767; 
  50.   } 
  51.   if(clarke_parameter.Bs < -32768){ 
  52.    clarke_parameter.Bs = -32768; 
  53.   } 
  54.    
  55.   clarke_calc(&clarke_parameter); 
  56.    
  57.   park_parameter.Alpha = clarke_parameter.Alpha; 
  58.   park_parameter.Beta = clarke_parameter.Beta; 
  59.    
  60.   park_parameter.Sin = trig_functions(time_cnt).hsin; 
  61.   park_parameter.Cos = trig_functions(time_cnt).hcos; 
  62.   park_parameter.Angle = -time_cnt; 
  63.   park_calc(&park_parameter); 
  64.    
  65.   svpwm.Ualpha = clarke_parameter.Alpha; 
  66.   svpwm.Ubeta = clarke_parameter.Beta; 
  67.    
  68.   svpwm_calc(&svpwm); 
  69.    
  70.   #define FOC_DEBUG  SVPWM_REG 
  71. #if (FOC_DEBUG == CLEAK) 
  72.   user_data[0] = clarke_parameter.As
  73.   user_data[1] = clarke_parameter.Bs; 
  74.   user_data[2] = clarke_parameter.Alpha; 
  75.   user_data[3] = clarke_parameter.Beta;   
  76. #elif (FOC_DEBUG == PARK) 
  77.   user_data[0] = clarke_parameter.As
  78.   user_data[1] = clarke_parameter.Bs; 
  79.   user_data[2] = park_parameter.Ds; 
  80.   user_data[3] = park_parameter.Qs; 
  81. #elif (FOC_DEBUG == SVPWM)  
  82.   user_data[0] = (uint16_t)svpwm.Ta; 
  83.   user_data[1] = (uint16_t)svpwm.Tb; 
  84.   user_data[2] = (uint16_t)svpwm.Tc; 
  85.   user_data[3] = svpwm.VecSector*5000; 
  86. #elif (FOC_DEBUG == SVPWM_REG) 
  87.    
  88.   //换算的CCRx寄存器的值 
  89.   sv_regs_mod_t sv_regs = svpwm_get_regs_mod(7200,&svpwm); 
  90.    
  91.   user_data[0] = sv_regs.ccr1; 
  92.   user_data[1] = sv_regs.ccr2; 
  93.   user_data[2] = sv_regs.ccr3; 
  94.   user_data[3] = svpwm.VecSector*1000; 
  95. #endif 
  96.   SDS_OutPut_Data_INT(user_data); 
  97.  } 
  98.  return 0; 

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

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

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

开关状态

附件

 

 

责任编辑:武晓燕 来源: 小麦大叔
相关推荐

2020-08-14 07:25:51

设计模式

2020-02-25 09:43:13

区块链blockchain疫情

2015-02-28 14:05:08

FDD-LTETD-LTE

2017-05-29 21:46:06

数博会马化腾惊喜

2023-12-14 17:31:10

SQL表格模型功能

2023-01-09 07:50:29

开源开发者项目

2021-12-14 15:30:02

数字化企业转型运营商转型

2011-06-15 11:03:54

Linux内核Xen

2011-03-03 15:51:54

2020-12-14 09:33:56

大数据IT技术

2015-08-17 09:43:12

编程创造程序员

2009-11-24 09:09:05

Chrome OS发布

2012-05-24 15:53:57

猎豹浏览器

2018-10-19 16:35:20

运维

2020-01-18 11:13:08

CPU程序存储

2013-07-01 13:25:43

SDN控制器软件控制网络SDN

2020-11-18 07:47:09

ElasticSear Lucene搜索服务器

2012-04-30 20:54:01

Android

2017-03-30 09:34:17

开发文档功能

2013-05-20 16:30:37

移动应用App推广
点赞
收藏

51CTO技术栈公众号