旋鈕鍵盤項目---foc講解(閉環位置控制)

hello,周六休息了一天,出去打本了。趁著夜色,花費了幾個小時,也是將閉環代碼寫完,參考了燈哥的思路。接下來介紹一下我的整個流程:

一、閉環位置控制思路:

其實懂得了開環,那么閉環其實很簡單了。我們可以看函數

void setPhaseVoltage(float Uq,float Ud, float angle_el) {angle_el = _normalizeAngle(angle_el);// 帕克逆變換Ualpha =  -Uq*sin(angle_el); Ubeta =   Uq*cos(angle_el); // 克拉克逆變換Ua = Ualpha + voltage_power_supply/2;Ub = (sqrt(3)*Ubeta-Ualpha)/2 + voltage_power_supply/2;Uc = (-Ualpha-sqrt(3)*Ubeta)/2 + voltage_power_supply/2;setPwm(Ua,Ub,Uc);
}

????????這個函數的三個參數,首先第一個其實就是力矩大小。第二個我們默認是0,是磁場分量(理論上保持 0,才能保證最大力矩輸出效率)。第三個就是angle_el → 電角度(決定定子磁場的方向,等于是你要把轉子“拉”到哪個位置)

? ? ? ? 那么在我們開環的過程中時候,是給了一個恒定的力。角度也是我們計算 一個規定的角度,其實也差不多就是恒定的角度。那么很簡單,套到閉環的時候,就是這個力,我們需要自己去根據角度來計算。同時,這個電角度也需要實時去計算。然后帶入進去。

接下來給出我的代碼:

CloseLoop.c

#include "CloseLoop.h"float Motor_target = 3.14;
int DIR= 1;
float Cur_Uq = 0.0;
float zero_electric_angle=0;
#define _3PI_2 4.71238898038ffloat _electricalAnglew_without_para(){return  _normalizeAngle((float)(DIR *  7) * GetAngle_Without_Track()-zero_electric_angle);
}//開始校準電角度的值
void zero_electric_angle_correct()
{setPhaseVoltage(6,0,_3PI_2);HAL_Delay(3000);zero_electric_angle = _electricalAnglew_without_para();setPhaseVoltage(0,0,_3PI_2);
}float kp = 0.133;
float sensor_Angle;
void closeLoop()
{//0-6.28sensor_Angle =GetAngle();/*這里是這樣計算的,當前我接入的是24v電壓,需要將12v設定為0電壓位置。所以我實際最大為12v。這里我規定,45度偏差的時候,達到最大允許的偏差角度,這個時候輸出最大的糾正力矩,來控制它回正。所以對應關系就是 當前角度偏差/最大允許的45度角度偏差  =   當前輸出電壓/最大允許輸出電壓12v。這樣子就一下子知道對應的關系了,我們需要的是根據當前角度偏差,輸出當前應該給定的電壓所以就是12/45 = 0.266*///把獲取的弧度制,轉化為角度制。角度得到后,通過kp這個比例,轉化到電壓值。Cur_Uq = _constrain(kp*(Motor_target-DIR*sensor_Angle)*180/PI,-6,6);setPhaseVoltage(Cur_Uq,  0, _electricalAnglew_without_para());}

ClsoeLoop.h

#ifndef __CLOSELOOP_H
#define __CLOSELOOP_H
#include "OpenLoop.h"
#include "AS5600.h"
#include "math.h"
float _electricalAnglew_without_para();void zero_electric_angle_correct();
void closeLoop();
#endif

????????這里也說了,這里的kp計算,其實是就是將當前的角度,轉化為力矩。

????????當前我接入的是12v電壓,需要將6v設定為0電壓位置。所以我實際最大為6v。這里我規定,45度偏差的時候,達到最大允許的偏差角度,這個時候輸出最大的糾正力矩,來控制它回正。所以對應關系就是 當前角度偏差/最大允許的45度角度偏差 ?= ? 當前輸出電壓/最大允許輸出電壓6v。這樣子就一下子知道對應的關系了,我們需要的是根據當前角度偏差,輸出當前應該給定的電壓所以就是6/45 = 0.133。

????????里邊寫的是24v,我輸入的也是24v,但是我只用12v的幅值。當然你也可以按照這個來改。但是會出現一變化過快,畢竟電壓大了,力矩變大,加速度就大,速度就大。

為什么會有DIR

DIR 的存在是因為:

  • 編碼器測的機械角度方向 ≠ 電機實際需要的方向

  • 通過 DIR=±1 可以快速修正這個“方向不一致”的問題

  • 如果方向對了,DIR=+1;如果電機老是“往反方向跑”,改成 DIR=-1 就行了

為什么要做電角度零點標定

也就是函數:void zero_electric_angle_correct()

1. 電角度 vs 機械角度

  • 機械角度:編碼器(AS5600、霍爾等)測得的是轉子物理位置 0~2π。

  • 電角度:FOC 控制需要的角度是定子電流和轉子磁極之間的相對角度:

  • 這個 offset(偏移量)就是電角度零點。因為轉子磁極和編碼器零點未必對齊。

如果不知道這個偏移,FOC 算出來的電角度就會有一個常數錯誤,結果就是:
電流打不到正確的磁場方向,電機就發抖、狂轉或者根本轉不動。

2. 標定思路

  • 給一個固定的定子磁場方向_3PI_2),電機轉子會被吸住,停在這個方向。

  • 保持一段時間(3s),讓轉子完全對齊,不再晃動。

  • 讀取編碼器角度,這個角度就是轉子在“已知磁場方向”下的位置。

  • 保存為 zero offset,以后電角度計算時減去它,就能保證坐標系對齊。

