Motor control

Motor control on STM32

Position Controll(ext interface) on MCSDK6.x

前言 這邊因為MCSDK6.x版本後可以直接把位置控制生成出來,但這塊目前僅一般Encoder其他都需要修改,但這樣我們應該怎麼修改? 可以就從幾個範例來講解說明,針對I2C or SPI等等介面,基本上會是以ST生成的code去做調配,因此只有2環位置環+電流環 產生基本框架並且修改 因這邊使用MCSDK6.3.1版本基本上6.X以上版本皆是相同 在ST MCSDK上修改設定把Encoder打開 並且在以下要選成位置控制 Code修改邏輯 第一件事要先確認你多少頻率下會生成一個data,因為PWM採樣是在波峰週期如下圖採樣,基本上需要相同時間內完成不然就會產生運算錯誤,如果採樣太慢就要修改採樣頻率,變成不是每個上升周期都在採樣,可以參考下圖(ST初始設定是每個周期都會採樣) 在code方面是在以下位置 這部分是電流環觸發 採樣後UPdate 位置控制所做的計算主要在中頻任務中完成,因此要確保一個週期時間內可以採樣到全部數據並處理完畢(以30KHz為例全部任務就需要再33us完成,這樣Sensor 上報數據也會需要在33us內有data,如果沒有就需要拉長採樣週期去延長時間) 接下來就是針對已生成的位置控制在狀態內針對幾個部分修改1.CAL 2.Alignment 修改Alignment 原始encoder是使用打Id回測去對應目前角度做Alignment 這邊是使用初始給定角度,但這塊都是encoder專用所以不用設定 如果選用的sensor會記憶角度或可以直接設定為0,可以修改這邊使其變為0 以下總會整是Base 在Encoder底下出來的部分,因此其他interFace針對以下函數去修改即可調用原先架構 範例(使用多摩川encoder) 這邊額外寫一個函數去對比原來SetMecAngle(這邊留意只能用16bit的數據空間超過就需要全部自己重寫) 對比原先左邊和右邊概念不同,右邊是原先Encoder所使用方式因此原先部分是會打Id協助定位,但因為sensor本身輸出就是絕對角度,所以直接使用他的角度資訊操作 最重要的也是角度計算,這塊函數是會持續在中品任務中去update數值 其中Super.hElAngle這個是要塞入所使用sensor最重要的角度資訊,這邊需要針對需要特定條件在撰寫過 其他部分就可以沿用原先的code base 限制 這邊只能使用16bit以內數據,並且是2環架構,另外在位置路徑規劃上ST使用是標準的累積方式,因此並非全部都適合如股會出現暴衝等等現象都是路徑規劃沒有匹配 參考

Position Controll(ext interface) on MCSDK6.x Read More »

BLDC Six Step Control(Sensorless)

前言 針對六步方波控制作原理做介紹,再開迴路區塊six step相對簡單通常有問題都是回授端,在Sensless回授上會以ST和NXP等文章做詳細介紹,在Debug路上能更加快速明朗,節省開發時間,coding結構會以ST為主要,這區塊會在實作環節說明 Six Step Control 一般六步驅動方式就是把MOS開合組合分成6個區塊讓馬達達到持續旋轉 這邊截用介紹其中2個步驟讓大家了解其旋轉方式 Sensorless Feedback 順向部分基本上不難,主要是後段回授控制( back EMF detection) 換相時機 由於中點電勢值始終為6V,CC’的線圈所產生的感生電動勢只能在以中點6V電位為基準點的基礎上疊加;仍舊假設在額定轉速下CC’上會產生5.7V的感生電動勢在t0時刻,如果我們去測量C點的電壓,其值應為6+5.7=11.7V;在t1時刻,C點的電壓值應為6-5.7=0.3V也就是說,在AB相通電期間,只要一直監測馬達的C引線的電壓,一旦發現它低於6V,就表示轉子已轉過30°到達了t0和t1中間的位置,只要再等30°就可以換相了。 ADC採集過零訊號 如果電調的MCU夠快的話,可以採用連續AD取樣的方式來測量C點電壓,不過貌似有點浪費,因為大部分採到的AD值都是沒用的,我們只關心它何時低於6V 。 雖然無法預測接下來的 30° 電角度是多長,但是剛剛過去的上一個換相週期,即兩個換相點之間 60° 電角度的長度是可以測量的。於是可以用近似的辦法,用上一個換相週期,即 60° 電角度的時間減半,作為接下來的 30° 電角度延時時間。這種辦法是可行的,因為馬達的轉速是漸變的,相鄰兩個換相週期的時間相差不會很大。 參考

BLDC Six Step Control(Sensorless) Read More »

Routing a Power Inverter Design Guidelines

