【嵌入式電機控制#26】BLDC:三相模擬采集

? ? ? ? 之前有些網友試著用有刷的平均電流法采集三相,還搞了個閉環控制。求!結果直接把驅動板給干沒了......

? ? ? ? 做過仿真的朋友們都知道,無刷電機的相電流波形是介于方波和正弦波的。如果拿平均電流去測量,很不靠譜。

? ? ? ? 這節內容為大家分享采集三相模擬量的通用配置思路。

? ? ? ? 一、CubeMX的ADC初始化

? ? ? ? 使能三個ADC通道,分別傳輸UVW線電流(Y型下等于相電流)

????????????????

????????四分頻表示APB2總線/4,也就是說ADC頻率為72Mhz/4 = 18Mhz 這是我們F1下ADC的基礎頻率。若用F407系列請自行計算。

????????12倍原始采樣率、右對齊、掃描轉換模式開、EOC選擇順序轉換、連續轉換模式開、DMA連續請求開、常規采樣開、

????????cycle轉換通道量為2.5/3(因型號不同),我這里設置的是2.5cycles,表示2.5個ADC基礎周期采集一次rank1,由此我們可推算出各個通道的采樣頻率

????????接著設置所有rank對應的通道(1,2,3)、采樣周期為3個循環? ? ?

????????(ARM架構上絕大部分三相采集都如此配置,可以記住,原因比較難解釋)

? ? ? ? ? ?接著配置DMA, 雖然最終數據寄存器float是32位,但是我們用的是12位采樣,DMA寄存器是uint16_t的,一次讀兩個字節剛合適,不要把概念搞混淆了。

? ? ? ? ? ?

? ? ? ? ? 二、ADC的DMA中斷處理邏輯

uint16_t g_adc_firstave_result[3];
//一次均值結果寄存//一次均值函數
int32_t ADC_GetSampleAvgN(int16_t *Data)
{uint32_t temp[ADC_CH_NUM] = {0,0,0};     //初始化結果寄存器int i,j;         //ij計數變量for(i=0;i<ADC_COLL;i++)   //COLL為每個ADC通道的DMA容量{   //在順序DMA采集中 DMA寄存器的內容結構為 RANK1數據 RANK2數據 RANK3數據......以此類推          for(j=0;j<ADC_CH_NUM;j++)                   {    //NUM為參與順序DMA的總通道數temp[j] += ADC_ConvValueHex[j+i*ADC_CH_NUM];//temp也按rank排序,把DMA寄存器中,每個獨立通道的數據累加}}for(j=0;j<ADC_CH_NUM;j++){//對每個獨立通道的累加值求均值temp[j] /= ADC_COLL;//把中間變量值傳給最終結果Data[j] = temp[j];       }
}void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)  
{int32_t ADConv = 0 ; //停止DMA,保證數據時序完整性HAL_ADC_Stop_DMA(hadc);//進行一次濾波,并獲取數據  ADC_GetSampleAvgN((int16_t*)g_adc_firstave_result);//重新讓DMA工作HAL_ADC_Start_DMA(hadc,(uint32_t*)ADC_ConvValueHex, ADC_CH_NUM * ADC_COLL);
}

