日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
對不起!這篇Svpwm來晚了!

本文轉(zhuǎn)載自微信公眾號「小麥大叔」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系小麥大叔公眾號。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),縉云企業(yè)網(wǎng)站建設(shè),縉云品牌網(wǎng)站建設(shè),網(wǎng)站定制,縉云網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,縉云網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

SVPWM

SVPWM是空間矢量脈寬調(diào)制(Space Vector Pulse Width Modulation)的簡稱,通常由三相逆變器的六個功率開關(guān)管組成,經(jīng)過特定的時序和換相所所產(chǎn)生的脈沖寬度調(diào)制波,最終輸出的波形可能會十分接近理想的正弦波形。具體如下圖所示;左側(cè)為復(fù)平面,即空間矢量,右側(cè)為時域的正弦波形;

關(guān)于SVPWM原理的文章非常多,這里可以推薦一下網(wǎng)上一個非常不錯的教程《SVPWM的原理及法則推導(dǎo)和控制算法詳解第五修改版》,本文將如何實現(xiàn)SVPWM進行簡單的介紹。

IQMATH

TI的片子很香,控制方面,TI無疑是做的最好的方案之一,相對來說資料也非常齊全;另外TI針對沒有浮點運算器的定點DSP推出了IQMATH庫,在使用Q格式對數(shù)據(jù)進行分析和處理的過程中,十分方便,代碼也變得更加簡潔,本文將使用TI的提供的SVPWM算法基于STM32平臺實現(xiàn)SVPWM調(diào)制。

測試平臺參數(shù):硬件:stm32f103軟件:標準外設(shè)庫3.5IDE:MDK-ARM

IQmathLib

本文使用了IQMathLib的Cortex-M3版本,這樣一來,對于沒有浮點處理器的定點MCU來說,對數(shù)據(jù)統(tǒng)一進行Q格式的處理會變得更加便捷,并且高效;

首先將IQmathlib解壓可以得到如下文件,其中包含各個平臺下的靜態(tài)庫,本文使用STM32F1在keil環(huán)境下進行開發(fā),需要使用的是rvmdk-cm3。

打開一個keil工程,在菜單界面點擊如下圖所示的圖標進入project items;

添加IQmath組,并添加rvmdk-cm3路徑下的靜態(tài)庫,和頭文件;

點擊下圖所示的圖標進入工程熟悉的設(shè)置;

添加rvmdk-cm3靜態(tài)庫的路徑,和頭文件的包含路徑,如下圖所示;

最終,build整個工程即可。

測試部分程序

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

最終通過串口輸出串口圖形化軟件的Ta,Tb,Tc 如下圖所示;

關(guān)于STM32的配置,需要配置三路互補PWM波形輸出;例如配置了TIM1的CH1,CH2,CH3這三路PWM輸出,然后可以把Ta,Tb,Tc的值分別賦值給CCR1,CCR2,CCR3即可;

具體如下圖所示;左側(cè)是復(fù)平面的矢量合成動態(tài)圖;右側(cè)是三路PWM輸出通道的比較狀態(tài);

開關(guān)狀態(tài)

附件


網(wǎng)站欄目:對不起!這篇Svpwm來晚了!
鏈接URL:http://www.5511xx.com/article/dphosdo.html