HAL STM32F1 通過查表方式實現SVPWM驅動無刷電機測試

HAL STM32F1 通過查表方式實現SVPWM驅動無刷電機測試


  • 📍相關篇《基于開源項目HAL STM32F4 +DSP庫跑SVPWM開環速度測試》
  • ?針對STM32F1系列,沒有專門的可依賴的DSP庫,為了實現特定函數的浮點運算快速計算,通過查表方式來實現,以空間換速度的方式。
  • 📍硬件電路和項目參考,立創開源廣場:https://oshwhub.com/shadow27/tai-yang-neng-wu-ren-chuan
  • 📌 采用6路驅動控制,可以參考個人的相關篇《自制無感無刷電機驅動板》

📘實現核心代碼

  • 📑svpwm.c
#include "tim.h"#include "svpwm.h"#include "stdio.h"#define PWM_Period 4800float voltage_power_supply=12; //母線電壓12V
float sensor_offset=0;
float zero_electric_angle=0;float _normalizeAngle(float angle)// 標準化角度 [0,2PI]
{float a = fmod(angle, _2PI);                     //fmod()對浮點數取模return a >= 0 ? a : (a + _2PI);
}
//把0~Π/2的正弦值分成200份
const int sine_array[200] = {0,79,158,237,316,395,473,552,631,710,789,867,946,1024,1103,1181,1260,1338,1416,1494,1572,1650,1728,1806,1883,1961,2038,2115,2192,2269,2346,2423,2499,2575,2652,2728,2804,2879,2955,3030,3105,3180,3255,3329,3404,3478,3552,3625,3699,3772,3845,3918,3990,4063,4135,4206,4278,4349,4420,4491,4561,4631,4701,4770,4840,4909,4977,5046,5113,5181,5249,5316,5382,5449,5515,5580,5646,5711,5775,5839,5903,5967,6030,6093,6155,6217,6279,6340,6401,6461,6521,6581,6640,6699,6758,6815,6873,6930,6987,7043,7099,7154,7209,7264,7318,7371,7424,7477,7529,7581,7632,7683,7733,7783,7832,7881,7930,7977,8025,8072,8118,8164,8209,8254,8298,8342,8385,8428,8470,8512,8553,8594,8634,8673,8712,8751,8789,8826,8863,8899,8935,8970,9005,9039,9072,9105,9138,9169,9201,9231,9261,9291,9320,9348,9376,9403,9429,9455,9481,9506,9530,9554,9577,9599,9621,9642,9663,9683,9702,9721,9739,9757,9774,9790,9806,9821,9836,9850,9863,9876,9888,9899,9910,9920,9930,9939,9947,9955,9962,9969,9975,9980,9985,9989,9992,9995,9997,9999,10000,10000};//0~360°的正弦值,函數通過使用固定大小的數組來逼近正弦計算
float _sin(float a){//a的值最大為2Π,即6.28318530718if(a < _PI_2){//a<1.57079632679//return sine_array[(int)(199.0*( a / (_PI/2.0)))];//return sine_array[(int)(126.6873* a)];           // 浮點數組優化return 0.0001*sine_array[_round(126.6873* a)];      // int數組優化}else if(a < _PI){//1.57079632679<=a<3.14159265359// return sine_array[(int)(199.0*(1.0 - (a-_PI/2.0) / (_PI/2.0)))];//return sine_array[398 - (int)(126.6873*a)];          // float array optimizedreturn 0.0001*sine_array[398 - _round(126.6873*a)];     // int array optimized}else if(a < _3PI_2){//3.14159265359<=a<4.71238898038// return -sine_array[(int)(199.0*((a - _PI) / (_PI/2.0)))];//return -sine_array[-398 + (int)(126.6873*a)];           // float array optimizedreturn -0.0001*sine_array[-398 + _round(126.6873*a)];      // int array optimized} else {//4.71238898038<=a<6.28318530718// return -sine_array[(int)(199.0*(1.0 - (a - 3*_PI/2) / (_PI/2.0)))];//return -sine_array[796 - (int)(126.6873*a)];           // float array optimizedreturn -0.0001*sine_array[796 - _round(126.6873*a)];      // int array optimized}
}//0~360°的余弦值,函數逼近余弦計算使用固定大小的數組
float _cos(float a){float a_sin = a + _PI_2;a_sin = a_sin > _2PI ? a_sin - _2PI : a_sin;return _sin(a_sin);
}//近似開根號函數
float _sqrtApprox(float number) {//low in fatlong i;float y;// float x;// const float f = 1.5F; // better precision// x = number * 0.5F;y = number;i = * ( long * ) &y;i = 0x5f375a86 - ( i >> 1 );y = * ( float * ) &i;// y = y * ( f - ( x * y * y ) ); // better precisionreturn number * y;
}// 輸入參數0.0f ~ 1.0f,輸出3路PWM
//void Set_PWM(float _CCR1, float _CCR2, float _CCR3)
//{
//	__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, _CCR1 * PWM_ARR);
//	__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, _CCR2 * PWM_ARR);
//	__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, _CCR3 * PWM_ARR);
//}//FOC核心函數:輸入Ud、Uq和電角度,輸出PWM
void setPhaseVoltage(float Uq, float Ud, float angle_el)
{float Uref;uint32_t sector;float T0,T1,T2;float Ta,Tb,Tc;float U_alpha,U_beta;angle_el =_normalizeAngle(angle_el); //電角度標準化在【0,2pi】U_alpha=Ud*_cos(angle_el)-Uq*_sin(angle_el); //反park變換U_beta=Ud*_sin(angle_el)+Uq*_cos(angle_el);Uref=_sqrtApprox(U_alpha*U_alpha + U_beta*U_beta) / voltage_power_supply;if(Uref> 0.577)Uref= 0.577; //六邊形的內切圓(SVPWM最大不失真旋轉電壓矢量賦值)根號3/3if(Uref<-0.577)Uref=-0.577;if(Uq>0)angle_el =_normalizeAngle(angle_el+_PI_2); //加90度后是參考電壓矢量的位置elseangle_el =_normalizeAngle(angle_el-_PI_2);sector = (angle_el / _PI_3) + 1; //扇區判斷//每個扇區中兩個相鄰電壓矢量Uref作用時間T1 = _SQRT3*sin(sector*_PI_3 - angle_el) * Uref;T2 = _SQRT3*sin(angle_el - (sector-1.0)*_PI_3) * Uref;//零矢量作用時間T0 = 1 - T1 - T2;switch(sector) //計算各相的作用時間{case 1:Ta = T1 + T2 + T0/2;Tb = T2 + T0/2;Tc = T0/2;break;case 2:Ta = T1 +  T0/2;Tb = T1 + T2 + T0/2;Tc = T0/2;break;case 3:Ta = T0/2;Tb = T1 + T2 + T0/2;Tc = T2 + T0/2;break;case 4:Ta = T0/2;Tb = T1+ T0/2;Tc = T1 + T2 + T0/2;break;case 5:Ta = T2 + T0/2;Tb = T0/2;Tc = T1 + T2 + T0/2;break;case 6:Ta = T1 + T2 + T0/2;Tb = T0/2;Tc = T1 + T0/2;break;default:  //其他情況關閉上管,打開下管,即剎車Ta = 0;Tb = 0;Tc = 0;}//printf("[Ta,Tb,Tc]:%f,%f,%f\r\n", Ta, Tb, Tc);__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, Ta*PWM_Period); //輸出U相PWM,配置占空比__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2,Tb*PWM_Period);   //輸出V相PWM,配置占空比__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, Tc*PWM_Period);  //輸出W相PWM,配置占空比}
  • 📄svpwm.h
#ifndef __SVPWM_H__
#define __SVPWM_H__#include <math.h>#define _sign(a) ( ( (a) < 0 )  ?  -1   : ( (a) > 0 ) )
#define _round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
#define _constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
#define _sqrt(a) (_sqrtApprox(a))
#define _isset(a) ( (a) != (NOT_SET) )#define _2_SQRT3 1.15470053838
#define _SQRT3 1.73205080757
#define _1_SQRT3 0.57735026919
#define _SQRT3_2 0.86602540378
#define _SQRT2 1.41421356237
#define _120_D2R 2.09439510239
#define _PI 3.14159265359
#define _PI_2 1.57079632679
#define _PI_3 1.0471975512
#define _2PI 6.28318530718
#define _3PI_2 4.71238898038
#define _PI_6 0.52359877559//FOC核心函數:輸入Ud、Uq和電角度,輸出PWM
void setPhaseVoltage(float Uq, float Ud, float angle_el);#endif /* __SVPWM_H__ */
  • 🌿在滴答回調函數中,每隔2毫秒執行一次
void HAL_SYSTICK_Callback(void)
{//  Sys_Tick_Count_1ms();Count++;if (Count >= vtaskms){Count = 0;//Uq和電角度增加值需要自己調,每個電機都不一樣setPhaseVoltage(0.5,0.0,angle_el);  //空載的時候盡量讓uq<2。Uq越大電機的電流越大,扭力約大angle_el +=0.64;  //估計電角度,電角度增加的越快,電機轉的越快。電角度減小則電機反向旋轉0.18 0.36 0.54 0.62}
}

🎉在電機能轉動的情況下,可以逐步增大電角度(angle_el)數值,以提高轉動的速度。在電機能提速的情況下,電流相對會減少。這個速度也不是不限增加的,當程序設定的角度電機執行完,正好與下一次循環設定的角度接近重合時,達到最佳的運轉效果。

個人使用2204電機測試,在電角度參數和電機運轉步進接近的狀態下,空載下運轉,電流只有60毫安左右,長時間運轉,電機都沒有感受發熱。

  • 🌿3路PWM驅動波形及參數
    在這里插入圖片描述

  • 🌿三相驅動橋,下端電流采樣波形
    在這里插入圖片描述

📚測試工程

  • 🌿基于3路PWM控制。(EG2133)
    在這里插入圖片描述
鏈接:https://pan.baidu.com/s/1H_5o-4v7Z8x4XBi8RtVU1A?pwd=rcv6 
提取碼:rcv6
  • 🌿基于3路互補PWM輸出控制。
    在這里插入圖片描述
鏈接:https://pan.baidu.com/s/13mFTlaAbvnjr1eh-rdLQSQ?pwd=2fr7 
提取碼:2fr7

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24502.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

番外篇 | 利用華為2023最新Gold-YOLO中的Gatherand-Distribute對特征融合模塊進行改進

前言:Hello大家好,我是小哥談。論文提出一種改進的信息融合機制Gather-and-Distribute (GD) ,通過全局融合多層特征并將全局信息注入高層,以提高YOLO系列模型的信息融合能力和檢測性能。通過引入MAE-style預訓練方法,進一步提高模型的準確性。?? 目錄 ??1.論文解…

如何解鎖植物大戰僵尸雜交版v2.0.88所有植物

如何解鎖植物大戰僵尸雜交版v2.0.88所有植物 前言安裝相關軟件快速解鎖方法 前言 經過探索植物大戰僵尸雜交版植物解鎖和關卡有關&#xff0c;所以通過所有關卡就可以解鎖所有植物。 安裝相關軟件 1.安裝植物大戰僵尸 2.安裝Hex Editor Neo 快速解鎖方法 本文參考如何修改…

<vs2022><問題記錄>visual studio 2022使用console打印輸出時,輸出窗口不顯示內容

前言 本文為問題記錄。 問題概述 在使用visual studio 2022編寫代碼時&#xff0c;如C#&#xff0c;在代碼中使用console.writeline來打印某些內容&#xff0c;以便于觀察&#xff0c;但發現輸出窗口不顯示&#xff0c;而代碼是完全沒有問題的。 解決辦法 根據網上提供的辦法…

深入解析力扣183題:從不訂購的客戶(LEFT JOIN與子查詢方法詳解)

在本篇文章中&#xff0c;我們將詳細解讀力扣第183題“從不訂購的客戶”。通過學習本篇文章&#xff0c;讀者將掌握如何使用SQL語句來解決這一問題&#xff0c;并了解相關的復雜度分析和模擬面試問答。每種方法都將配以詳細的解釋&#xff0c;以便于理解。 問題描述 力扣第18…

Java Web學習筆記23——Vue項目簡介

Vue項目簡介&#xff1a; Vue項目-創建&#xff1a; 命令行&#xff1a;vue create vue-project01 圖形化界面&#xff1a;vue ui 在命令行中切換到項目文件夾中&#xff0c;然后執行vue ui命令。 只需要路由功能。這個路由功能&#xff0c;開始不是很理解。 創建項目部保存…

html+css示例

HTML HTML&#xff08;超文本標記語言&#xff09;和CSS&#xff08;層疊樣式表&#xff09;是構建和設計網頁的兩種主要技術。HTML用于創建網頁的結構和內容&#xff0c;而CSS用于控制其外觀和布局。 HTML基礎 HTML使用標簽來標記網頁中的不同部分。每個標簽通常有一個開始…

【原創】海為PLC與RS-WS-ETH-6傳感器的MUDBUS_TCP通訊

點擊“藍字”關注我們吧 一、關于RS-WS-ETH-6傳感器的準備工作 要完成MODBUS_TCP通訊,我們必須要知道設備的IP地址如何分配,只有PLC和設備的IP在同一網段上,才能建立通訊。然后還要選擇TCP的工作模式,來建立設備端和PC端的端口號。接下來了解設備的報文格式,方便之后發送…

前端:快捷 復制chrome 控制臺打印出來的 數組對象

程序中console.log出來的對象。按照以下步驟操作 1.右鍵點擊需要處理的對象&#xff0c;會出現Store as global variable&#xff0c;點擊 2.點擊 Store as global variable 控制臺會出現 3.在控制臺 輸入 copy(temp1) 這樣對象就復制到了你的黏貼面板里面 在代碼中直接 c…

基于STM32開發的智能語音控制系統

目錄 引言環境準備智能語音控制系統基礎代碼實現&#xff1a;實現智能語音控制系統 4.1 語音識別模塊數據讀取4.2 設備控制4.3 實時數據監控與處理4.4 用戶界面與反饋顯示應用場景&#xff1a;語音控制的家居設備管理問題解決方案與優化收尾與總結 1. 引言 隨著人工智能技術…

Vuepress 2從0-1保姆級進階教程——標準化流程

Vuepress 2 專欄目錄 1. 入門階段 Vuepress 2從0-1保姆級入門教程——環境配置篇Vuepress 2從0-1保姆級入門教程——安裝流程篇Vuepress 2從0-1保姆級入門教程——文檔配置篇Vuepress 2從0-1保姆級入門教程——范例與部署 2.進階階段 Vuepress 2從0-1保姆級進階教程——全文搜索…

Inpaint9.1軟件下載附加詳細安裝教程

軟件簡介: Inpaint 是個人開發者Max開發的圖片處理軟件&#xff0c;可以高效去除水印&#xff0c;修復照片等。使用方法和操作都很簡單&#xff0c;非常適合不會PS等軟件的小白用戶。 安 裝 包 獲 取 地 址&#xff1a; Iinpaint win版&#xff1a;??https://souurl.cn/b…

了解JVM中的Server和Client參數

了解JVM中的Server和Client參數 Java虛擬機&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;作為Java程序運行的核心&#xff0c;提供了多種參數來優化和調整程序的性能和行為。其中&#xff0c;-server和-client是兩個重要的參數&#xff0c;分別用于配置JVM在服…

【Android面試八股文】synochnized修飾普通方法和靜態方法的區別?什么是原子性、可見性、有序性?

文章目錄 synochnized修飾普通方法和靜態方法的區別?什么是原子性、可見性、有序性?這道題想考察什么 ?考察的知識點考生應該如何回答synchronized 的基本原理synchronized 修飾普通方法和靜態方法的區別synchronized定義同步代碼塊synochnized修飾普通方法和靜態方法的區別…

微生物共生與致病性:動態變化與識別挑戰

谷禾健康 細菌耐藥性 抗生素耐藥性細菌感染的發生率正在上升&#xff0c;而新抗生素的開發由于種種原因在制藥行業受重視程度下降。 最新在《柳葉刀-微生物》&#xff08;The Lancet Microbe&#xff09;上&#xff0c;科學家提出了基于細菌適應性、競爭和傳播的生態原則的跨學…

Tongweb7重置密碼優化版*(by lqw )

如圖所示&#xff0c;輸入初始密碼是會報錯的&#xff0c;說明已經修改了密碼 首先我們先備份一下tongweb的安裝目錄&#xff0c;避免因為修改過程中出現的差錯而導致tongweb無法啟動&#xff1a; 備份好了之后&#xff0c;我們關閉掉tongweb。 方式一&#xff1a; Cd 到tong…

C# WPF入門學習主線篇(十)—— DataGrid常見屬性和事件

C# WPF入門學習主線篇&#xff08;十&#xff09;—— DataGrid常見屬性和事件 歡迎來到C# WPF入門學習系列的第十篇。在前面的文章中&#xff0c;我們已經學習了 Button、TextBox、Label、ListBox 和 ComboBox 控件。今天&#xff0c;我們將探討 WPF 中的另一個重要控件——D…

Python私教張大鵬 Vue3整合AntDesignVue之Anchor 錨點

用于跳轉到頁面指定位置。 何時使用 需要展現當前頁面上可供跳轉的錨點鏈接&#xff0c;以及快速在錨點之間跳轉。 案例&#xff1a;錨點的基本使用 核心代碼&#xff1a; <template><a-anchor:items"[{key: part-1,href: #part-1,title: () > h(span, {…

大學國學搜題軟件?分享7個軟件和公眾號,來對比看看吧 #經驗分享#微信#媒體

在大學里&#xff0c;高效的學習工具可以幫助我們更好地管理時間和資源&#xff0c;提高學習效果。 1.彩虹搜題 這是個老公眾號了 多語言查詢支持&#xff0c;滿足國際用戶需求。全球通用&#xff0c;無障礙搜題。 下方附上一些測試的試題及答案 1、某酸堿指示劑的&#xf…

Web前端推送功能:深入剖析與應用實踐

Web前端推送功能&#xff1a;深入剖析與應用實踐 在信息化社會的今天&#xff0c;Web前端推送功能作為實時通信和個性化服務的重要手段&#xff0c;受到了廣泛的關注和應用。本文將從四個方面、五個方面、六個方面和七個方面&#xff0c;深入探討Web前端推送功能的原理、應用、…

uniapp自定義的下面導航

uniapp自定義的下面導航 看看效果圖片吧 文章目錄 uniapp自定義的下面導航 看看效果圖片吧 ![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/6aa0e964741d4dd3a58f4e86c4bf3247.png) 前言一、寫組件、我這里就沒有寫組件了直接寫了一個頁面&#xff1f;總結 前言 在…