前言 客戶在馬達控制設計上常常會有layout上問題,但這邊很多是個架Know How,這邊ST提供重點關鍵設計指引避免在馬達控制上設計踩坑,最後導致ADC回授電路雜訊過多干擾實際馬達控制,另外也提供MOS設計規範指引讓客戶指引可以知道後續設計要點 Circuit loops Guidelines 基本上最重要一個要點就是避免大區域Loops設計(Avoid big area loops as much as possible!) Good component placement is the key 連接方式會建議使用 Kelvin connection/Star Connection 範例 Current loop area is minimized and there are no sensitive circuits inside it GND設計上會建議分開數位GND還有Power GND 其他MOS等設計可以參考下面文件Power MOSFETs: best choice guide for VRM applications 參考

Routing a Power Inverter Design Guidelines Read More »

Detail Know How For MCSDK

前言 針對Motor Control怎樣算好以及怎樣調整一直都是很多新入門玩家的痛,這邊針對一些實際案例與好用工具做詳細介紹,從一開始的Motor Pilot偵測馬達參數,到後續Open loop HW debug,接到Close loop start up 等等 MC-SDK v6.1 – FW lib features list 目前最新版本到6.3,但因手邊公開資料比較表還沒更新上去,基本上最主要差異在於Daul motor還有C0與H5加入 Motor profiler steps 基本上操作會在1min內結束超過1min會出現Fail,容易Fail會是在第3部,這邊最直接解決方式會是降低最大轉速讓ST算法執行完成或直接量測 Checking the Current Regulator 先來看看什麼是好的甚麼是不好的 一般會使用Open Loop先確認Debug HW,電壓設定基本上不用大10%左右就可以了 Close Loop Speed Adjust For Kp KI 這邊直接看2個結果,主要for降速度太慢或太快 參考

Detail Know How For MCSDK Read More »

Daul Motor By using MCSDK6.X

前言 這次在雙馬達控制,ST使用MCSDK生成基本上是跟單馬達控制相同,但主要差異在於任務排程上有差異,這邊說明雙馬達控制上的流程,並比較雙馬達控制2種差異,在sensing端ST這邊的理論與實際code的操作,另外說明SVPWM的緣故抽載頻率是PWM的2倍 ST SDK6.X支援list 這邊ST支援雙馬達部分目前F4/F3/G4/F7,單馬達部分多C0/H5,需要留意F7和F1不完全支持 另外部分的code是額外非在SDK內可以生成,但在目前新版六步方波基本上可以生成但H7部分還是需要額外索取 雙馬達控制時序 以下是雙馬達使用SDK生成出的時序,主要可以看到ADC擷取採樣基本上都在TIM峰值附近但在update數值會是下一次循環中才更新,另外因MCU為單軌執行序在於TIM1與TIM8會有中斷後處理分開的現象(馬達1和馬達2之間的FOC順序可以根據ADC取樣點顛倒)透過修改 TIM1_CCER 暫存器中的 CC4P 位元來反轉 PWM 4 輸出。因此,當 TIM1 計數器在向下計數期間與 OCR4 暫存器值相符時,A/D 取樣開始。 執行 FOC 演算法後,計算要載入到 OCR4 暫存器中的值設定下一個 PWM 週期的取樣點,並且 A/D 轉換器配置為對正確的通道進行取樣。 Update Event Tasks ADC Interrupt Service Routine Tasks 備註:這邊有2個參數可以調整T-rise/T-noise增加穩定性 參考

Daul Motor By using MCSDK6.X Read More »

MCSDK Json File Description

前言 MCSDK目前在6.3.0版本後面新增開發版自訂圖形化模式,相對便利,但在6.2.X版本中都是要去自訂修改Json才可以把自訂功能加上去相對來說是相對麻煩的,而且需要先去對MCU pin腳是否有吻合功能需求。這邊就教學2個版本在自訂開發版上要如何修改 MCSDK6.3.0 Board Define 在最新的6.3.0以上版本目前已知bug是加上FreeRtos會導致UART無法正常連線,如果自己搬移修改會導致MCU進入HardFault,但在自訂板子上多了圖形化介面很方便自己去修改 這邊操作就比較簡單大概就是選取MCU或Power版或整合在一起的板子,比照認知選取即可 MCSDK6.2.X Json File 低於6.3.0版本就比較麻煩會需要到以下路經的資料夾中複製出來檔案直接做文字修改 這邊可以先複製一快開發版JSON到桌面開啟後可以看到,在MCU板那塊選擇目前有支援的即可在把對應的pin填上但其實更快的是直接使用inverter去改寫會快很多 在inverter上就比較顯而易見針對各種回售補對應參數就快速很果,並且在ST官網上也有描述 小Note,在Power 板上面的描述針對Shunt電阻數值這塊可以使用舊版MCSDK5.4.8 針對Shunt阻值的修改如圖最後就可以使用計算器完成數值 參考

MCSDK Json File Description Read More »

State observer sensorless algorithm

