速與電機(jī)控制實(shí)戰(zhàn))
簡(jiǎn)介這份資源面向嵌入式初學(xué)者與電子工程相關(guān)專業(yè)學(xué)生提供一套基于STM32F103C6與Proteus的智能小車仿真工程用于在無實(shí)物硬件的情況下驗(yàn)證電機(jī)控制代碼與電路設(shè)計(jì)。項(xiàng)目通過按鍵控制兩個(gè)直流電機(jī)的正反轉(zhuǎn)并借助PWM調(diào)節(jié)轉(zhuǎn)速實(shí)現(xiàn)小車前進(jìn)、后退、轉(zhuǎn)彎與加減速涵蓋嵌入式編程、電機(jī)驅(qū)動(dòng)與硬件仿真等知識(shí)點(diǎn)。壓縮包共155個(gè)文件、約6.08MB以C源文件與頭文件、Keil MDK-ARM工程文件、Proteus工程及編譯產(chǎn)物為主另含HAL庫驅(qū)動(dòng)、HEX固件與工程備份目錄結(jié)構(gòu)完整可直接打開仿真與調(diào)試。已有10236人學(xué)習(xí)下載適合作為STM32入門實(shí)踐與課程設(shè)計(jì)的參考范例幫助讀者理解外設(shè)配置、PWM調(diào)速邏輯及軟硬件聯(lián)調(diào)思路為后續(xù)機(jī)器人項(xiàng)目打下基礎(chǔ)。1. 從“代碼能跑但車不動(dòng)”說起這套 STM32 Proteus 智能小車仿真到底解決什么問題很多同學(xué)做智能小車第一步就卡在硬件上電機(jī)驅(qū)動(dòng)模塊買回來焊好上電一跑輪子要么不轉(zhuǎn)要么只往一個(gè)方向轉(zhuǎn)調(diào)了兩天發(fā)現(xiàn)是 PWM 通道映射錯(cuò)了。更麻煩的是板子燒了、電機(jī)堵轉(zhuǎn)、電池沒電這些物理故障排查起來成本極高。這套基于 STM32 和 Proteus 的智能小車仿真方案核心價(jià)值就是把“硬件調(diào)試”前移到“軟件仿真”階段——在 Proteus 里把電機(jī)、傳感器、驅(qū)動(dòng)芯片全部虛擬化代碼先在仿真環(huán)境里跑通邏輯再上真實(shí)硬件。它適合正在做嵌入式課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)的學(xué)生也適合需要快速驗(yàn)證電機(jī)控制邏輯的從業(yè)者。關(guān)鍵詞 stm32、電機(jī)、proteus、仿真、智能小車本質(zhì)上對(duì)應(yīng)的是“控制算法 虛擬外設(shè) 可視化驗(yàn)證”這條完整鏈路。2. 需求拆解與技術(shù)選型為什么是 STM32 Proteus 而不是別的組合2.1 功能需求先立住小車到底要跑出哪幾種行為做任何仿真項(xiàng)目第一步不是打開軟件而是把“車要干什么”寫成可驗(yàn)收的條目。這套方案里智能小車的核心行為通常拆成四類直行、后退、左轉(zhuǎn)、右轉(zhuǎn)進(jìn)階一點(diǎn)加上調(diào)速和循跡。直行和后退考驗(yàn)的是雙電機(jī)同向驅(qū)動(dòng)的對(duì)稱性左右轉(zhuǎn)考驗(yàn)的是差速控制——一側(cè)正轉(zhuǎn)、一側(cè)反轉(zhuǎn)或停轉(zhuǎn)。調(diào)速則要求 PWM 占空比可調(diào)循跡需要紅外傳感器反饋參與決策。我一般會(huì)把這些行為寫成一張行為-引腳-預(yù)期表先不寫代碼先把“哪個(gè)行為對(duì)應(yīng)哪組引腳電平”定死。比如左輪電機(jī)接 TIM 的哪個(gè)通道、右輪接哪個(gè)通道方向控制引腳是高電平正轉(zhuǎn)還是低電平正轉(zhuǎn)。這張表定不下來后面代碼寫得再漂亮也是玄學(xué)。很多翻車案例的根源就是行為定義模糊仿真里看著輪子轉(zhuǎn)了實(shí)際方向是反的上硬件才發(fā)現(xiàn)。從驗(yàn)收角度每個(gè)行為都要有明確的觀察指標(biāo)輪子轉(zhuǎn)向、轉(zhuǎn)速快慢、停止是否徹底。仿真環(huán)境的好處是這些指標(biāo)可以直接在 Proteus 的電機(jī)模型上看轉(zhuǎn)速和方向不用拿手去摸輪子。2.2 技術(shù)選型對(duì)比STM32 仿真和 51 仿真差在哪市面上單片機(jī)仿真方案不少51 Proteus 是最常見的入門組合但為什么這套方案選 STM32原因很實(shí)際STM32 的定時(shí)器資源更豐富一個(gè)通用定時(shí)器就能輸出多路互補(bǔ) PWM做雙電機(jī)差速控制時(shí)通道夠用而 51 的定時(shí)器數(shù)量有限做兩路獨(dú)立 PWM 往往要軟件模擬仿真里時(shí)序容易失真。另外 STM32 的 GPIO 復(fù)用功能清晰方向控制和 PWM 輸出可以分到不同端口代碼結(jié)構(gòu)更干凈。Proteus 這邊關(guān)鍵是要確認(rèn)元件庫里有對(duì)應(yīng)的 STM32 模型和電機(jī)驅(qū)動(dòng)模型。通常的做法是選一個(gè)通用 L298N 驅(qū)動(dòng)模型加兩個(gè)直流電機(jī)模型STM32 選一個(gè)引腳數(shù)夠用的型號(hào)即可不必追求和實(shí)物完全同型號(hào)——仿真驗(yàn)證的是控制邏輯不是芯片本身。這里有個(gè)血淚經(jīng)驗(yàn)Proteus 里 STM32 模型的時(shí)鐘配置要和代碼里的系統(tǒng)時(shí)鐘初始化對(duì)上否則 PWM 頻率會(huì)偏得離譜電機(jī)轉(zhuǎn)速看著就不對(duì)勁。提示選型階段就把“仿真能驗(yàn)證什么、不能驗(yàn)證什么”寫清楚。仿真能驗(yàn)證引腳邏輯、PWM 占空比、狀態(tài)機(jī)切換不能驗(yàn)證真實(shí)電流、電機(jī)堵轉(zhuǎn)、電源波動(dòng)。別指望仿真替代全部硬件測(cè)試。2.3 開發(fā)環(huán)境與仿真環(huán)境的邊界劃分這套方案里代碼開發(fā)和仿真驗(yàn)證是兩條并行但交匯的線。代碼在 Keil 或 STM32CubeIDE 里寫編譯出 hex 文件Proteus 負(fù)責(zé)加載 hex、虛擬外設(shè)、可視化運(yùn)行。邊界在于所有和“物理量”相關(guān)的參數(shù)比如電機(jī)啟動(dòng)電壓、PWM 頻率在仿真里用理想值在代碼里留成宏定義方便上硬件時(shí)改。我一般會(huì)把電機(jī)控制相關(guān)的宏單獨(dú)放一個(gè)頭文件比如MOTOR_PWM_FREQ、LEFT_FORWARD_PIN這類仿真和實(shí)物共用一套邏輯只改宏。這樣仿真跑通后換硬件只需要改引腳定義和頻率參數(shù)控制流程一行不動(dòng)。這個(gè)習(xí)慣能省掉大量“仿真對(duì)了實(shí)物不對(duì)”的排查時(shí)間。3. 總體架構(gòu)設(shè)計(jì)三層結(jié)構(gòu)與四個(gè)模塊的職責(zé)劃分3.1 分層思路應(yīng)用層、控制層、驅(qū)動(dòng)層各管什么這套小車的軟件架構(gòu)按三層劃分目的是讓“想干什么”和“怎么讓電機(jī)轉(zhuǎn)”徹底分開。應(yīng)用層負(fù)責(zé)行為決策比如收到“左轉(zhuǎn)”指令后決定左右輪的目標(biāo)狀態(tài)控制層負(fù)責(zé)把目標(biāo)狀態(tài)翻譯成 PWM 占空比和方向電平驅(qū)動(dòng)層直接操作寄存器和定時(shí)器輸出波形。這樣分的好處是循跡邏輯以后要加只動(dòng)應(yīng)用層換電機(jī)驅(qū)動(dòng)芯片只動(dòng)驅(qū)動(dòng)層。中間控制層保持穩(wěn)定。很多同學(xué)把所有邏輯塞進(jìn) main 的 while 循環(huán)里加一個(gè)功能就牽一發(fā)動(dòng)全身最后自己都看不懂。分層不是為了好看是為了改需求時(shí)不崩潰。四個(gè)核心模塊分別是電機(jī)驅(qū)動(dòng)模塊、PWM 調(diào)速模塊、方向控制模塊、行為調(diào)度模塊。前三個(gè)屬于控制層和驅(qū)動(dòng)層最后一個(gè)屬于應(yīng)用層。模塊之間通過函數(shù)接口通信不直接互相改全局變量。3.2 模塊職責(zé)與接口約定電機(jī)驅(qū)動(dòng)模塊對(duì)外只暴露兩個(gè)函數(shù)初始化Motor_Init()和設(shè)置單側(cè)電機(jī)狀態(tài)Motor_Set(side, dir, duty)。side 區(qū)分左右dir 區(qū)分正反轉(zhuǎn)和停止duty 是 0 到 100 的占空比。PWM 調(diào)速模塊內(nèi)部管理定時(shí)器通道對(duì)外只給“設(shè)置某通道占空比”的接口。方向控制模塊管理 GPIO對(duì)外給“設(shè)置某側(cè)方向”的接口。行為調(diào)度模塊根據(jù)當(dāng)前指令調(diào)用這些接口。接口約定的關(guān)鍵是參數(shù)范圍要卡死。duty 超過 100 要截?cái)郿ir 只接受枚舉值side 只接受左右。這些檢查放在接口入口仿真階段就能暴露調(diào)用錯(cuò)誤而不是等電機(jī)亂轉(zhuǎn)再回頭找。我見過太多項(xiàng)目因?yàn)橐粋€(gè)越界的占空比參數(shù)仿真里電機(jī)直接不轉(zhuǎn)查了半天以為是定時(shí)器配置問題。3.3 數(shù)據(jù)流從指令到輪子轉(zhuǎn)動(dòng)的完整鏈路一次“左轉(zhuǎn)”指令的完整數(shù)據(jù)流是這樣的行為調(diào)度模塊收到左轉(zhuǎn)請(qǐng)求計(jì)算出左輪反轉(zhuǎn)、右輪正轉(zhuǎn)各自的目標(biāo)占空比比如 60%調(diào)用Motor_Set(LEFT, REVERSE, 60)和Motor_Set(RIGHT, FORWARD, 60)電機(jī)驅(qū)動(dòng)模塊先設(shè)置方向 GPIO再調(diào)用 PWM 模塊設(shè)置對(duì)應(yīng)通道占空比PWM 模塊寫定時(shí)器比較寄存器Proteus 里的電機(jī)模型根據(jù)引腳電平和 PWM 波形改變轉(zhuǎn)速和方向。這條鏈路里任何一環(huán)參數(shù)錯(cuò)了現(xiàn)象都能在仿真里直接看到方向反了看輪子轉(zhuǎn)向轉(zhuǎn)速不對(duì)看占空比完全不轉(zhuǎn)看定時(shí)器是否使能。數(shù)據(jù)流清晰排查就有路徑不用靠猜。4. 關(guān)鍵模塊實(shí)現(xiàn)PWM 調(diào)速、方向控制與行為調(diào)度的代碼落地4.1 PWM 調(diào)速模塊定時(shí)器通道配置與占空比映射PWM 是電機(jī)調(diào)速的核心STM32 上通常用通用定時(shí)器的輸出比較模式。下面這段初始化代碼以某個(gè)通用定時(shí)器為例配置兩個(gè)通道輸出 PWM頻率和占空比分辨率按電機(jī)驅(qū)動(dòng)的常見需求設(shè)定。// PWM 初始化定時(shí)器計(jì)數(shù)頻率 72MHz預(yù)分頻后 1MHz周期 1000 - 1kHz PWM void PWM_Init(void) { // 使能定時(shí)器和 GPIO 時(shí)鐘略按實(shí)際端口補(bǔ) TIM_TimeBaseInitTypeDef tim; tim.TIM_Prescaler 71; // 72MHz / (711) 1MHz 計(jì)數(shù)頻率 tim.TIM_Period 999; // 1MHz / 1000 1kHz PWM 頻率 tim.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, tim); TIM_OCInitTypeDef oc; oc.TIM_OCMode TIM_OCMode_PWM1; oc.TIM_OutputState TIM_OutputState_Enable; oc.TIM_Pulse 0; // 初始占空比 0 oc.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM3, oc); // 左輪通道 TIM_OC2Init(TIM3, oc); // 右輪通道 TIM_Cmd(TIM3, ENABLE); } // 設(shè)置占空比duty 范圍 0~100 void PWM_SetDuty(uint8_t channel, uint8_t duty) { if (duty 100) duty 100; // 入口截?cái)喾乐乖浇?uint16_t pulse duty * 10; // 周期 1000100% 對(duì)應(yīng) 1000 if (channel 0) TIM_SetCompare1(TIM3, pulse); else TIM_SetCompare2(TIM3, pulse); }這段代碼的關(guān)鍵參數(shù)是預(yù)分頻和周期72MHz 經(jīng) 71 分頻得到 1MHz 計(jì)數(shù)頻率周期 999 對(duì)應(yīng) 1kHz PWM。1kHz 對(duì)直流電機(jī)驅(qū)動(dòng)是常見值太低會(huì)有可聽噪聲太高部分驅(qū)動(dòng)芯片響應(yīng)跟不上。占空比映射用duty * 10因?yàn)橹芷谑?1000100% 對(duì)應(yīng)比較值 1000。入口的截?cái)鄼z查是后悔藥防止上層傳錯(cuò)參數(shù)導(dǎo)致比較值溢出。仿真里驗(yàn)證這段代碼看的是 Proteus 電機(jī)模型上的轉(zhuǎn)速是否隨 duty 線性變化。如果 duty 從 0 加到 100 電機(jī)轉(zhuǎn)速不變先查定時(shí)器是否真的使能、通道是否配置成 PWM 模式而不是懷疑電機(jī)模型。4.2 方向控制模塊GPIO 電平與電機(jī)正反轉(zhuǎn)的對(duì)應(yīng)關(guān)系方向控制比 PWM 簡(jiǎn)單但最容易翻車。L298N 這類驅(qū)動(dòng)芯片每個(gè)電機(jī)有兩個(gè)方向控制引腳一高一低正轉(zhuǎn)一低一高反轉(zhuǎn)兩個(gè)都低是停止。代碼里要把這個(gè)真值表寫死并且和接線一一對(duì)應(yīng)。typedef enum { MOTOR_STOP 0, MOTOR_FORWARD, MOTOR_REVERSE } MotorDir; // 設(shè)置單側(cè)電機(jī)方向side: 0 左 1 右 void Motor_SetDir(uint8_t side, MotorDir dir) { if (side 0) { switch (dir) { case MOTOR_FORWARD: GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOA, GPIO_Pin_1); break; case MOTOR_REVERSE: GPIO_ResetBits(GPIOA, GPIO_Pin_0); GPIO_SetBits(GPIOA, GPIO_Pin_1); break; default: GPIO_ResetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOA, GPIO_Pin_1); break; } } else { // 右輪同理換端口和引腳 } }這段代碼的設(shè)計(jì)說明只有一句真值表必須和 Proteus 里的接線完全一致。仿真里如果左轉(zhuǎn)變成右轉(zhuǎn)八成是某一側(cè)的 FORWARD 和 REVERSE 電平寫反了或者 Proteus 里電機(jī)模型的接線極性接反了。排查方法很直接單獨(dú)給一側(cè)發(fā)正轉(zhuǎn)指令看輪子轉(zhuǎn)向再對(duì)照真值表。注意方向切換前先把占空比降到 0再改方向最后恢復(fù)占空比。直接帶載換向在仿真里可能看不出問題但上硬件會(huì)沖擊驅(qū)動(dòng)芯片。這個(gè)習(xí)慣從仿真階段就養(yǎng)成。4.3 行為調(diào)度模塊直行、轉(zhuǎn)向、停止的狀態(tài)機(jī)寫法行為調(diào)度用簡(jiǎn)單的狀態(tài)機(jī)就夠了不需要上 RTOS。每個(gè)行為對(duì)應(yīng)一個(gè)狀態(tài)狀態(tài)里設(shè)置左右輪的目標(biāo)方向和占空比然后等下一個(gè)指令。typedef enum { ACT_STOP, ACT_FORWARD, ACT_BACKWARD, ACT_TURN_LEFT, ACT_TURN_RIGHT } Action; void Action_Execute(Action act) { switch (act) { case ACT_FORWARD: Motor_SetDir(0, MOTOR_FORWARD); Motor_SetDir(1, MOTOR_FORWARD); PWM_SetDuty(0, 60); PWM_SetDuty(1, 60); break; case ACT_TURN_LEFT: Motor_SetDir(0, MOTOR_REVERSE); Motor_SetDir(1, MOTOR_FORWARD); PWM_SetDuty(0, 50); PWM_SetDuty(1, 50); break; case ACT_STOP: PWM_SetDuty(0, 0); PWM_SetDuty(1, 0); Motor_SetDir(0, MOTOR_STOP); Motor_SetDir(1, MOTOR_STOP); break; default: break; } }左轉(zhuǎn)用左輪反轉(zhuǎn)、右輪正轉(zhuǎn)的差速方式占空比給 50% 是為了轉(zhuǎn)向平緩直行給 60% 是常用巡航速度。這些數(shù)值不是死的仿真里可以調(diào)調(diào)到輪子轉(zhuǎn)向看起來自然為止。狀態(tài)機(jī)的價(jià)值在于每個(gè)行為是獨(dú)立的加一個(gè)“原地旋轉(zhuǎn)”只是多一個(gè) case不影響已有邏輯。4.4 Proteus 側(cè)配置元件選取、接線與 hex 加載Proteus 這邊的配置步驟決定仿真能不能跑起來。通常的做法是從元件庫取一個(gè) STM32 模型、一個(gè) L298N 驅(qū)動(dòng)模型、兩個(gè)直流電機(jī)模型按原理圖接線把編譯出的 hex 文件加載到 STM32 模型的程序?qū)傩岳镌O(shè)置好時(shí)鐘頻率然后運(yùn)行。接線時(shí)特別注意兩點(diǎn)一是 STM32 的 PWM 輸出引腳要接到 L298N 的使能端方向引腳接到輸入控制端二是電機(jī)模型的電源和地要接對(duì)否則輪子不轉(zhuǎn)但代碼沒錯(cuò)容易誤判。hex 加載路徑不要有中文這是 Proteus 的老毛病路徑帶中文有時(shí)加載失敗還不報(bào)錯(cuò)。仿真運(yùn)行后先測(cè)直行再測(cè)轉(zhuǎn)向最后測(cè)停止。每個(gè)行為單獨(dú)驗(yàn)證不要一上來就跑復(fù)雜序列。出問題時(shí)按“代碼邏輯 → 引腳映射 → Proteus 接線 → 模型參數(shù)”的順序查這個(gè)順序能覆蓋絕大多數(shù)翻車場(chǎng)景。5. 避坑與常見問題排查仿真跑不通時(shí)先看這五條5.1 電機(jī)完全不轉(zhuǎn)但代碼編譯通過現(xiàn)象是仿真運(yùn)行后兩個(gè)輪子紋絲不動(dòng)代碼沒有報(bào)錯(cuò)。原因通常有三個(gè)定時(shí)器沒使能、PWM 通道沒配置成輸出比較模式、或者 Proteus 里 hex 沒加載成功。解決方法是先在代碼里加一個(gè) GPIO 翻轉(zhuǎn)做心跳用示波器虛擬儀器看有沒有波形再確認(rèn)TIM_Cmd被調(diào)用最后檢查 Proteus 模型屬性里的 hex 路徑。我一般會(huì)先看心跳心跳沒有就是程序沒跑起來和電機(jī)無關(guān)。5.2 輪子轉(zhuǎn)向和預(yù)期相反現(xiàn)象是發(fā)直行指令一個(gè)輪子正轉(zhuǎn)一個(gè)反轉(zhuǎn)車原地打轉(zhuǎn)。原因是某一側(cè)的方向真值表寫反或者 Proteus 里電機(jī)模型接線極性接反。解決方法是單獨(dú)給每側(cè)發(fā)正轉(zhuǎn)指令觀察轉(zhuǎn)向?qū)φ沾a里的 GPIO 設(shè)置。如果是模型接線問題調(diào)換模型的兩個(gè)輸入端即可不用改代碼。這個(gè)坑很常見因?yàn)榉抡婺P秃蛯?shí)物驅(qū)動(dòng)的極性定義不一定一致。5.3 PWM 調(diào)速無效占空比改了轉(zhuǎn)速不變現(xiàn)象是 duty 從 10 改到 90輪子轉(zhuǎn)速看起來一樣。原因多半是 PWM 頻率和電機(jī)模型不匹配或者比較寄存器寫錯(cuò)了通道。解決方法是先用虛擬示波器看 PWM 引腳波形確認(rèn)占空比真的在變?nèi)绻ㄐ螌?duì)但轉(zhuǎn)速不變檢查 Proteus 電機(jī)模型是否支持 PWM 調(diào)速有些簡(jiǎn)化模型只認(rèn)電平不認(rèn)占空比。換一個(gè)支持調(diào)速的電機(jī)模型通常能解決。5.4 仿真運(yùn)行卡頓或直接崩潰現(xiàn)象是點(diǎn)運(yùn)行后 Proteus 無響應(yīng)或者跑幾秒就停。原因是仿真步長(zhǎng)設(shè)置太小、模型太多、或者代碼里有死循環(huán)沒有喂看門狗仿真里看門狗行為可能異常。解決方法是在 Proteus 的仿真設(shè)置里適當(dāng)放大步長(zhǎng)減少不必要的虛擬儀器代碼里避免在中斷里做長(zhǎng)延時(shí)。血淚經(jīng)驗(yàn)是仿真不是越精細(xì)越好能驗(yàn)證邏輯就行步長(zhǎng)太小反而跑不動(dòng)。5.5 上硬件后行為和仿真不一致現(xiàn)象是仿真里一切正常燒到實(shí)物上電機(jī)抖動(dòng)、方向亂、轉(zhuǎn)速不對(duì)。原因是仿真用的是理想電源和理想電機(jī)實(shí)物有壓降、有慣性、有干擾。解決方法是把仿真里驗(yàn)證過的邏輯保留參數(shù)重新整定PWM 頻率按實(shí)際驅(qū)動(dòng)芯片手冊(cè)調(diào)占空比起步值降低方向切換加死區(qū)延時(shí)。仿真負(fù)責(zé)邏輯正確實(shí)物負(fù)責(zé)參數(shù)整定兩者分工要清楚。6. 驗(yàn)收與答辯怎么證明這套仿真方案真的跑通了驗(yàn)收這套方案不能只說“仿真能跑”要拿出可復(fù)現(xiàn)的證據(jù)鏈。我一般按三步走第一步行為覆蓋測(cè)試把直行、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止五個(gè)行為逐個(gè)運(yùn)行每個(gè)行為錄一段仿真畫面記錄左右輪轉(zhuǎn)向和相對(duì)轉(zhuǎn)速第二步參數(shù)邊界測(cè)試把占空比設(shè)成 0、50、100 三檔確認(rèn)轉(zhuǎn)速單調(diào)變化且 0 檔徹底停止第三步異常輸入測(cè)試給一個(gè)越界占空比或非法方向值確認(rèn)接口截?cái)嗌?、電機(jī)不出現(xiàn)異常動(dòng)作。答辯時(shí)最容易被問的是“仿真和實(shí)物差距怎么處理”?;卮鹨唧w仿真驗(yàn)證的是引腳邏輯、PWM 占空比映射、狀態(tài)機(jī)切換順序?qū)嵨镫A段需要重新整定的是 PWM 頻率、啟動(dòng)占空比下限、換向死區(qū)時(shí)間。把這兩類參數(shù)分開講評(píng)委能看出你清楚邊界在哪。另一個(gè)高頻問題是“為什么不用硬件直接調(diào)”答案就是開頭說的硬件故障排查成本高仿真把邏輯錯(cuò)誤提前暴露上硬件只調(diào)物理參數(shù)效率完全不同。下面這張表可以直接放進(jìn)答辯 PPT 的驗(yàn)收頁把每個(gè)行為的觀察點(diǎn)和通過標(biāo)準(zhǔn)列清楚。測(cè)試項(xiàng)操作觀察點(diǎn)通過標(biāo)準(zhǔn)直行發(fā)直行指令左右輪轉(zhuǎn)向、轉(zhuǎn)速同向、轉(zhuǎn)速接近左轉(zhuǎn)發(fā)左轉(zhuǎn)指令左右輪轉(zhuǎn)向左反右正、車體左偏停止發(fā)停止指令輪子是否停轉(zhuǎn)占空比歸零、徹底停止調(diào)速duty 設(shè) 0/50/100轉(zhuǎn)速變化單調(diào)變化、0 檔不轉(zhuǎn)越界duty 傳 150接口行為截?cái)酁?100、不異常最后說一個(gè)習(xí)慣從那以后我每次做仿真項(xiàng)目都強(qiáng)制先寫行為-引腳-預(yù)期表再動(dòng)手接線寫代碼驗(yàn)收時(shí)按表逐項(xiàng)打勾。這張表看著笨但能擋住八成“跑起來了但不知道對(duì)不對(duì)”的情況。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取