雙閉環(huán)控制系統(tǒng):從硬件設(shè)計(jì)到PID算法實(shí)現(xiàn))
簡介本資源面向嵌入式初學(xué)者與電機(jī)控制開發(fā)者提供基于STM32F103C8的直流無刷電機(jī)BLDC雙閉環(huán)控制完整實(shí)現(xiàn)方案解決硬件設(shè)計(jì)、驅(qū)動(dòng)開發(fā)與閉環(huán)算法落地等核心問題適用于智能小車、無人機(jī)電調(diào)、工業(yè)定位等典型應(yīng)用場(chǎng)景。壓縮包共136個(gè)文件含56個(gè)C源碼如stm32f10x_tim.c、task.c、54個(gè)頭文件h、9個(gè)匯編啟動(dòng)與端口配置文件asm以及PDF原理圖、Keil工程文件uvproj/uvopt和調(diào)試配置文件總大小472KB結(jié)構(gòu)清晰分為BLDC硬件設(shè)計(jì)與STM32F103C8_Dome軟件工程兩大模塊。已有389人學(xué)習(xí)下載可直接復(fù)用霍爾傳感器信號(hào)采集、SVPWM占空比動(dòng)態(tài)調(diào)節(jié)、速度環(huán)位置環(huán)協(xié)同控制等關(guān)鍵代碼邏輯并通過serial_V0串口模塊實(shí)時(shí)監(jiān)控電機(jī)運(yùn)行狀態(tài)大幅降低BLDC系統(tǒng)從原理圖到可運(yùn)行DEMO的開發(fā)門檻。1. 項(xiàng)目背景與核心價(jià)值最近在整理工作室的舊項(xiàng)目翻出來一個(gè)基于STM32F103C8做的直流無刷電機(jī)雙閉環(huán)控制板。這個(gè)項(xiàng)目當(dāng)時(shí)是為了驗(yàn)證一套低成本、高可靠性的電機(jī)驅(qū)動(dòng)方案從畫板、打樣到寫代碼、調(diào)參數(shù)前前后后折騰了小半年。今天把它翻出來把完整的PDF原理圖和單片機(jī)軟件DEMO源碼整理打包正好可以和大家深入聊聊一個(gè)能實(shí)際跑起來的無刷電機(jī)控制系統(tǒng)到底是怎么從零搭建起來的。直流無刷電機(jī)現(xiàn)在應(yīng)用太廣了從無人機(jī)、模型車到家用電器、工業(yè)風(fēng)扇到處都能看到它的身影。它比傳統(tǒng)有刷電機(jī)壽命長、效率高、噪音小但驅(qū)動(dòng)和控制也復(fù)雜得多核心就在于那個(gè)“換相”邏輯和“閉環(huán)控制”。網(wǎng)上開源方案很多但很多要么是純軟件模擬要么電路過于簡陋抗干擾差要么代碼只給個(gè)架子關(guān)鍵的PID調(diào)參和過流保護(hù)語焉不詳。我這個(gè)項(xiàng)目算是一個(gè)比較完整的“工程實(shí)現(xiàn)”它基于經(jīng)典的STM32F103C8T6也就是常說的“藍(lán)橋杯”最小系統(tǒng)板同款芯片實(shí)現(xiàn)了速度環(huán)和電流環(huán)的雙閉環(huán)控制硬件上包含了完整的功率驅(qū)動(dòng)、電流采樣、位置反饋和保護(hù)電路。如果你正在學(xué)習(xí)電機(jī)控制或者需要為一個(gè)新產(chǎn)品選型驅(qū)動(dòng)方案這個(gè)項(xiàng)目能給你提供一個(gè)清晰的參考。你會(huì)看到如何用最普通的元器件搭建一個(gè)穩(wěn)定的三相全橋驅(qū)動(dòng)如何利用單片機(jī)的ADC和定時(shí)器實(shí)現(xiàn)精準(zhǔn)的電流采樣與PWM生成以及最關(guān)鍵的如何將PID控制算法實(shí)實(shí)在在地嵌入到中斷服務(wù)程序中讓電機(jī)平穩(wěn)啟動(dòng)、快速響應(yīng)且不易失控。接下來我就把整個(gè)系統(tǒng)的硬件設(shè)計(jì)思路、軟件架構(gòu)和調(diào)試中的那些“坑”逐一拆解。2. 硬件系統(tǒng)深度解析從原理圖到可靠供電一套電機(jī)驅(qū)動(dòng)系統(tǒng)是否可靠八成取決于硬件設(shè)計(jì)。光有軟件算法硬件基礎(chǔ)不穩(wěn)一切都是空中樓閣。我這份PDF原理圖雖然看起來不復(fù)雜但每個(gè)模塊的選擇和布線都經(jīng)過了反復(fù)推敲。2.1 核心控制器為什么是STM32F103C8T6選擇這顆芯片是典型的性價(jià)比之選。對(duì)于無刷電機(jī)的六步方波驅(qū)動(dòng)也叫梯形波驅(qū)動(dòng)來說我們需要至少6路PWM輸出控制三個(gè)半橋的上下管1-2路ADC用于電流采樣1個(gè)定時(shí)器用于編碼器接口或霍爾傳感器接口還需要若干通用IO用于按鍵、指示燈等。STM32F103C8T6完全滿足這些需求它有3個(gè)高級(jí)定時(shí)器TIM1, TIM2, TIM3和3個(gè)普通定時(shí)器其中TIM1和TIM8可以產(chǎn)生帶死區(qū)互補(bǔ)的6路PWM完美適配三相全橋它有多達(dá)10個(gè)ADC通道采樣速度夠快它的定時(shí)器支持編碼器模式可以直接讀取增量式編碼器的脈沖。更重要的是它資源豐富、價(jià)格低廉、生態(tài)成熟各種庫和資料唾手可得極大降低了開發(fā)門檻。注意STM32F103系列有C8和CB等型號(hào)主要區(qū)別是Flash和RAM大小。C8T6是64KB Flash20KB RAM對(duì)于這個(gè)雙閉環(huán)Demo代碼綽綽有余。如果后續(xù)功能擴(kuò)展復(fù)雜可以考慮升級(jí)到CBT6128KB Flash。2.2 功率驅(qū)動(dòng)電路MOSFET選型與柵極驅(qū)動(dòng)設(shè)計(jì)這是硬件中最容易出問題的地方。我采用的是非常經(jīng)典的三相全橋拓?fù)涿肯嘤梢粋€(gè)高邊PMOS和一個(gè)低邊NMOS組成。MOSFET的選型首要考慮耐壓、導(dǎo)通內(nèi)阻和柵極電荷。耐壓Vds電機(jī)在高速換相時(shí)繞組電感會(huì)產(chǎn)生反電動(dòng)勢(shì)。電源電壓假設(shè)是24V為了留足裕量我選擇了Vds耐壓55V以上的MOS管比如常用的IRF4905PMOS和IRF3205NMOS組合。導(dǎo)通內(nèi)阻Rds(on)這個(gè)參數(shù)直接影響導(dǎo)通損耗和發(fā)熱。在預(yù)算內(nèi)盡可能選Rds(on)小的型號(hào)。我選的型號(hào)在10V柵極驅(qū)動(dòng)下Rds(on)在8-10毫歐左右對(duì)于持續(xù)電流10A以內(nèi)的應(yīng)用發(fā)熱可控。柵極驅(qū)動(dòng)直接用單片機(jī)的3.3V IO口去驅(qū)動(dòng)MOS管是絕對(duì)不行的開關(guān)速度慢損耗巨大而且可能因?yàn)槊桌招?yīng)導(dǎo)致誤導(dǎo)通。必須使用專用的柵極驅(qū)動(dòng)芯片。我選用的是IR2101S這是一款半橋驅(qū)動(dòng)芯片內(nèi)部集成了自舉電路可以用單一電源來驅(qū)動(dòng)高邊和低邊的MOSFET。每個(gè)IR2101S驅(qū)動(dòng)一相總共需要三片。原理圖中要特別注意自舉電容和自舉二極管的選型電容一般用10uF/25V的陶瓷電容二極管要用快恢復(fù)二極管如1N4148確保在高頻開關(guān)下能為高邊驅(qū)動(dòng)快速充電。原理圖中每個(gè)MOSFET的柵極都串聯(lián)了一個(gè)10歐姆左右的電阻Rg這個(gè)電阻的作用是抑制柵極回路的振蕩避免EMI問題。同時(shí)在柵極和源極之間還會(huì)并聯(lián)一個(gè)10K的電阻下拉電阻確保在驅(qū)動(dòng)芯片未工作時(shí)MOSFET處于關(guān)斷狀態(tài)防止意外導(dǎo)通。2.3 電流采樣與保護(hù)如何“感知”電機(jī)的力量雙閉環(huán)中的電流環(huán)其反饋信號(hào)就來自于電流采樣。準(zhǔn)確、快速的電流采樣是高性能控制的基礎(chǔ)。我采用了單電阻采樣方案即在三相橋的下臂MOSFET的源極到地之間串聯(lián)一個(gè)毫歐級(jí)的采樣電阻例如0.01歐姆3W功率。采樣原理在任何時(shí)刻三相中只有兩相導(dǎo)通電流從一相流入從另一相流出。通過測(cè)量流經(jīng)采樣電阻的電流并結(jié)合當(dāng)前PWM的占空比狀態(tài)可以推算出電機(jī)繞組的相電流。這種方法成本低但需要復(fù)雜的軟件計(jì)算和精確的采樣時(shí)序。運(yùn)放電路采樣電阻上的電壓信號(hào)非常小10A電流時(shí)只有0.1V需要經(jīng)過運(yùn)放放大。我使用了一顆軌到軌輸出的運(yùn)算放大器如LMV358搭建了一個(gè)差分放大電路。將采樣電阻兩端的電壓差放大20-50倍變成0-3.3V范圍內(nèi)的信號(hào)供單片機(jī)的ADC讀取。過流保護(hù)除了軟件ADC讀取硬件過流保護(hù)是必須的“保險(xiǎn)絲”。我使用了一個(gè)比較器如LM393將放大后的電流信號(hào)與一個(gè)設(shè)定的閾值電壓由電阻分壓得到進(jìn)行比較。一旦電流超限比較器輸出翻轉(zhuǎn)這個(gè)信號(hào)可以直接連接到單片機(jī)的剎車輸入引腳如TIM1的BKIN或者一個(gè)外部中斷引腳。硬件保護(hù)能在微秒級(jí)內(nèi)關(guān)閉所有PWM輸出響應(yīng)速度遠(yuǎn)快于軟件是防止炸管的最后防線。2.4 位置檢測(cè)霍爾傳感器與編碼器接口無刷電機(jī)需要知道轉(zhuǎn)子的位置來決定何時(shí)換相。低成本方案常用三個(gè)霍爾傳感器輸出三個(gè)數(shù)字信號(hào)。STM32的定時(shí)器如TIM3可以直接配置為“接口模式”自動(dòng)捕獲這三個(gè)霍爾信號(hào)的變化并產(chǎn)生中斷軟件在中斷里根據(jù)霍爾傳感器狀態(tài)表進(jìn)行換相即可非常方便。對(duì)于要求更高精度速度環(huán)的場(chǎng)合就需要增量式編碼器。STM32的定時(shí)器如TIM2或TIM4支持正交編碼器模式將編碼器的A、B相信號(hào)直接接入定時(shí)器的兩個(gè)通道定時(shí)器的計(jì)數(shù)器就會(huì)隨著編碼器的正反轉(zhuǎn)自動(dòng)加減我們只需要定期讀取這個(gè)計(jì)數(shù)器的值就能得到精確的位置和速度信息。原理圖中我預(yù)留了這兩種傳感器的接口。2.5 電源樹設(shè)計(jì)穩(wěn)定是壓倒一切的前提電機(jī)驅(qū)動(dòng)板的電源噪聲很大必須做好隔離和濾波。我的設(shè)計(jì)是輸入外部24V直流電源輸入首先經(jīng)過一個(gè)防反接二極管和一個(gè)大容量電解電容如470uF/35V進(jìn)行緩沖和儲(chǔ)能。功率部分供電24V直接給MOSFET的半橋和柵極驅(qū)動(dòng)芯片IR2101S的VB高邊驅(qū)動(dòng)電源供電。邏輯部分供電通過一顆DC-DC降壓芯片如MP2451將24V降至5V這顆芯片需要有足夠的電流輸出能力500mA并為5V輸出配備LC濾波電路。然后再用一顆LDO如AMS1117-3.3將5V轉(zhuǎn)為3.3V給單片機(jī)、運(yùn)放、比較器等供電。LDO雖然效率不如DCDC但噪聲更小有利于模擬電路和數(shù)字核心的穩(wěn)定。地線分割與單點(diǎn)連接原理圖中我會(huì)將“功率地”和“信號(hào)地”在布局上分開最后只在電源輸入電容的負(fù)端一點(diǎn)連接。這樣可以避免大電流在信號(hào)地線上產(chǎn)生壓降干擾敏感的模擬和數(shù)字電路。3. 軟件架構(gòu)與雙閉環(huán)控制算法實(shí)現(xiàn)硬件是軀體軟件是靈魂。這份Demo源碼采用裸機(jī)編程沒有上RTOS結(jié)構(gòu)清晰重點(diǎn)突出了控制算法的實(shí)現(xiàn)。核心邏輯圍繞兩個(gè)中斷展開定時(shí)器中斷用于速度環(huán)和控制周期和ADC采樣完成中斷用于電流環(huán)。3.1 主程序與初始化流程主函數(shù)main()的流程非常標(biāo)準(zhǔn)int main(void) { // 1. 系統(tǒng)時(shí)鐘、GPIO、中斷優(yōu)先級(jí)初始化 SystemInit(); GPIO_Configuration(); NVIC_Configuration(); // 2. 關(guān)鍵外設(shè)初始化PWM定時(shí)器、ADC、編碼器/霍爾接口定時(shí)器 PWM_TIM_Init(); // 配置TIM1產(chǎn)生6路帶死區(qū)PWM ADC_Init(); // 配置ADC規(guī)則組用于采樣電流和電源電壓 ENCODER_TIM_Init(); // 配置TIM2為編碼器模式或霍爾接口模式 // 3. 控制算法參數(shù)初始化設(shè)置PID參數(shù)、目標(biāo)速度、電流限幅等 PID_Speed_Init(pid_spd, 1.0, 0.05, 0.0, 1000, -1000); // 速度環(huán)PID PID_Current_Init(pid_cur, 0.5, 0.01, 0.0, 950, -950); // 電流環(huán)PID輸出限幅對(duì)應(yīng)PWM最大值 Target_Speed 500; // 初始目標(biāo)速度單位可能是RPM或編碼器脈沖頻率 // 4. 啟動(dòng)定時(shí)器中斷和ADC TIM_Cmd(TIM_LOOP, ENABLE); // 啟動(dòng)用于控制周期的定時(shí)器 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 啟動(dòng)ADC轉(zhuǎn)換 // 5. 主循環(huán)處理非實(shí)時(shí)任務(wù)如按鍵掃描、狀態(tài)顯示、通信等 while(1) { Key_Scan_Process(); LED_Display_State(); // UART_Send_Data(...); // 可在此處通過串口發(fā)送調(diào)試數(shù)據(jù) } }整個(gè)系統(tǒng)的實(shí)時(shí)控制任務(wù)全部放在中斷里主循環(huán)只處理低優(yōu)先級(jí)的后臺(tái)任務(wù)這是裸機(jī)下實(shí)現(xiàn)確定性的常用方法。3.2 速度環(huán)的實(shí)現(xiàn)定時(shí)器中斷服務(wù)程序速度環(huán)的控制周期通常比電流環(huán)慢比如10ms一次。我設(shè)置了一個(gè)定時(shí)器如TIM4每10ms產(chǎn)生一次中斷。void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 1. 獲取當(dāng)前速度反饋值 Current_Speed Get_Speed_From_Encoder(); // 從編碼器計(jì)數(shù)器計(jì)算得到RPM // 2. 速度環(huán)PID計(jì)算 PID_Calc(pid_spd, Target_Speed, Current_Speed); // pid_spd.output 即為電流環(huán)的目標(biāo)電流值 Target_Current pid_spd.output; // 3. 對(duì)目標(biāo)電流進(jìn)行限幅保護(hù)電機(jī)和驅(qū)動(dòng)器 if (Target_Current CURRENT_LIMIT) Target_Current CURRENT_LIMIT; if (Target_Current -CURRENT_LIMIT) Target_Current -CURRENT_LIMIT; } }速度環(huán)PID的輸出直接作為電流環(huán)的給定。這里Get_Speed_From_Encoder()函數(shù)是關(guān)鍵它通過計(jì)算固定時(shí)間間隔內(nèi)編碼器計(jì)數(shù)的增量來得到速度。為了平滑濾波我通常采用移動(dòng)平均濾波而不是直接用單次差值。3.3 電流環(huán)的實(shí)現(xiàn)ADC采樣與PWM更新電流環(huán)要求高得多的響應(yīng)速度控制周期通常在50-100微秒級(jí)別。這個(gè)周期與PWM的開關(guān)頻率同步。我配置PWM頻率為20kHz周期50us在每個(gè)PWM周期中點(diǎn)的時(shí)刻即“采樣點(diǎn)”觸發(fā)ADC去采樣電流。ADC采樣觸發(fā)利用高級(jí)定時(shí)器TIM1的更新事件或比較匹配事件來觸發(fā)ADC。在TIM1_CC_IRQHandler中斷中啟動(dòng)ADC轉(zhuǎn)換。ADC轉(zhuǎn)換完成中斷ADC轉(zhuǎn)換結(jié)束后進(jìn)入中斷服務(wù)程序這里是電流環(huán)的核心。void ADC1_2_IRQHandler(void) { if (ADC_GetITStatus(ADC1, ADC_IT_EOC) ! RESET) { uint16_t adc_value ADC_GetConversionValue(ADC1); // 1. ADC值轉(zhuǎn)換為實(shí)際電流值單位mA // 需要考慮運(yùn)放放大倍數(shù)、采樣電阻阻值、ADC參考電壓 float sample_current ((float)adc_value / 4096 * 3.3 - 1.65) / (20 * 0.01); // 假設(shè)放大20倍采樣電阻0.01歐 // 2. 電流環(huán)PID計(jì)算 PID_Calc(pid_cur, Target_Current, sample_current); float pwm_duty pid_cur.output; // PID輸出為PWM占空比調(diào)整量 // 3. 根據(jù)轉(zhuǎn)子位置霍爾或編碼器估算和新的PWM占空比更新6路PWM的比較寄存器值 uint8_t sector Get_Electrical_Sector(); // 獲取當(dāng)前電角度扇區(qū)0-5 Update_PWM_Duty(sector, pwm_duty); // 根據(jù)扇區(qū)查表更新TIM1-CCRx寄存器 // 4. 啟動(dòng)下一次ADC轉(zhuǎn)換如果是單次模式 ADC_SoftwareStartConvCmd(ADC1, ENABLE); } }Update_PWM_Duty這個(gè)函數(shù)會(huì)根據(jù)六步換相表將計(jì)算出的PWM值正確地賦值給對(duì)應(yīng)導(dǎo)通相的上下管比較寄存器。這里必須注意死區(qū)時(shí)間的設(shè)置在PWM_TIM_Init()中已經(jīng)配置好確保上下管不會(huì)同時(shí)導(dǎo)通。3.4 PID控制器的代碼實(shí)現(xiàn)與整定心得PID算法雖然經(jīng)典但寫好并不容易。我的Demo里實(shí)現(xiàn)了一個(gè)增量式PID結(jié)構(gòu)體封裝方便管理多個(gè)環(huán)路的參數(shù)。typedef struct { float kp, ki, kd; // PID參數(shù) float integral; // 積分項(xiàng) float prev_error; // 上一次誤差 float output_max, output_min; // 輸出限幅 } PID_Controller; void PID_Init(PID_Controller* pid, float kp, float ki, float kd, float out_max, float out_min) { pid-kp kp; pid-ki ki; pid-kd kd; pid-integral 0.0f; pid-prev_error 0.0f; pid-output_max out_max; pid-output_min out_min; } float PID_Calc(PID_Controller* pid, float target, float feedback) { float error target - feedback; pid-integral error; // 抗積分飽和當(dāng)輸出已經(jīng)限幅時(shí)停止積分累加 float output pid-kp * error pid-ki * pid-integral pid-kd * (error - pid-prev_error); pid-prev_error error; // 輸出限幅 if (output pid-output_max) { output pid-output_max; // pid-integral - error; // 更嚴(yán)格的抗飽和處理 } else if (output pid-output_min) { output pid-output_min; // pid-integral - error; } return output; }調(diào)參心得電機(jī)PID調(diào)參是個(gè)經(jīng)驗(yàn)活。我的步驟通常是先調(diào)電流環(huán)把速度環(huán)斷開讓目標(biāo)電流直接給一個(gè)固定值。先設(shè)kikd0慢慢增大kp直到電機(jī)開始出現(xiàn)“嗡嗡”聲但還不劇烈振蕩此時(shí)系統(tǒng)有較快響應(yīng)但已接近臨界。然后加入較小的ki來消除靜差。電流環(huán)要求響應(yīng)快帶寬高。再調(diào)速度環(huán)接上速度環(huán)給定一個(gè)階躍速度。同樣先調(diào)kp讓速度能較快跟上但超調(diào)不大。然后加ki消除穩(wěn)態(tài)誤差。速度環(huán)的帶寬應(yīng)遠(yuǎn)低于電流環(huán)通常kp和ki值都比電流環(huán)小很多。kd在電機(jī)控制中要慎用容易引入高頻噪聲如果要用一定要配合低通濾波。關(guān)注積分限幅無論是電流環(huán)還是速度環(huán)積分項(xiàng)的限幅或抗飽和處理至關(guān)重要否則在啟動(dòng)、堵轉(zhuǎn)等情況下積分項(xiàng)會(huì)累積到一個(gè)巨大值一旦誤差反向系統(tǒng)需要很長時(shí)間才能“回正”導(dǎo)致控制失靈。4. 關(guān)鍵調(diào)試技巧與常見問題排查即使原理圖和代碼都正確第一次上電很可能電機(jī)還是不轉(zhuǎn)或者亂轉(zhuǎn)、抖動(dòng)、發(fā)熱。下面是我在調(diào)試中總結(jié)的幾個(gè)關(guān)鍵點(diǎn)和排查清單。4.1 上電前的靜態(tài)檢查在接電機(jī)和電源之前務(wù)必完成以下檢查電源短路測(cè)試用萬用表蜂鳴檔測(cè)量24V輸入、5V、3.3V對(duì)GND的電阻不應(yīng)有短路。PWM輸出測(cè)試不接電機(jī)用示波器測(cè)量6路PWM輸出波形。程序設(shè)置一個(gè)固定的占空比檢查波形頻率應(yīng)為20kHz、幅值應(yīng)為3.3V、死區(qū)時(shí)間是否正常。手動(dòng)改變霍爾傳感器輸入或用IO模擬觀察PWM輸出是否按照六步換相表正確切換。柵極驅(qū)動(dòng)波形測(cè)試接上MOSFET仍不接電機(jī)測(cè)量MOSFET柵極G極對(duì)源極S極的電壓波形。關(guān)鍵看高邊MOS的柵極電壓是否能夠抬升到比源極高10V以上即Vgs≈10V這證明自舉電路工作正常上下管的驅(qū)動(dòng)波形是否互補(bǔ)且中間有死區(qū)。電流采樣電路測(cè)試在采樣電阻兩端施加一個(gè)已知的小電流如用可調(diào)電源串聯(lián)一個(gè)電阻用萬用表測(cè)量運(yùn)放輸出端的電壓看放大倍數(shù)是否與設(shè)計(jì)一致。同時(shí)用單片機(jī)ADC讀取并打印出來驗(yàn)證軟件換算公式是否正確。4.2 動(dòng)態(tài)調(diào)試與問題分析接上電機(jī)使用可調(diào)限流電源非常重要從小電流限幅如1A開始慢慢測(cè)試。問題1電機(jī)不轉(zhuǎn)有“噠噠”聲或振動(dòng)可能原因1換相順序錯(cuò)誤。這是最常見的問題。檢查霍爾傳感器接線順序A, B, C相是否與代碼中的換相表匹配。最簡單的調(diào)試方法用手緩慢轉(zhuǎn)動(dòng)電機(jī)通過串口打印出三個(gè)霍爾傳感器的值觀察其變化順序是否與數(shù)據(jù)手冊(cè)一致。然后對(duì)比代碼中的扇區(qū)判斷邏輯。可能原因2死區(qū)時(shí)間過長或過短。過長會(huì)導(dǎo)致有效電壓降低電機(jī)無力過短會(huì)導(dǎo)致上下管直通短路炸管。用示波器雙通道同時(shí)測(cè)量上下管的柵極驅(qū)動(dòng)波形確認(rèn)死區(qū)時(shí)間通常幾百納秒到1微秒??赡茉?電流環(huán)PID參數(shù)過于激進(jìn)。kp太大導(dǎo)致系統(tǒng)振蕩。嘗試大幅減小kp和ki值。問題2電機(jī)能轉(zhuǎn)但噪音大、抖動(dòng)劇烈可能原因1PWM頻率不合適。頻率太低如10kHz會(huì)有可聞噪音頻率太高如30kHz可能開關(guān)損耗過大驅(qū)動(dòng)芯片或MOS管發(fā)熱。20kHz是一個(gè)常用折中點(diǎn)??赡茉?速度環(huán)或電流環(huán)PID振蕩。觀察ADC采樣的電流波形或速度反饋值是否在目標(biāo)值附近規(guī)律性大幅波動(dòng)。如果是需要降低對(duì)應(yīng)環(huán)路的kp和ki增益??赡茉?電流采樣噪聲大。用示波器觀察運(yùn)放輸出到ADC輸入端的波形是否有毛刺。加強(qiáng)RC濾波在運(yùn)放輸出端加一個(gè)小電容到地或者在軟件中做滑動(dòng)平均濾波。問題3電機(jī)啟動(dòng)困難或啟動(dòng)時(shí)電流沖擊很大可能原因沒有啟動(dòng)算法。無刷電機(jī)在零速或低速時(shí)反電動(dòng)勢(shì)為零無法通過反電動(dòng)勢(shì)檢測(cè)位置。Demo中通常使用開環(huán)啟動(dòng)先強(qiáng)制給定一個(gè)換相序列和較小的PWM占空比讓電機(jī)緩慢同步旋轉(zhuǎn)起來達(dá)到一定速度后再切換到閉環(huán)霍爾或反電動(dòng)勢(shì)換相。檢查代碼中是否有開環(huán)啟動(dòng)階段以及切換到閉環(huán)的速度閾值和條件是否合適。問題4高速運(yùn)行時(shí)失控可能原因1ADC采樣時(shí)機(jī)不對(duì)。必須在PWM開通時(shí)間的中間點(diǎn)采樣電流此時(shí)電流紋波最小讀數(shù)最準(zhǔn)確。檢查定時(shí)器觸發(fā)ADC的配置??赡茉?電源電壓跌落。電機(jī)高速大負(fù)載運(yùn)行時(shí)瞬時(shí)電流很大可能導(dǎo)致電源電壓瞬間跌落造成單片機(jī)復(fù)位或驅(qū)動(dòng)芯片欠壓保護(hù)。檢查電源輸入電容是否足夠大建議至少470uF以上電源線是否夠粗??赡茉?軟件溢出或計(jì)算超時(shí)。確保所有中斷服務(wù)程序的執(zhí)行時(shí)間遠(yuǎn)小于中斷周期。特別是ADC中斷中的浮點(diǎn)運(yùn)算和PID計(jì)算如果耗時(shí)過長會(huì)影響下一個(gè)周期的控制??梢試L試將PID計(jì)算中的浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)Q格式來加速。4.3 使用工具輔助調(diào)試示波器是必須的至少雙通道用于觀測(cè)PWM、驅(qū)動(dòng)波形、電流采樣信號(hào)。邏輯分析儀對(duì)于調(diào)試霍爾傳感器信號(hào)、編碼器脈沖、換相邏輯非常直觀。串口打印在代碼關(guān)鍵位置添加printf通過串口發(fā)送到電腦實(shí)時(shí)監(jiān)控變量如目標(biāo)速度、實(shí)際速度、目標(biāo)電流、采樣電流、PID輸出、霍爾扇區(qū)等。這是最經(jīng)濟(jì)有效的調(diào)試手段。電流鉗如果想觀測(cè)電機(jī)相電流的真實(shí)波形需要用電流鉗配合示波器可以驗(yàn)證軟件重構(gòu)的相電流是否準(zhǔn)確。調(diào)試是一個(gè)耐心和邏輯分析的過程從電源、信號(hào)、邏輯到算法一層層剝離。這個(gè)Demo項(xiàng)目提供了一個(gè)完整的起點(diǎn)但真正的挑戰(zhàn)和樂趣正是在解決這些層出不窮的實(shí)際問題之中。希望這份詳細(xì)的原理圖和源碼能幫你更快地搭建起自己的電機(jī)控制平臺(tái)少走一些我當(dāng)年走過的彎路。本文還有配套的精品資源點(diǎn)擊獲取