3.為什么電機必須初始化時做?

  • 如果不做,電角度和機械角度坐標系不同步,FOC 算出來的電壓會打偏 → 電機亂抖或直接燒 MOS。

  • 做一次標定后,系統就知道“編碼器零點” 和 “定子 d 軸” 的對應關系,后續計算電角度時才正確。

現象解決

在調試過程中,我遇到了一些現象。

一、首先是轉速過快,一直慢速跑,沒有說到達目標地方就停下來了。我們進行調試,發現Uq一直是最大的允許電壓值。

那么這種主要是兩方面:

1:看看有沒有正常讀取到角度值,我發現這個排線比較松,調試過程中,觀測發現,角度值有的時候沒有。導致差距一直存在,就一直最大速度轉動。

2、看看DIR是不是反了,可能你需要設定的是-1.即反方向過來。

二、出現抖動,你轉動它到哪個位置,他就在哪個位置。那么這個也可能是DIR設定反了。這時候要立刻關閉電源,以免溫度過高,燒了。

效果展示

智能旋鈕(二)—foc閉環位置控制

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

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

相關文章

為什么有些相機“即插即用”,而有些則需要采集卡?

在工業生產中,工業相機是“眼睛”,它幫助我們看到世界,但你知道嗎?不同的工業相機接口就像不同的“通道”,有些“通道”直接就能與計算機連接,而有些則需要一個額外的小配件——圖像采集卡。那么&#xff0…

【計算機網絡 | 第7篇】物理層基本概念

文章目錄物理層基本概念及數據通信系統解析一、物理層的核心定位🥝二、物理層的功能🧾三、數據通信系統的模型🐦?🔥(一)源系統(二)傳輸系統(三)目的系統四、…

一般情況下,python函數都會返回對象,但有時只調用一個函數,這是在修改這個信息

class Model:def __init__(self):self.training Truedef eval(self):self.training Falsereturn Nonem Model() print(m.training) # True m.eval() # 返回 None print(m.training) # False,模型內部狀態已改變m.eval()是在修改m的…

2025-08-17 李沐深度學習17——語義分割

