控制電流采樣:PWM觸發(fā)ADC與FOC實(shí)現(xiàn)詳解)
1. 為什么電機(jī)電流采樣是繞不開的坎做電機(jī)控制這幾年我越來越確認(rèn)一件事電流采樣不是搭個ADC讀數(shù)值那么簡單它直接決定了整個控制環(huán)路的性能上限。不管是永磁同步電機(jī)PMSM的FOC還是直流無刷電機(jī)BLDC的方波控制電流環(huán)本質(zhì)上都依賴ADC實(shí)時、準(zhǔn)確地反饋繞組電流。如果你電流采出來的波形毛刺大、相位滯后后面PID算得再漂亮也白搭。英飛凌TC3xx系列在工業(yè)驅(qū)動和汽車電控里非常常見像TC275、TC364、TC387這些型號最大的優(yōu)勢是它把PWM生成、ADC采集、故障保護(hù)這些外設(shè)做得非常閉環(huán)友好。具體來說TC3xx里有好幾套PWM方案CCU6是比較經(jīng)典的電機(jī)控制單元GTMGeneric Timer Module更靈活、通道多常用于復(fù)雜時序ADC方面則是EVADCEnhanced Versatile ADC支持多通道同步轉(zhuǎn)換、隊(duì)列、外部觸發(fā)。這些模塊單獨(dú)用都不難難的是把它們組合到一起形成一條高效的PWM觸發(fā)ADC、ADC喂給控制環(huán)、控制環(huán)再調(diào)PWM的流水線。這篇文章我打算從方案選型、外設(shè)配置、代碼框架到實(shí)際調(diào)試把整個鏈路走一遍。適合正在用TC3xx做電機(jī)控制、或者想從STM32這類MCU往更高端平臺遷移的工程師參考。你會看到我實(shí)際配置時的參數(shù)選擇也會看到我踩過的坑比如ADC采樣點(diǎn)沒對準(zhǔn)、觸發(fā)源選錯、濾波過度導(dǎo)致相位延遲之類。這些內(nèi)容參考手冊里不會寫得很直白但實(shí)際調(diào)試時全是硬骨頭。2. 整體設(shè)計(jì)思路PWM和ADC如何協(xié)同工作2.1 電流采樣拓?fù)湓趺催x先明確一個底層問題你要采什么位置的電流。常見有三條路線——高端采樣、低端采樣、相位采樣也叫橋臂采樣。高端采樣是在母線正極串采樣電阻能直接看到直流母線電流但共模電壓高需要隔離放大器或高共模抑制比的運(yùn)放成本高、布線麻煩。低端采樣是在逆變器下橋臂MOSFET的源極和地之間串電阻共模電壓低電路簡單開發(fā)階段最常用。但它最大的問題是采樣窗口受限當(dāng)某個下橋臂占空比接近0或接近100%時流過采樣電阻的電流很小或者根本沒有這個時刻采不到有效值。相位采樣則是把采樣電阻放在電機(jī)相線輸出端配合運(yùn)放差分采樣能準(zhǔn)確反映相電流FOC里最常用。我在這個項(xiàng)目里用的是三電阻低端采樣PWM中心對齊的方案。原因有兩個一是硬件改動最小三相下橋臂各放一個毫歐級采樣電阻就能滿足需求二是TC3xx的EVADC支持多通道同步采樣可以在同一時刻把兩相或三相電流一起采進(jìn)來這正好匹配FOC需要的同時刻電流矢量。2.2 為什么必須在PWM中心點(diǎn)觸發(fā)ADC這個點(diǎn)我最初理解得不夠深后來被波形教育了。PWM驅(qū)動電機(jī)時MOSFET在開關(guān)瞬間會產(chǎn)生很高的dv/dt和di/dt這些噪聲會通過寄生電容耦合到采樣電阻和運(yùn)放上。如果你用固定周期去采ADC采到的值會包含大量開關(guān)毛刺讓人根本分不清是真實(shí)電流還是噪聲。解決思路是讓ADC采樣點(diǎn)避開開關(guān)邊沿落在PWM導(dǎo)通區(qū)間中段也就是中心對齊PWM的計(jì)數(shù)器歸零或計(jì)數(shù)到周期值的時候。這時上橋臂已經(jīng)穩(wěn)定開通下橋臂同步續(xù)流也穩(wěn)了采樣電阻上的壓降能真實(shí)反映相電流。TC3xx里的CCU6或GTM都可以產(chǎn)生周期性的同步事件比如T12的周期匹配事件這個事件直接作為EVADC的外部觸發(fā)源。用這種硬件觸發(fā)采樣的方式ADC采樣點(diǎn)天然地和PWM同步不需要CPU介入也不會因?yàn)橹袛喽秳訉?dǎo)致采樣相位漂移。我建議直接用硬件觸發(fā)不要用定時器中斷去啟動ADC。曾經(jīng)圖省事在PWM中斷里用軟件觸發(fā)ADC結(jié)果發(fā)現(xiàn)中斷響應(yīng)延遲不同步高速運(yùn)轉(zhuǎn)時電流波形有明顯的相位抖動。后來改成事件觸發(fā)干凈利落。2.3 TC3xx中的觸發(fā)鏈路規(guī)劃TC3xx里實(shí)現(xiàn)PWM觸發(fā)ADC有幾種常見接法。如果你用的是CCU6可以直接把CCU6的T12周期匹配事件映射到EVADC的請求源選擇同步轉(zhuǎn)換或隊(duì)列轉(zhuǎn)換模式。如果你用的是GTMGTM的ATOM或TIM模塊可以生成觸發(fā)信號經(jīng)過GTM內(nèi)部的信號路由輸出給EVADC觸發(fā)輸入。還有一種是利用DPLL和GTM的MCSmulti-channel sequencer做復(fù)雜時序編排但一般電機(jī)應(yīng)用用不上那么重。我這次用的是CCU6EVADC的方案觸發(fā)鏈?zhǔn)荂CU6的T12工作于中心對齊模式產(chǎn)生互補(bǔ)PWM輸出帶死區(qū)。T12周期匹配時產(chǎn)生觸發(fā)事件。該事件作為EVADC的GxREQTRIG信號使能通道組的同步轉(zhuǎn)換。轉(zhuǎn)換完成后DMA或中斷讀取結(jié)果寄存器。這里有個關(guān)鍵點(diǎn)采樣時刻需要根據(jù)死區(qū)時長和電流建立時間做補(bǔ)償。也就是說觸發(fā)信號最好比PWM中心點(diǎn)稍微偏移一點(diǎn)讓采樣電阻上的電流先穩(wěn)定。TC3xx的EVADC支持同步轉(zhuǎn)換觸發(fā)延遲可以在觸發(fā)鏈路上插入延時具體參數(shù)得根據(jù)實(shí)際板子上的RC時間常數(shù)去調(diào)。3. 核心配置實(shí)操從CCU6到EVADC3.1 CCU6的PWM通道配置CCU6模塊里做電機(jī)控制主要用T12三路捕獲/比較單元每路可以輸出一對互補(bǔ)PWM比如CC60和COUT60中間插入死區(qū)。我先說死區(qū)這是很多人上來就忽略的參數(shù)。死區(qū)時間是防止上下橋臂同時導(dǎo)通導(dǎo)致直通的保護(hù)時間一般根據(jù)MOSFET的關(guān)斷延遲和柵極驅(qū)動延遲來定常見值在500ns到2us之間。我用的IGBT模塊死區(qū)設(shè)了2us如果是快管MOSFET1us左右就夠。配置死區(qū)時要注意TC3xx的死區(qū)時間單位。CCU6的死區(qū)寄存器T12DTC里的DTM是以CCU6的時鐘周期為單位的如果你配錯了單位實(shí)際死區(qū)可能會比預(yù)期大很多導(dǎo)致波形畸變和效率下降。我用的是fGTM為100MHz的時鐘死區(qū)2us就寫200。換算公式很簡單死區(qū)時間 死區(qū)計(jì)數(shù)值 / 模塊時鐘頻率。CCU6還有故障輸入模塊這個強(qiáng)烈建議提前配好。電機(jī)過流時硬件比較器輸出一個低電平信號接到CCU6的CTRAP引腳配置為故障輸入一旦觸發(fā)就立即封鎖PWM輸出把輸出引腳置為安全電平。這個功能比軟件中斷快得多是真正能救命的機(jī)制。PWM故障保護(hù)這個詞在熱詞里也出現(xiàn)了確實(shí)是最關(guān)鍵的一環(huán)。我見過不止一次因?yàn)檐浖Wo(hù)反應(yīng)慢導(dǎo)致MOSFET炸管的事故所以現(xiàn)在做項(xiàng)目都先配故障保護(hù)再做控制邏輯。3.2 EVADC的通道和觸發(fā)配置EVADC配置的第一步是把通道分好組。TC3xx的EVADC通常有多個獨(dú)立轉(zhuǎn)換器組比如G0、G1每個組有自己的觸發(fā)源和結(jié)果寄存器。我把三相電流采樣通道分配在同一個組里啟用同步轉(zhuǎn)換模式這樣一次觸發(fā)就能同時采樣三相電流。同步轉(zhuǎn)換是EVADC一個很有用的能力它保證多個通道的采樣保持電路在同一個時刻抓取電壓值對于FOC這種需要同時刻三相電流的算法來說至關(guān)重要。采樣時間也要仔細(xì)算。EVADC每個通道都可以獨(dú)立配置采樣時間Sample Time它決定采樣保持電容充電的時長。如果采樣時間太短采到的電壓還沒穩(wěn)定誤差會很大。我給電流采樣通道配的是最大采樣時間并且把轉(zhuǎn)換結(jié)果分辨率設(shè)在12位。換算下來單通道轉(zhuǎn)換時間大約在1us級別三通道同步轉(zhuǎn)換也在幾微秒內(nèi)完成完全不會拖慢控制周期。有一點(diǎn)需要提醒采樣電阻上的電壓非常小。常見的采樣電阻是10毫歐相電流假設(shè)是10A上壓降也只有0.1V必須用運(yùn)放放大后再進(jìn)ADC。EVADC的參考電壓一般是3.3V或5V你得把運(yùn)放增益配到合適值讓最大電流對應(yīng)的電壓在ADC量程的80%左右留出余量。如果運(yùn)放輸出超過滿量程ADC讀數(shù)會飽和電流波形就會被截平控制環(huán)路會表現(xiàn)出奇怪的震蕩。3.3 電流重構(gòu)和數(shù)值處理如果用的是三電阻采樣理論上每個PWM周期都能同時讀到三相電流。但在實(shí)際情況中當(dāng)某一相的占空比接近0%或100%時該相下橋臂的導(dǎo)通時間太短采樣電阻上有效壓降的窗口不夠?qū)е虏蓸又凳д?。這就是低端采樣方案的重構(gòu)盲區(qū)。解決辦法是對于不滿足采樣條件的相用三相電流之和為零的約束推算出來在這個項(xiàng)目里是星形連接電機(jī)所以ia ib ic 0。數(shù)值層面的處理同樣重要。EVADC讀出來的是二進(jìn)制碼需要先換算成電壓V (ADC值 / 4096) * Vref再根據(jù)運(yùn)放增益和采樣電阻阻值換算成電流I V / (Gain * Rshunt)這里有一個很多人忽略的零漂校準(zhǔn)問題。運(yùn)放本身存在輸入失調(diào)電壓ADC也存在偏移誤差即使電流為零采樣值也不一定是零。我做法是硬件初始化時PWM不輸出先讓電機(jī)相線處于開放狀態(tài)然后讀一批ADC值求平均把這個平均值作為零漂偏置存起來。之后每次采樣都先減去這個偏置再做換算。這一步精度提升明顯尤其是小電流工況下如果沒有補(bǔ)償?shù)退俎D(zhuǎn)矩控制會很難受。濾波這一層我的經(jīng)驗(yàn)是不要一開始就上重濾波。數(shù)字濾波會帶來相位延遲電流環(huán)對延遲很敏感延遲一大帶寬上不去動態(tài)響應(yīng)就差。我建議先做輕度的中位值濾波或一階低通濾波截止頻率選在PWM頻率的1/10左右把采樣毛刺修一修如果還嫌噪聲大再考慮從硬件上改進(jìn)比如調(diào)整采樣點(diǎn)、優(yōu)化地線布局。4. 從采樣到閉環(huán)電流環(huán)和速度環(huán)的實(shí)現(xiàn)4.1 離散化PID控制器電流采樣搞定了下一步就是把它用起來形成閉環(huán)。閉環(huán)控制最核心的就是PID控制器。對于電流環(huán)一般用PI就夠了因?yàn)殡娏黜憫?yīng)快微分項(xiàng)容易引入噪聲??刂浦芷谕ǔJ荘WM頻率的整數(shù)倍比如PWM為10kHz電流環(huán)控制周期就設(shè)為100us。PI控制器的離散化公式寫成增量式比較方便float pid_current_single(float err, float kp, float ki, float ts, float *integral) { *integral err * ts; // 積分限幅防止積分飽和 if (*integral INTEGRAL_LIMIT) *integral INTEGRAL_LIMIT; if (*integral -INTEGRAL_LIMIT) *integral -INTEGRAL_LIMIT; return kp * err ki * (*integral); }積分限幅非常關(guān)鍵很多人在調(diào)試時會遇到啟動超調(diào)大停不下來這類問題八成是積分飽和了。我一般在代碼里還做抗飽和處理當(dāng)輸出已經(jīng)達(dá)到PWM占空比上限時停止繼續(xù)累加積分。講一個實(shí)際的參數(shù)整定技巧電流環(huán)可以先只用P項(xiàng)一點(diǎn)一點(diǎn)加大Kp讓電流快速跟蹤階躍指令且不振蕩然后再加Ki消除穩(wěn)態(tài)誤差。Ki加大的時候如果出現(xiàn)低頻率振蕩幾赫茲那種基本就是積分太強(qiáng)。用這個順序調(diào)比網(wǎng)上那些試湊法靠譜得多。4.2 FOC坐標(biāo)變換和電流環(huán)級聯(lián)如果你推動的是PMSM那么電流閉環(huán)還包含坐標(biāo)變換的過程。三相靜止坐標(biāo)系里的電流是正弦波直接用PI去追正弦波是有靜差的所以必須做Clarke變換和Park變換把它變成d-q旋轉(zhuǎn)坐標(biāo)系下的直流量// Clarke變換三相 - 兩相靜止 i_alpha ia; i_beta (ia 2.0f * ib) / 1.7320508f; // Park變換兩相靜止 - 兩相旋轉(zhuǎn) sin_th sinf(theta); cos_th cosf(theta); i_d i_alpha * cos_th i_beta * sin_th; i_q -i_alpha * sin_th i_beta * cos_th;其中theta是轉(zhuǎn)子電角度需要從編碼器或霍爾傳感器獲得。如果轉(zhuǎn)子位置不準(zhǔn)Park變換就會把真實(shí)電流映射到錯誤的坐標(biāo)系里導(dǎo)致Id和Iq控制互相串?dāng)_。所以我建議不管你的傳感器是什么類型都要做安裝校準(zhǔn)和零點(diǎn)偏置處理。電流環(huán)一般控制Iq轉(zhuǎn)矩電流和Id勵磁電流。對于表貼式PMSMId的給定值通常是0Iq給定來自速度環(huán)的輸出。這就是典型的速度外環(huán)電流內(nèi)環(huán)級聯(lián)結(jié)構(gòu)電流環(huán)的帶寬要遠(yuǎn)高于速度環(huán)一般電流環(huán)響應(yīng)時間在毫秒級速度環(huán)在幾十毫秒級。如果你做的電機(jī)沒有位置傳感器還需要加入無感觀測器估計(jì)轉(zhuǎn)子位置這里就不展開了但我必須說一句電流采樣的精度和同步性直接影響觀測器的估計(jì)精度采樣做不好無感算法基本涼一半。4.3 閉環(huán)調(diào)試的步驟和順序閉環(huán)調(diào)試最忌諱一步到位。我踩過幾次坑后總結(jié)了一個固定的調(diào)試順序每次都照做效率高很多先開環(huán)測PWM。給一個固定占空比觀察電機(jī)是否能正常轉(zhuǎn)動、電流是否在合理范圍確認(rèn)硬件和PWM基本沒問題。再做電流采樣校準(zhǔn)。讓電機(jī)不轉(zhuǎn)確認(rèn)ADC讀數(shù)和零漂然后手動給一個微小占空比對比實(shí)測電流和示波器探頭測量值確認(rèn)換算關(guān)系正確。閉環(huán)電流環(huán)。給定一個小的Iq指令逐漸加大看電流響應(yīng)是否快速、無靜差。最后做速度環(huán)。速度環(huán)輸出限幅要特別注意避免速度環(huán)飽和后給電流環(huán)一個過大的階躍容易把母線電壓拉崩。這四步每一步都有獨(dú)立的驗(yàn)證目標(biāo)任何一步過不去都不要往后走。4.4 代碼結(jié)構(gòu)怎么放整個控制代碼我建議分成三層底層外設(shè)驅(qū)動層、控制算法層、應(yīng)用調(diào)度層。底層驅(qū)動封裝CCU6和EVADC的寄存器操作控制算法層只處理純數(shù)學(xué)計(jì)算輸入是電流和位置輸出是占空比應(yīng)用調(diào)度層負(fù)責(zé)中斷優(yōu)先級的分配和狀態(tài)機(jī)切換。TC3xx的控制中斷優(yōu)先級設(shè)計(jì)需要注意。電流環(huán)對實(shí)時性要求最高優(yōu)先級最高一般放在CCU6的周期中斷或GTM的中斷里而不是放在ADC轉(zhuǎn)換完成中斷里。因?yàn)槲矣玫氖怯布|發(fā)ADC轉(zhuǎn)換完成標(biāo)志只是一個同步信號等它進(jìn)了中斷再去算控制已經(jīng)來不及了。正確做法是ADC轉(zhuǎn)換完成后由DMA搬到內(nèi)存周期中斷到點(diǎn)后直接讀取這些緩存數(shù)據(jù)做運(yùn)算。這樣最穩(wěn)定。5. 常見問題與排查技巧實(shí)錄5.1 采樣噪聲大波形毛刺多這是我被問得最多的一個問題。排查方向先分硬件和軟件硬件方面看運(yùn)放供電是否干凈、采樣電阻和地線布局是否合理軟件方面先確認(rèn)采樣點(diǎn)是不是和PWM邊沿重疊了。我實(shí)際遇到的情況中八成以上是采樣點(diǎn)沒避開開關(guān)邊沿。你可以寫一個測試程序把PWM占空比固定然后慢慢移觸發(fā)的延時寄存器同時觀察ADC讀數(shù)的波動找到波動最小的那一段那才是真正的采樣窗口。另外還要檢查運(yùn)放的帶寬是不是夠。電流環(huán)控制的高頻頻段一般到幾kHz但PWM的開關(guān)邊沿含有極高頻率的成分如果運(yùn)放的壓擺率不夠輸出跟不上真實(shí)電流變化也會表現(xiàn)為波形失真。我這款運(yùn)放選的GBW增益帶寬積在10MHz以上實(shí)測夠用。5.2 電流波形畸變正弦度不好電流波形畸變通常不是采樣的問題而是PWM占空比計(jì)算或死區(qū)效應(yīng)。死區(qū)時間會導(dǎo)致實(shí)際輸出電壓比給定電壓小尤其在低速輕載時死區(qū)造成的電壓誤差占比更大電流波形會出現(xiàn)明顯的臺階和零電流鉗位現(xiàn)象。本質(zhì)上是MOSFET開關(guān)并非理想瞬間完成死區(qū)時間內(nèi)電流只能靠二極管續(xù)流方向不同電壓誤差符號也不同。方法有兩種一是做死區(qū)補(bǔ)償根據(jù)電流方向?qū)φ伎毡茸鲂拚翘岣逷WM頻率縮小死區(qū)在一個周期中的占比。最簡單的方式是先提高PWM頻率看波形有沒有改善如果改善明顯說明死區(qū)效應(yīng)占主要因素。5.3 PWM故障保護(hù)誤觸發(fā)CTRAP保護(hù)老是誤觸發(fā)原因多在故障輸入信號毛刺上。外部比較器輸出的故障信號如果沒做濾波一個窄的噪聲尖峰就會觸發(fā)封鎖。CCU6的故障輸入本身可以配置有效電平檢測模式還有輸入濾波功能。我在實(shí)際項(xiàng)目中把故障信號的展寬拉長到2us以上同時使能了輸入濾波誤觸發(fā)率大幅下降。如果你遇到上電瞬間誤觸發(fā)還要檢查控制信號默認(rèn)電平是否和故障有效電平?jīng)_突。5.4 ADC采樣轉(zhuǎn)換結(jié)果一直不變或全為0這個問題的根源通常是EVADC的請求源沒有正確使能或者觸發(fā)信號根本沒有到達(dá)。排查時先繞開硬件觸發(fā)用軟件觸發(fā)方式讀一次看ADC本身能不能工作。能工作的話問題就在觸發(fā)鏈路檢查CCU6的周期匹配事件是否輸出、EVADC的GxREQTRIG寄存器里是否選擇了正確的觸發(fā)源。這塊設(shè)置涉及多個寄存器聯(lián)動建議逐項(xiàng)對照參考手冊排查。5.5 電流環(huán)帶寬上不去如果動態(tài)響應(yīng)總是肉肉的滯后明顯主要注意這幾項(xiàng)控制周期是不是太長。PWM頻率10kHz時控制率要在100us內(nèi)完成如果算法里的三角函數(shù)用軟件算時間會吃緊。TC3xx有硬件CRC和浮點(diǎn)單元但sinf/cosf庫函數(shù)仍然要幾十微秒建議用查表或多項(xiàng)式近似替代。采樣結(jié)果有沒有做重濾波。重濾波帶來的相位延遲會直接壓掉電流環(huán)帶寬。如果噪聲允許濾波越輕越好。坐標(biāo)變換的角度有沒有延遲補(bǔ)償。在高速運(yùn)行時轉(zhuǎn)子位置在每個周期都變化需要補(bǔ)償一個角度增量。6. 一些實(shí)際經(jīng)驗(yàn)總結(jié)做這套系統(tǒng)下來我最大的體會是TC3xx的外設(shè)能力很強(qiáng)但如果只按MCU手冊一個個配寄存器很容易迷失在繁多的選項(xiàng)里。更好的方式是從控制需求倒推先確定采樣策略和控制周期再決定PWM怎么配、ADC怎么觸發(fā)。外設(shè)是為算法服務(wù)的而不是反過來。調(diào)試時一定要多看波形。即使有ADC讀數(shù)也要把DAC輸出或調(diào)試接口里的實(shí)際電流波形和電流探頭測到的真實(shí)波形對比看。畢竟ADC轉(zhuǎn)換出來的只是一堆數(shù)字真實(shí)世界發(fā)生了什么示波器永遠(yuǎn)不會騙你。還有一個小技巧調(diào)控制參數(shù)時把目標(biāo)電流設(shè)成一個低頻正弦波比如10Hz然后看實(shí)際電流跟蹤給定電流的情況。這樣能直觀看到滯后、增益誤差和穿越頻率比只盯階躍響應(yīng)信息量大得多。我每次都會配合做這個測試能快速定位限幅、飽和和時序問題。如果后續(xù)要做更復(fù)雜的應(yīng)用比如FOC無感控制或者帶弱磁的高速運(yùn)行這套采樣鏈路的穩(wěn)定性會泛化成最基本的保障。再往上做容錯控制和功能安全就以它為基礎(chǔ)了提前把ADC校準(zhǔn)、故障保護(hù)、診斷檢測這些底層能力搭建好會省下后面很多功夫。