控制入門:從硬件連接到PWM驅(qū)動(dòng)實(shí)踐)
1. 從零到一為什么選擇開環(huán)控制作為單片機(jī)小車的第一步如果你剛拿到一塊STM32開發(fā)板和一套小車底盤看著一堆電機(jī)、輪子和杜邦線腦子里第一個(gè)冒出來的想法多半是“怎么讓它動(dòng)起來”。很多教程會(huì)直接上PID閉環(huán)控制講得天花亂墜但對(duì)于一個(gè)初學(xué)者來說這就像還沒學(xué)會(huì)走路就想跑馬拉松。我的建議是別急我們先從“開環(huán)控制”開始。這不僅是讓小車動(dòng)起來的起點(diǎn)更是你理解整個(gè)嵌入式控制系統(tǒng)底層邏輯的基石。開環(huán)控制說白了就是“我說什么你就做什么至于你做沒做到位我不關(guān)心”。比如我讓電機(jī)以50%的占空比轉(zhuǎn)3秒它就轉(zhuǎn)3秒至于這3秒里小車是不是因?yàn)榈孛娌黄健㈦姵仉妷合陆刀芷丝刂破鞑还?。聽起來很“傻”?duì)吧但正是這種“傻”讓它成為了入門的最佳選擇。它剝離了復(fù)雜的反饋和糾錯(cuò)環(huán)節(jié)讓你能集中精力解決幾個(gè)核心問題如何用STM32的定時(shí)器產(chǎn)生PWM波驅(qū)動(dòng)電機(jī)如何通過程序邏輯控制小車的“前進(jìn)”、“后退”、“左轉(zhuǎn)”、“右轉(zhuǎn)”如何搭建一個(gè)最基礎(chǔ)的硬件系統(tǒng)這個(gè)過程你會(huì)親手打通從代碼到物理運(yùn)動(dòng)的整個(gè)鏈路。當(dāng)你第一次通過幾行代碼讓輪子按照你的意愿轉(zhuǎn)動(dòng)時(shí)那種“掌控感”是無與倫比的。這比一上來就面對(duì)誤差、積分、微分這些抽象概念要直觀得多。開環(huán)控制是“骨架”先把骨架搭起來后續(xù)的PID閉環(huán)控制、傳感器融合才是往上添加的“肌肉”和“神經(jīng)”。跳過骨架直接堆肌肉系統(tǒng)是立不起來的。所以咱們今天就踏踏實(shí)實(shí)從給STM32小車搭建這個(gè)最基礎(chǔ)的“開環(huán)骨架”開始。2. 硬件清單與核心電路連接別在第一步就“翻車”在寫代碼之前硬件連接是重中之重。很多新手在這里栽跟頭不是電機(jī)不轉(zhuǎn)就是單片機(jī)冒煙。我結(jié)合自己焊板子、調(diào)車的經(jīng)驗(yàn)給你捋一個(gè)清晰且避坑的連接清單。2.1 核心部件清單主控STM32F103C8T6俗稱“藍(lán)橋杯”或“最小系統(tǒng)板”。它性價(jià)比高資源足夠社區(qū)資料海量是學(xué)習(xí)的不二之選。電機(jī)驅(qū)動(dòng)模塊L298N或TB6612FNG。強(qiáng)烈推薦TB6612FNG原因有三效率高、發(fā)熱小、外圍電路簡(jiǎn)單。L298N是老將但需要外接散熱片邏輯電壓和驅(qū)動(dòng)電壓要處理好對(duì)新手不友好。TB6612是MOSFET橋更現(xiàn)代。直流減速電機(jī)帶編碼器的那種。雖然開環(huán)用不到編碼器反饋但買帶編碼器的電機(jī)是為未來升級(jí)閉環(huán)預(yù)留了硬件接口避免重復(fù)投資。通常工作電壓在3-6V注意與驅(qū)動(dòng)模塊匹配。電源這是最大的坑點(diǎn)。務(wù)必準(zhǔn)備兩路獨(dú)立電源一路給STM32開發(fā)板供電5V Micro USB或3.3V引腳供電。一路給電機(jī)驅(qū)動(dòng)模塊供電根據(jù)電機(jī)額定電壓選擇比如4節(jié)5號(hào)電池約6V或2節(jié)18650鋰電池約7.4V。嚴(yán)禁只用USB給整個(gè)系統(tǒng)供電USB的500mA電流帶不動(dòng)兩個(gè)電機(jī)瞬間就會(huì)導(dǎo)致電壓被拉低單片機(jī)不斷復(fù)位現(xiàn)象就是程序跑飛、電機(jī)抽搐。小車底盤四輪或兩輪差分驅(qū)動(dòng)底盤。四輪的后兩輪通常是萬向輪靠前兩輪差分驅(qū)動(dòng)決定方向和速度。杜邦線公對(duì)公、母對(duì)母、公對(duì)母都需要用于連接。2.2 電路連接詳解與避坑指南以TB6612FNG驅(qū)動(dòng)模塊為例連接STM32F103C8T6。一個(gè)TB6612可以驅(qū)動(dòng)兩個(gè)電機(jī)我們假設(shè)控制小車的左輪電機(jī)MOTOR A和右輪電機(jī)MOTOR B。注意接線前確保所有電源處于斷開狀態(tài)養(yǎng)成好習(xí)慣。電源連接關(guān)鍵VM引腳接電機(jī)驅(qū)動(dòng)電源正極如電池盒的6V。這是電機(jī)的“力氣”來源。VCC引腳接邏輯電源正極接STM32的3.3V或5V輸出引腳。這是給驅(qū)動(dòng)芯片內(nèi)部邏輯電路供電的必須接。GND引腳共地共地共地將電池的負(fù)極、STM32的GND、TB6612的GND三者用杜邦線全部連接在一起。這是保證信號(hào)基準(zhǔn)一致的基礎(chǔ)否則控制信號(hào)會(huì)亂。電機(jī)輸出A01和A02引腳分別接左輪電機(jī)的兩根線。B01和B02引腳分別接右輪電機(jī)的兩根線。如果電機(jī)轉(zhuǎn)向與預(yù)期相反交換這兩根線即可。STM32控制信號(hào)連接核心 TB6612每個(gè)電機(jī)需要3個(gè)控制信號(hào)AIN1/AIN2方向、PWMA速度PWM。我們將其連接到STM32的通用定時(shí)器如TIM2的通道上以實(shí)現(xiàn)硬件PWM輸出。左輪電機(jī)AIN1- STM32PA0(TIM2_CH1)AIN2- STM32PA1(TIM2_CH2)PWMA- STM32PA2(TIM2_CH3)右輪電機(jī)BIN1- STM32PA6(TIM3_CH1)BIN2- STM32PA7(TIM3_CH2)PWMB- STM32PB0(TIM3_CH3)STBY待機(jī)引腳直接接VCC邏輯電源讓驅(qū)動(dòng)模塊始終處于工作狀態(tài)。這里為什么選擇TIM2和TIM3因?yàn)镾TM32F103C8T6的通用定時(shí)器TIM2、TIM3、TIM4都支持4路PWM輸出且引腳分布方便布線。你也可以根據(jù)自己板子的引腳定義靈活選擇但原則是一個(gè)電機(jī)的方向和PWM信號(hào)盡量來自同一個(gè)定時(shí)器方便程序管理。2.3 上電前最后檢查電壓確認(rèn)用萬用表量一下VM和GND之間的電壓是否在電機(jī)額定電壓附近比如6V左右VCC和GND之間是否是3.3V或5V短路檢查快速目視檢查所有杜邦線頭有沒有金屬部分裸露接觸導(dǎo)致短路的風(fēng)險(xiǎn)。連接牢固度輕輕拉扯一下杜邦線確保都插緊了。接觸不良是調(diào)試中最詭異的問題來源。硬件連接就像蓋房子的地基這里扎實(shí)了后面的軟件調(diào)試才能順風(fēng)順?biāo)?. STM32定時(shí)器與PWM配置讓電機(jī)“聽令行事”的核心硬件通了現(xiàn)在要讓STM32發(fā)出正確的控制信號(hào)。開環(huán)控制的核心就是通過PWM脈沖寬度調(diào)制波來控制電機(jī)的平均電壓從而控制轉(zhuǎn)速。PWM的頻率和占空比是兩個(gè)關(guān)鍵參數(shù)。3.1 PWM頻率的選擇不是越高越好對(duì)于普通的直流減速電機(jī)PWM頻率通常在1kHz到20kHz之間。頻率太低如幾十Hz你會(huì)聽到電機(jī)發(fā)出刺耳的嘯叫聲這是脈沖間隔太長(zhǎng)電機(jī)線圈在不斷地“啟動(dòng)-停止”造成的對(duì)電機(jī)壽命和控制平滑度都不好。頻率太高如上百kHz雖然電機(jī)聲音會(huì)變得很安靜人耳聽不到但會(huì)對(duì)電機(jī)驅(qū)動(dòng)模塊的開關(guān)損耗提出更高要求有些低端驅(qū)動(dòng)芯片可能響應(yīng)不過來導(dǎo)致實(shí)際效果變差。經(jīng)驗(yàn)值我通常選擇5kHz到10kHz。這個(gè)區(qū)間對(duì)于TB6612和L298N都工作良好電機(jī)運(yùn)行平穩(wěn)噪音在可接受范圍內(nèi)。我們以10kHz為例進(jìn)行配置。3.2 使用CubeMX進(jìn)行圖形化配置HAL庫對(duì)于初學(xué)者我強(qiáng)烈推薦使用STM32CubeMX工具配合HAL庫。它通過圖形界面配置時(shí)鐘和引腳自動(dòng)生成初始化代碼能避免大量底層寄存器操作的錯(cuò)誤。時(shí)鐘樹配置確保系統(tǒng)時(shí)鐘SYSCLK被正確設(shè)置為72MHzSTM32F103的最高主頻。這是計(jì)算定時(shí)器計(jì)數(shù)值的基準(zhǔn)。定時(shí)器配置以TIM2為例在Pinout視圖找到PA0、PA1、PA2分別設(shè)置為TIM2_CH1、TIM2_CH2、TIM2_CH3。在左側(cè)配置欄找到TIM2。Clock Source選擇Internal Clock。Parameter Settings選項(xiàng)卡Prescaler預(yù)分頻器PSC設(shè)置為71。定時(shí)器時(shí)鐘 72MHz / (711) 1MHz。Counter ModeUp向上計(jì)數(shù)。Counter Period自動(dòng)重裝載值A(chǔ)RR設(shè)置為99。PWM頻率 定時(shí)器時(shí)鐘 / ((PSC1) * (ARR1)) 1MHz / (100) 10kHz。公式一定要理解Fpwm Fclk / ((PSC1) * (ARR1))。auto-reload preloadEnable使能自動(dòng)重裝載。切換到PWM Generation CHx對(duì)應(yīng)通道子選項(xiàng)卡ModePWM mode 1。Pulse初始脈沖值先設(shè)為0。這個(gè)值就是后續(xù)控制占空比的關(guān)鍵范圍是0到ARR即99。占空比 Pulse / (ARR1)。Fast ModeDisable。CH PolarityHigh。這意味著當(dāng)計(jì)數(shù)器小于Pulse值時(shí)輸出高電平。這個(gè)極性要和你的驅(qū)動(dòng)模塊邏輯匹配。TB6612一般是高電平有效。生成代碼在Project Manager里設(shè)置好工程名、路徑、IDE如MDK-ARM V5然后生成代碼。3.3 在代碼中操控PWM與方向CubeMX生成的代碼已經(jīng)完成了定時(shí)器和GPIO的初始化。我們只需要在main.c的用戶代碼區(qū)調(diào)用HAL庫函數(shù)即可。// 在main函數(shù)初始化部分之后啟動(dòng)PWM輸出 HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1); // 啟動(dòng)TIM2 CH1 (PA0, AIN1的PWM? 不這里注意) HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_2); // 啟動(dòng)TIM2 CH2 (PA1, AIN2的PWM? 不這里注意) HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_3); // 啟動(dòng)TIM2 CH3 (PA2, PWMA) // 同理啟動(dòng)TIM3的各個(gè)通道 HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_3);這里有一個(gè)非常重要的細(xì)節(jié)我們連接時(shí)AIN1/AIN2、BIN1/BIN2接的是普通GPIO口雖然我們用了定時(shí)器通道引腳但可以配置為純輸出模式而PWMA/PWMB接的才是真正的PWM輸出引腳。在CubeMX里PA0和PA1應(yīng)該配置為GPIO_Output而不是TIM2_CH1/2。只有PA2PWMA需要配置為TIM2_CH3的PWM模式。所以正確的做法是PA0(AIN1),PA1(AIN2) 配置為GPIO Output。PA2(PWMA) 配置為TIM2_CH3的PWM Generation。在代碼中通過HAL_GPIO_WritePin來控制PA0和PA1的高低電平組合決定電機(jī)方向通過__HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_3, pulse)來改變PA2的PWM占空比控制電機(jī)速度。方向控制邏輯以左輪為例AIN1 (PA0)AIN2 (PA1)電機(jī)狀態(tài)10正轉(zhuǎn)01反轉(zhuǎn)00剎車停止11剎車停止我們可以封裝一個(gè)函數(shù)來控制一個(gè)電機(jī)// 控制左輪電機(jī) void Left_Motor_Control(int16_t speed) // speed范圍-100 ~ 100 { if(speed 0) { HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_SET); // 正轉(zhuǎn) HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_3, speed); // 假設(shè)ARR99 speed就是占空比 } else if(speed 0) { HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET); // 反轉(zhuǎn) HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_SET); __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_3, -speed); } else { HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GPIO_PIN_RESET); // 剎車 HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_3, 0); } }對(duì)于右輪電機(jī)同理封裝Right_Motor_Control函數(shù)操作BIN1、BIN2和TIM3_CH3。4. 基礎(chǔ)運(yùn)動(dòng)函數(shù)封裝與調(diào)試讓小車“走”起來有了單個(gè)電機(jī)的控制函數(shù)我們就可以組合出小車的基本動(dòng)作了。封裝這些動(dòng)作函數(shù)能讓主程序邏輯變得非常清晰。4.1 運(yùn)動(dòng)函數(shù)封裝// 小車運(yùn)動(dòng)函數(shù)封裝 void Car_Stop(void) { Left_Motor_Control(0); Right_Motor_Control(0); } void Car_Forward(uint8_t speed) { Left_Motor_Control(speed); Right_Motor_Control(speed); } void Car_Backward(uint8_t speed) { Left_Motor_Control(-speed); Right_Motor_Control(-speed); } void Car_TurnLeft(uint8_t speed) // 原地左轉(zhuǎn)左輪后退右輪前進(jìn) { Left_Motor_Control(-speed); Right_Motor_Control(speed); } void Car_TurnRight(uint8_t speed) // 原地右轉(zhuǎn) { Left_Motor_Control(speed); Right_Motor_Control(-speed); } void Car_SpinLeft(uint8_t speed) // 左輪不動(dòng)或慢速右輪快速前進(jìn)實(shí)現(xiàn)弧線左轉(zhuǎn) { Left_Motor_Control(speed / 3); // 比例可調(diào) Right_Motor_Control(speed); } void Car_SpinRight(uint8_t speed) // 弧線右轉(zhuǎn) { Left_Motor_Control(speed); Right_Motor_Control(speed / 3); }4.2 上電調(diào)試與常見問題排查將代碼編譯下載到STM32后先別急著讓小車跑。按步驟調(diào)試靜態(tài)測(cè)試車輪懸空在main函數(shù)的while(1)循環(huán)里寫一個(gè)簡(jiǎn)單的測(cè)試序列。while (1) { Car_Forward(50); // 50%速度前進(jìn) HAL_Delay(2000); Car_Stop(); HAL_Delay(500); Car_TurnLeft(60); // 原地左轉(zhuǎn) HAL_Delay(1000); Car_Stop(); HAL_Delay(2000); // ... 其他動(dòng)作測(cè)試 }觀察車輪是否按預(yù)期轉(zhuǎn)動(dòng)。如果不動(dòng)按以下順序排查電源指示燈STM32板和驅(qū)動(dòng)板上的電源LED亮了嗎信號(hào)測(cè)量用萬用表電壓檔或示波器如果有測(cè)量PWMA引腳對(duì)地電壓。在電機(jī)轉(zhuǎn)動(dòng)時(shí)你應(yīng)該能看到一個(gè)平均電壓比如3.3V * 50% ≈ 1.65V。用萬用表頻率檔可以粗略看PWM頻率。方向信號(hào)測(cè)量AIN1和AIN2的電壓是否根據(jù)代碼變化0V或3.3V。電機(jī)驅(qū)動(dòng)輸出測(cè)量AO1和AO2之間的電壓。當(dāng)電機(jī)轉(zhuǎn)動(dòng)時(shí)這里應(yīng)該有接近VM電源電壓的PWM輸出。注意安全避免短路。代碼檢查確認(rèn)Left_Motor_Control函數(shù)里的引腳名和CubeMX配置的一致。確認(rèn)__HAL_TIM_SET_COMPARE函數(shù)的第一個(gè)參數(shù)定時(shí)器句柄正確。動(dòng)態(tài)測(cè)試小車落地靜態(tài)測(cè)試通過后將小車放在空曠平整的地面上遠(yuǎn)離桌子邊緣。再次運(yùn)行測(cè)試程序。觀察小車運(yùn)動(dòng)軌跡。典型問題小車不走直線而是偏向一邊。這是100%會(huì)出現(xiàn)的現(xiàn)象也是開環(huán)控制的固有缺陷。原因有兩個(gè)電機(jī)差異性即使是同一批次的電機(jī)其空載轉(zhuǎn)速、負(fù)載特性也有微小差異。車輪安裝與摩擦車輪安裝的同心度、與地面的摩擦力不可能完全一致。開環(huán)階段的“土辦法”校準(zhǔn)我們無法感知誤差但可以“預(yù)補(bǔ)償”。通過實(shí)驗(yàn)找到一個(gè)偏差值。比如你發(fā)現(xiàn)小車總是向右偏那么可以讓左輪的速度略高于右輪。void Car_Forward_Adjusted(uint8_t speed) { uint8_t left_adj speed 5; // 左輪增加5個(gè)“單位”的補(bǔ)償 uint8_t right_adj speed; if(left_adj 100) left_adj 100; // 防止溢出 Left_Motor_Control(left_adj); Right_Motor_Control(right_adj); }這個(gè)補(bǔ)償值需要你在實(shí)際場(chǎng)地上反復(fù)測(cè)試獲得。這就是開環(huán)控制基于事先的“經(jīng)驗(yàn)”或“校準(zhǔn)”來發(fā)指令無法應(yīng)對(duì)運(yùn)行中的新變化。5. 構(gòu)建開環(huán)運(yùn)動(dòng)序列設(shè)計(jì)你的第一條“巡線”開環(huán)控制并非一無是處。在已知的、結(jié)構(gòu)化的環(huán)境中我們可以通過精心設(shè)計(jì)的時(shí)序控制讓小車完成一些固定任務(wù)。最經(jīng)典的例子就是讓小車走一個(gè)正方形軌跡。5.1 “走正方形”程序設(shè)計(jì)與陷阱思路很簡(jiǎn)單前進(jìn)一段距離 - 右轉(zhuǎn)90度 - 前進(jìn) - 右轉(zhuǎn)... 循環(huán)4次。但這里的關(guān)鍵是“一段距離”和“90度”如何用時(shí)間和速度來定義void Car_Run_Square(void) { uint8_t side_speed 60; uint16_t forward_time 1000; // 前進(jìn)時(shí)間單位ms uint16_t turn_time 500; // 旋轉(zhuǎn)90度時(shí)間單位ms for(int i 0; i 4; i) { Car_Forward(side_speed); HAL_Delay(forward_time); // 前進(jìn) Car_Stop(); HAL_Delay(100); // 停頓一下讓動(dòng)作更清晰 Car_TurnRight(side_speed); HAL_Delay(turn_time); // 右轉(zhuǎn) Car_Stop(); HAL_Delay(100); } Car_Stop(); }你會(huì)發(fā)現(xiàn)這個(gè)小車畫出來的絕對(duì)不是一個(gè)標(biāo)準(zhǔn)的正方形可能是一個(gè)歪歪扭扭的平行四邊形甚至是個(gè)螺旋形。原因如下速度-時(shí)間與距離的非線性Car_Forward(side_speed)指令發(fā)出后小車從靜止加速到穩(wěn)定速度需要時(shí)間停止時(shí)也有減速過程。HAL_Delay(forward_time)延遲的這1秒鐘里包含了加速和減速段真正以穩(wěn)定速度前進(jìn)的距離小于速度 * 時(shí)間。地面摩擦影響不同地面的摩擦系數(shù)不同加速和減速時(shí)間也不同。轉(zhuǎn)彎角度的不確定性Car_TurnRight是差速轉(zhuǎn)彎其角速度受電機(jī)性能、電池電壓、地面摩擦等多重影響。HAL_Delay(turn_time)延遲0.5秒轉(zhuǎn)過的角度不一定是90度。5.2 從“開環(huán)”到“開環(huán)”的改進(jìn)思路純粹的延時(shí)開環(huán)控制魯棒性極差。為了讓它更可靠一點(diǎn)我們可以引入一些非常簡(jiǎn)單的“準(zhǔn)反饋”或更精細(xì)的控制模型這可以看作是從純開環(huán)到閉環(huán)的一個(gè)過渡練習(xí)。思路一分段速度控制。模仿工業(yè)上的“S曲線加減速”讓啟動(dòng)和停止更平滑減少打滑提高時(shí)間-距離關(guān)系的可重復(fù)性。void Car_Forward_Smooth(uint8_t target_speed, uint16_t distance_time) { // 加速段 for(int s 30; s target_speed; s5) { Car_Forward(s); HAL_Delay(20); // 每20ms增加一點(diǎn)速度 } // 勻速段 Car_Forward(target_speed); HAL_Delay(distance_time); // 減速段 for(int s target_speed; s 30; s-5) { Car_Forward(s); HAL_Delay(20); } Car_Stop(); }通過勻加速/減速電機(jī)負(fù)載變化更平緩電池電壓波動(dòng)更小兩次執(zhí)行的一致性會(huì)稍好一些。思路二利用簡(jiǎn)單的傳感器進(jìn)行事件觸發(fā)。比如在小車底盤前端安裝一個(gè)微動(dòng)開關(guān)作為“碰撞傳感器”。我們可以寫一個(gè)程序“一直前進(jìn)直到碰到障礙物開關(guān)被壓下然后后退一點(diǎn)右轉(zhuǎn)90度繼續(xù)前進(jìn)”。這就構(gòu)成了一個(gè)非常初級(jí)的“隨機(jī)避障”行為。雖然它沒有測(cè)量距離只是感知了“碰撞”這個(gè)事件但已經(jīng)引入了外部反饋系統(tǒng)的智能性上了一個(gè)臺(tái)階。這需要你學(xué)習(xí)STM32的外部中斷EXTI編程。5.3 開環(huán)控制的價(jià)值總結(jié)通過以上實(shí)踐你應(yīng)該深刻體會(huì)到開環(huán)控制的局限性它無法應(yīng)對(duì)擾動(dòng)精度差。但它的價(jià)值同樣巨大驗(yàn)證了硬件系統(tǒng)電機(jī)、驅(qū)動(dòng)、電源、單片機(jī)連接全部正確。掌握了最底層的控制API你知道了如何讓輪子正轉(zhuǎn)、反轉(zhuǎn)、變速。建立了系統(tǒng)性的調(diào)試思維從電源、信號(hào)、到軟件邏輯的逐層排查。直觀理解了“為什么需要閉環(huán)”你親眼看到了小車跑不直、轉(zhuǎn)彎不準(zhǔn)這為你后續(xù)學(xué)習(xí)編碼器測(cè)速、PID控制提供了最強(qiáng)烈的學(xué)習(xí)動(dòng)機(jī)——你知道了你要解決的問題到底是什么。開環(huán)控制是起點(diǎn)而不是終點(diǎn)。它就像學(xué)騎自行車時(shí)的輔助輪幫你建立起平衡感和操控感但最終你要拆掉它去面對(duì)更真實(shí)、更復(fù)雜的路況。當(dāng)你成功實(shí)現(xiàn)小車的開環(huán)控制后下一步自然就是為電機(jī)裝上編碼器開始探索“閉環(huán)控制”的世界那時(shí)你的小車才能真正做到“指哪打哪”抵抗各種外部干擾。