前言 State observer sensorless algorithm是ST的SDK所使用的方式,這邊會來深入解說observer+PLL算法以對應ST MCSDK所要調整參數,讓在調整參數上更為快速能準確完成任務目標,所參考資料為ST MCSDK 6.3.0版本以下是眾多sensorless馬達控制這次僅針對State observer 永磁同步馬達的數學模型 永磁同步電機,在α-β軸系下的電壓方程的一般表達形式 對龍伯格觀測器進行離散化,設採樣時間為T,則離散化後的觀測器為右圖 鎖相環(Phase-Locked Loop) 上面已經算出了反電勢的估計值,直接透過反正切函數就可以分別計算出位置和速度了,如下: Sensorless tuning STO & PLL page 針對ST參數有一個對照表如下 參考

State observer sensorless algorithm Read More »

Single-shunt VS Three-shunt

前言 這邊因設計參考需要,深入研究 single-shunt and three-shunt ,此篇文章會深入探討這2者差異與新舊版MCSDK的差異,另外深入介紹這2者Sensing的流程與差異 Shunt電阻設計 前一篇有提到不同Shunt電阻設計,這邊簡單針對系統回顧 基本上會分成3個部分Filter/offset/OPA,其中Filter是不一定會加上的部份,因為加上RC Filter會讓響應速度變慢,這邊會在一些速度控制上來說不一定是好的,但加入RC Filter可以提高在快速降速上避免OverShut的過大導致偵測錯誤Offset部分基本上一定要加因為ADC是無法收到負值,最後OPA部分就是看需求條配Gain值大小 3 shunt 介紹 3 shunt 電流偵測偵測的彈性度會比較高因公式𝐼𝑎 + 𝐼𝑏 + 𝐼𝑐 = 0 這邊3 shunt各取2項就可以推算出全部因此,相對1 shunt偵測不會有複雜的演算法和偵測死區,但成本上3 Shunt會比 1 Shunt設計來的高 The threeshunt technique can bounce sampling between current signals, selecting two out of three phases eachperiod, which allows long time periods for the current signals to

Single-shunt VS Three-shunt Read More »

Adding ADC channels and PINs in MCSDK 5.X

前言 馬達控制使用MCSDK時候因為ADC已被使用來採樣Shunt電流,這邊在現有的ADC上要再增加通道會需要考慮到取樣率等問題,如果直接用STM32CubeMX加ADC通道沒有做成是排成修改,會讓系統排成Fail,這邊主要是提供資訊如何在馬達專案上增加通道用在飛Shunt電阻採樣 實際操作 關鍵步驟 把標頭檔文件加入宣告,另外需要加入引用 新增 ADC 連接埠配置初始化程序以及控制引腳電平 最後使用內建函數配合排成 ADC channels注意事項 這邊如果依照原先增加方式通道是只有2可存放單純改通道數目會出現Hard Fault 仔細研究後會發現除了改以上通道外標頭檔的宣告文件RCM_MAX_CONV內也需要跟著修改 參考

Adding ADC channels and PINs in MCSDK 5.X Read More »

ST Motor Control Use Case and Debug

前言 客戶使用MCSDK5.4.8生成Hall sensor的code,但在馬達有負載起轉時候會出現馬達激磁聲音,但code部分並未新增甚麼東西,僅讓馬達停止後再起轉,這邊使用DAC接口方便Debug,最終找到演算法與部分需要改動與硬體需要調整部分解決了此問題 問題 這邊在起步出現激磁聲音,先確定相電流出現異常波形長如何,又因此Case是使用Hall sensor去做回授非sensorless,這邊去量測Hall訊號組合出下圖,看的出來再Hall訊號出現快速上下震盪,有些像HFI,但在MCSDK5.4.8這塊是被拔除的。 Debug過程 第一步:因不確定是不是在不對狀態下切換導致,因此先抓取Motor控制狀態,確保到idel狀態在進入馬達起轉或停止 第二步:結果做完第一步後也還是存在問題,接下來就一步一步查詢訊號異常部分來源是在哪邊但可以看到下圖異常部分Id是正常的,沒有注入雜訊,又發現Iq是有實際指令讓馬達去達到目標 第三步:確認是軟體部分後就去切開是回授端出問題還是順向端出問題,使用senorless run後並無發生起步問題,問題縮窄至Hall 回授先做一些調整,查看公版與打版差異,使用Hall回授公版會出現錯誤無法起轉,因此這邊提高Hall的濾雜訊電容,再把其提高,發生頻率有在減小 軟體解決方案 這邊確認後MCSDK5.4.8在起轉時並不是使用六部方波起轉完後再切換至FOC,因此會有空白區域預猜現象,只要有雜訊出現就會使其猜不准出現震盪 因此這邊會從HALL_CalcElAngle in hall_speed_pos_fdbk.c下手詢問原廠後再6.1.2有針對這部分做修正,因此把修正部分加入 參考

ST Motor Control Use Case and Debug Read More »

Shopping Cart