文章目錄1 語義分割1.1 介紹1.2 語義分割應用1.3 實例分割2 轉置卷積2.1 工作原理2.2 為什么叫“轉置”卷積2.3 轉置卷積也是一種卷積3 FCN3.1 核心思想3.2 網絡架構4 樣式遷移4.1 基于 CNN 的樣式遷移4.2 工作流程1 語義分割 1.1 介紹 語義分割(Semantic Segment…

《若依》權限控制

若依內置了強大的權限控制系統,為企業級項目提供了通用的解決方案 以CRM系統為例,演示權限功能(URL:https://huike-crm.itheima.net) demo賬號(超級管理員)查看所有功能菜單 zhangsan賬號(市…

云原生俱樂部-RH134知識點總結(3)

這個系列的第二篇寫了將近5000字,而且還是刪節內容后的,如RAID就沒寫,因為頭已經很大了。第二篇從早上寫到下午,因為偷懶了,寫著寫著就停筆了。不過好在總算磨完了,現在開始寫RH134系列的最后一篇內容。我這…

股票常見K線

1.底部反彈摸線特點長下影線之后必須有實體陰線踩實之后才考慮。macd綠緩慢收窄過程中的不買,剛轉紅也不買。macd轉紅之后等股價跌回之前macd綠首次收窄的最低點附近,而且跌破了所有均線,可以買入此股票。之后股票一波突破之前平臺震蕩平臺&a…

計算機網絡 THU 考研專欄簡介

本專欄專為清華大學計算機網絡考研復習設計,內容系統全面,涵蓋從基礎概念到重點考點的完整知識體系。具體包括:基礎理論:計算機網絡概念、分類、性能指標及網絡分層模型(OSI 七層、TCP/IP 四層)。協議與技術…

VSCode打開新的文件夾之后當前打開的文件夾被覆蓋

文件--首選項--設置:搜索showtabs設置為如下:

mac 電腦安裝類似 nvm 的工具,node 版本管理工具

前言 蘋果電腦開發時,有時候需要切換node 版本,window版有nvm可以管理node 版本,mac版本可以用另外一種 //全局安裝n 模塊 sudo npm install n -g//輸入后回車,提示輸入電腦密碼,輸入完密碼回車等待下載完成即可//安裝…

spdlog框架的安裝與使用

spdlog框架的安裝與使用spdlog的安裝spdlog的使用spdlog二次封裝總結&#xff1a;spdlog的安裝 sudo apt-get install libspdlog-devspdlog的使用 同步日志器sync.cc (輸出到顯示器/輸出到指定文件) #include<spdlog/spdlog.h> #include<spdlog/sinks/stdout_color…

使用websockets中的一些問題和解決方法

&#xff08;1&#xff09;TypeError: echo() missing 1 required positional argument: path報錯自己寫的代碼如下&#xff1a;async def echo(websocket, path):...async def main():server await websockets.serve(echo, "0.0.0.0", 666)await server.wait_close…

機器人相關基礎知識

機器人簡介下面給出一份機器人方向“從入門到進階”的極簡知識地圖&#xff0c;按「數學 → 硬件 → 軟件 → 算法 → 應用」五層展開&#xff0c;配合常用開源資源。你可以把它當作“字典”隨時查閱。&#x1f539; 1. 數學層&#xff08;所有算法的地基&#xff09;概念一句話…

Windows Server 打開vGPU RDP HEVC編碼

查看已安裝的驅動[rootlocalhost:~] esxcli software vib list Name Version Vendor Acceptance Level Install Date Platforms ----------------------------- ------------------------------------ ------ -…

OpenAL技術詳解:跨平臺3D音頻API的設計與實踐

引言&#xff1a;OpenAL的定位與價值 OpenAL&#xff08;Open Audio Library&#xff09; 是一套跨平臺的3D音頻應用程序接口&#xff08;API&#xff09;&#xff0c;專為高效渲染多通道三維定位音頻而設計。其API風格與編程范式刻意模仿OpenGL&#xff0c;旨在為游戲開發、虛…

重溫 K8s 基礎概念知識系列五(存儲、配置、安全和策略)

文章目錄一、存儲&#xff08;Storage&#xff09;1.1、Volume1.2、PersistentVolume (PV)1.3、PersistentVolumeClaim (PVC)1.4、StorageClass1.5、PVC 和 PV 的綁定過程&#xff1f;二、配置管理&#xff08;Configuration&#xff09;2.1、ConfigMap2.2、Secret2.3、存活、就…

通過PhotoShop將多張圖片整合為gif動畫

一、準備圖片集合二、導入PS導入PS后點擊確定&#xff1a;導入成功&#xff1a;三、添加時間軸勾選創建幀動畫&#xff1a;此時時間軸進化為幀動畫軸&#xff1a;四、圖片集部署在幀動畫軸點擊幀動畫軸右上角的三道橫杠&#xff0c;從圖層建立幀&#xff1a;此時圖片集已經部署…

Easy Rules 規則引擎詳解

Easy Rules 規則引擎詳解 Easy Rules 是一個輕量級的 Java 規則引擎&#xff0c;它提供了一種簡單而強大的方式來定義和執行業務規則。以下是 Easy Rules 的詳細介紹&#xff1a; 1. 核心概念 1.1 規則 (Rule) 條件 (Condition): 當條件為 true 時執行動作動作 (Action): 條件滿…

優雅設計:打造AI時代的高效后端API接口——領碼課堂深度解析

&#x1f4cc; 摘要 后端API接口已經成為軟件架構的神經系統。微服務演化、AI滲透、自動化治理……這些趨勢迫使我們重新定義接口設計的標準。本文從統一規范、參數校驗、異常處理、性能優化四大維度出發&#xff0c;結合領碼Spark的接口治理平臺與AI賦能實踐&#xff0c;構建一…

【VUE】用EmailJS自動發送郵件到網易郵箱

1.注冊 EmailJS 賬號??&#xff1a;訪問 EmailJS 官網并注冊2.添加電子郵件服務??&#xff1a;在 Dashboard 中點擊 "Add New Service"選擇 SMTP server填寫 SMTP 服務器信息SMTP Host: smtphz.qiye.163.com (網易企業郵箱)SMTP Port: 994 (SSL)User: 你的郵箱Ap…