?????????三、定時器中斷處理邏輯

 if(timeTickCurrent != 0)timeTickCurrent--;else {if(Motor_State==MOTOR_ENABLE){
//當電機運行時,讀取實際的電流(相電流+偏置電流)for(uint8_t i=0; i<3; i++){adc_val_m1[i] = g_adc_firstave_result[i];   adc_amp[i] = adc_val_m1[i] - adc_amp_offset[i][ADC_AMP_OFFSET_TIMES];if(adc_amp[i] >= 0)    adc_amp_un[i] = adc_amp[i];							}
//U相電流
current[0] = ((float)(adc_amp_un[0] * VOLT_RESOLUTION)- 1650.0f)/4020.0f/SM_REST;
//V相電流
current[1] = ((float)(adc_amp_un[1] * VOLT_RESOLUTION)- 1650.0f)/4020.0f/SM_REST;
//Z相電流
current[2] = ((float)(adc_amp_un[2] * VOLT_RESOLUTION)- 1650.0f)/4020.0f/SM_REST;/*W*/Vofa_data(current[0],VOFA_CHANNEL1);
Vofa_data(current[1],VOFA_CHANNEL2);
Vofa_data(current[2],VOFA_CHANNEL3);//上傳到上位機//一節低通濾波暫時不用//						current[0] = ((float)(1-FILTER_Q_CURRENT) * LS_Speed_hz) + (FILTER_Q_CURRENT * Speed_hz) ;
//						current[1]= ((float)(1-FILTER_Q_CURRENT) * LS_Speed_hz) + (FILTER_Q_CURRENT * Speed_hz) ;
//						current[2]= ((float)(1-FILTER_Q_CURRENT) * LS_Speed_hz) + (FILTER_Q_CURRENT * Speed_hz) ;}
if(Motor_State==MOTOR_DISABLE){//當電機停止的時候uint8_t i;//三個均值變量,用于寄存UVW三相的偏置電壓uint32_t avg[3] = {0,0,0};//這里直接用了二維數組存放偏置量//結構為  通道1p1 通道1p2 通道1p3 ... 通道1pn//通道2p1 通道2p2 通道2p3 ... 通道2pn//以此類推adc_amp_offset[0][adc_amp_offset_p] = g_adc_firstave_result[0]; adc_amp_offset[1][adc_amp_offset_p] = g_adc_firstave_result[1];adc_amp_offset[2][adc_amp_offset_p] = g_adc_firstave_result[2];adc_amp_offset_p++;//若數據采集滿,進行二次均值濾波if(adc_amp_offset_p >= ADC_AMP_OFFSET_TIMES){adc_amp_offset_p = 0;}//進行均值累加   for(i = 0; i < ADC_AMP_OFFSET_TIMES; i++)              {avg[0] += adc_amp_offset[0][i];avg[1] += adc_amp_offset[1][i];avg[2] += adc_amp_offset[2][i];}//進行平均并把數據重新傳回offset最后一列,作為標準偏置for(i = 0; i < 3; i++)                             {avg[i] /= ADC_AMP_OFFSET_TIMES;adc_amp_offset[i][ADC_AMP_OFFSET_TIMES] = avg[i];  }}//我這里的偏置采集量設置的是50次,而采集一次相電流所需時間大概在1.5ms左右,所以在電機啟動前需要一個至少大于75ms的delaytimeTickCurrent = TIMECNT_CURRENT;}

????????四、相電流開環圖像

? ? ? ? 此時測量的是平均相電流圖像,與仿真時的實時圖像有所區別,一般不會有周期性的0出現,如果出現了,就得考慮以下采樣頻率是不是取的過大。

? ? ? ? 在實際工程中,最常用的是平均電流做控制。在高精度場景下,也有用實時電流做控制的,但其相應的控制器響應要求更高,經典控制算法無法達到這種需求。

? ? ? ? 其次,查看你的三相電流是不是滿足波峰交替的,如果重合成了一條線,那你的DMA配置及處理過程必然有錯誤。

????????

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

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

相關文章

ref存儲對象和reactive深度響應式遞歸地對對象的嵌套屬性進行響應式處理

ref 不會遞歸地對 對象 或 數組 中的每個屬性或元素進行深度響應式處理。如果你需要遞歸處理嵌套屬性&#xff0c;reactive 是更適合的選擇。讓我通過具體的例子來展示這一點。 例子&#xff1a;ref 存儲對象和嵌套對象 1. 使用 ref 存儲嵌套對象&#xff1a; import { createA…

小鵬汽車前端面經

前端基礎與瀏覽器機制 (Front-End Fundamentals & Browser Mechanics) 這些問題涵蓋了Web工作的基本原理&#xff0c;包括網絡、渲染和瀏覽器特性。 1. 瀏覽器渲染與性能 (Browser Rendering & Performance) URL輸入發生什么&#xff1f;(What happens when you type a…

利用DeepSeek編寫go語言按行排序程序

聽說google出品的go語言也是系統開發中常用的&#xff0c;性能到底怎么樣&#xff0c;還是老辦法&#xff0c;讓DeepSeek寫個程序跑一下&#xff0c;基于以往的經驗&#xff0c;直接讓它同時編寫有緩沖和無緩沖版本。 package mainimport ("bufio""fmt"&qu…

《解構Angular組件變化檢測:從自動到手 動的效能突破》

為何有時數據更新后視圖卻無動于衷?為何看似簡單的操作會引發連鎖式的性能損耗?要解開這些疑問,需要穿透表層的API調用,深入到框架設計的底層邏輯中去。變化檢測的核心使命,是確保視圖層能夠準確反映數據層的當前狀態。這種"數據-視圖"的同步關系,是所有前端框…

書單 | AI編程+Python+Go三大核心領域書單

這份書單聚焦AI編程、Python開發、Go語言三大核心領域&#xff0c;精選6本本月 最具前瞻性的技術圖書&#xff0c;為你構建"工具鏈業務層系統層"的全棧能力。 1、人人皆可Vibe編程&#xff1a;玩轉氛圍編程 作者&#xff1a;池志煒,薛志榮 本書圍繞Vibe編程這一AI驅…

Kali Linux 2025.2基于MITRE ATTCK框架

從徹底革新的菜單結構到新增的13款尖端工具&#xff0c;再到首次支持智能手表Wi-Fi注入&#xff0c;Kali Linux 2025.2為紅隊、藍隊以及安全研究人員提供了更高效、更直觀的工具生態。菜單結構大變革&#xff1a;基于MITRE ATT&CK框架Kali Linux 2025.2最引人注目的變化之一…

javacc實現簡單SQL解析器

文章目錄前言本章節源碼需求1&#xff1a;實現一個最簡單的select sql要求實現jj文件編譯測試需求2&#xff1a;理解Token及其他屬性說明javajj文件需求3&#xff1a;實現解析得到SQL語法樹 & 精確點位資料獲取前言 博主介紹&#xff1a;?目前全網粉絲4W&#xff0c;csdn…

Odoo OWL前端框架全面學習指南 (后端開發者視角)

核心理念&#xff1a; 將您熟悉的Odoo后端MVCORM架構思想&#xff0c;完整映射到前端OWL組件化開發中&#xff0c;讓您在熟悉的概念體系下&#xff0c;快速掌握新的技術棧。第一部分&#xff1a;核心概念映射與環境搭建內容摘要&#xff1a; 本部分旨在建立后端與前端最核心的概…

Java開發工具包,jdk,idea,VMware,rocketmq,redis,CentOS7

Java開發工具包&#xff0c;jdk&#xff0c;idea&#xff0c;VMware&#xff0c;rocketmq&#xff0c;redis&#xff0c;CentOS7 下載地址 通過網盤分享的文件&#xff1a;Java開發環境工具包 鏈接: https://pan.baidu.com/s/1eJqvPx5DYqtmXgmEtOl8-A?pwdcj1f 提取碼: cj1f –…

macOS Python 安裝

目錄 一、確認系統環境 二、安裝 &#xff08;一&#xff09;下載安裝包 &#xff08;二&#xff09;安裝過程 三、配置環境變量 四、驗證安裝 一、確認系統環境 在安裝 Python 之前&#xff0c;我們先簡單了解一下自己的 MACOS 系統。可以點擊屏幕左上角的蘋果菜單&…

MySQL 全方位解析:從基礎到高可用架構

1. 介紹 (Introduction) 1.1. 什么是 MySQL&#xff1f; MySQL 是全球最受歡迎的開源關系型數據庫管理系統 (Relational Database Management System, RDBMS)。它由瑞典的 MySQL AB 公司開發&#xff0c;現隸屬于 Oracle 公司。MySQL 將數據存儲在不同的、預先定義好結構的表中…

力扣熱題100——滑動窗口

無重復字符的最長子串步驟 1&#xff1a;初始狀態 字符串 s “abcabcbb”&#xff0c;哈希表 charSet 初始為空&#xff0c;雙指針 left 0&#xff0c;right 0。 哈希表&#xff08;charSet&#xff09;&#xff1a; {} 字符串&#xff1a; a b c a b c b b 指…

SOD-YOLO:增強基于YOLO的無人機影像小目標檢測

摘要 https://www.arxiv.org/pdf/2507.12727 小目標檢測仍是目標檢測領域中的一個挑戰性問題。為應對這一挑戰&#xff0c;我們提出了一種基于YOLOv8的增強模型SOD-YOLO。該模型在頸部&#xff08;neck&#xff09;中集成了ASF&#xff08;注意力尺度序列融合&#xff09;機制以…

監督微調-指令微調-偏好微調

有監督微調 有監督微調是使用輸入及其標簽對的典型情況。例如&#xff0c;判斷郵件是垃圾郵件還是非垃圾郵件&#xff0c;判斷情感是積極還是消極。根據文檔的主要主題對其進行分類也是一種常見應用。模型會將輸入文本的相應表示&#xff08;隱藏狀態或嵌入向量&#xff09;作為…

樓宇自控系統對建筑碳中和目標的實現具重要價值

隨著全球氣候變化問題日益嚴峻&#xff0c;建筑行業作為碳排放的重要來源之一&#xff0c;其節能減排工作備受關注。樓宇自控系統&#xff08;Building Automation System&#xff0c;BAS&#xff09;作為智能建筑的核心組成部分&#xff0c;通過集成控制、監測和管理建筑內的各…

【YOLO學習筆記】YOLOv5詳解

一、數據增強 mosaic仿射變換與透視變換Mixup mosaic代碼位置仿射變換 與 透視變換?代碼片段位置 二、網絡結構 1. 網絡不同尺寸 nsmlx與網絡深寬度 yolov5 官方提供了5個目標檢測的網絡版本&#xff1a;yolov5n、yolov5s、yolov5m、yolov5l、yolov5x &#xff0c;早年是…

WebRTC前處理模塊技術詳解:音頻3A處理與視頻優化實踐

一、WebRTC前處理模塊概述 WebRTC&#xff08;Web Real-Time Communication&#xff09;作為實時音視頻通信的核心技術&#xff0c;其前處理模塊是提升媒體質量的關鍵環節。該模塊位于媒體采集與編碼之間&#xff0c;通過對原始音頻/視頻數據進行優化處理&#xff0c;解決實時…

ssm復習

Spring Framework系統架構核心容器的學習IOC/DIIOC容器IOC使用對象時,由主動new產生的對象轉換為由外部提供對象,此過程中對象的創建的控制權交由外部,此思想稱為控制反轉, (實現了自己new的解耦) 對象創建的控制權Spring提供一個容器,稱為IOC容器 用來充當IOC思想的外部Bea…

ESP32:2.搭建UDP服務器

硬件&#xff1a;ESP32-Devkit-V4 MODEL:ESP32-32U 庫&#xff1a;ESP-IDF v5.4.1 系統&#xff1a;windows中的虛擬機 ubuntu 22.04 實現STA&#xff0c;主動連接AP后&#xff0c;打印IP地址&#xff0c;獲取IP后&#xff0c;創建socket&#xff0c;搭建UDP 服務器&#xff0…

【Linux】動靜態庫制作

&#x1f43c;故事背景假設今天你有一位舍友。你需要幫助他完成老師的作業。而他寫的代碼依賴兩個文件&#xff08;mymath.h,mystdio.h&#xff09;。但是這兩個文件的功能他不會寫&#xff0c;他只會調用。他的調用代碼:#include"mystdio.h" #include"mymath.h…