扇設(shè)計:從DS18B20到PWM調(diào)速與仿真)
最近做畢業(yè)設(shè)計選型??吹揭活愵}目叫“綠色風(fēng)扇的設(shè)計與實現(xiàn)”。名字聽著像工業(yè)產(chǎn)品實際拆開看就是一套“單片機 溫度檢測 風(fēng)力輸出 人機交互”的完整嵌入式系統(tǒng)。很多同學(xué)一看到“綠色”兩個字就犯怵擔(dān)心要上新能源、太陽能板、電池管理那一套。其實在單片機畢業(yè)設(shè)計語境里“綠色”更像是設(shè)計目標(biāo)風(fēng)扇按需啟動、按溫度自動調(diào)速避免人離開還滿負荷空轉(zhuǎn)從而實現(xiàn)節(jié)能。這比普通“按鍵開關(guān)風(fēng)扇”多了幾個傳感器、幾行控制代碼卻正好把單片機課程里最常考的幾個點都串起來了。如果拿到的題目編號是“mcu-1173”通常要求不會只是點亮一個電機。評審老師更關(guān)注你能不能講清楚以下三件事溫度信號怎么采集、轉(zhuǎn)速怎么控制、用戶模式怎么切換。本文按照一套可運行的 51 單片機溫控節(jié)能風(fēng)扇方案來拆解從功能需求、硬件選型、電路設(shè)計、軟件流程、Proteus 仿真、實物測試到 Keil 調(diào)試排錯全部覆蓋。無論你打算用 STC89C52 做實物還是用 Proteus 做純仿真都能直接套用這套思路。1. 系統(tǒng)功能指標(biāo)與總體方案1.1 綠色風(fēng)扇的“綠色”體現(xiàn)在哪里綠色風(fēng)扇不是指外觀噴綠漆也不是強制要求太陽能驅(qū)動。在畢業(yè)設(shè)計題目里它通??己说氖枪?jié)能控制邏輯。傳統(tǒng)風(fēng)扇只要插電就轉(zhuǎn)不管房間有沒有人、溫度是多少。綠色風(fēng)扇的思路是引入環(huán)境溫度檢測讓風(fēng)機運行狀態(tài)跟隨溫度變化。溫度低時風(fēng)扇低速運轉(zhuǎn)或不轉(zhuǎn)溫度升高后轉(zhuǎn)速按預(yù)設(shè)曲線逐步提升。這樣既滿足散熱需求又避免無效耗電。更完整的題目還會加入手動/自動雙模式。自動模式下系統(tǒng)根據(jù)溫度傳感器數(shù)據(jù)自動調(diào)節(jié)風(fēng)速擋位手動模式下用戶通過按鍵直接選擇低、中、高三擋。無論哪種模式控制核心都是用單片機輸出 PWM 信號去驅(qū)動風(fēng)扇電機而不是用繼電器直接通斷電源。PWM 調(diào)速的優(yōu)點是效率高、轉(zhuǎn)速過渡平滑而且可以用示波器清楚看到占空比變化答辯演示效果好。1.2 功能指標(biāo)列表下面是一份常見的功能指標(biāo)清單畢業(yè)設(shè)計說明書可直接參考序號功能項說明1溫度采集使用單總線數(shù)字溫度傳感器檢測環(huán)境溫度2自動調(diào)速溫度達到預(yù)設(shè)啟動點后風(fēng)機開啟并隨溫度升高增加轉(zhuǎn)速3手動調(diào)速通過按鍵切換低、中、高三擋或關(guān)閉風(fēng)扇4狀態(tài)顯示LCD1602 液晶顯示當(dāng)前溫度、模式與風(fēng)速擋位5閾值設(shè)置按鍵可設(shè)置溫度上限/下限配置保存在單片機內(nèi)部 EEPROM6智能節(jié)能無高溫時停機避免風(fēng)扇長期空轉(zhuǎn)7擴展串口預(yù)留 UART 接口可連接上位機或外接模塊實現(xiàn)遠程控制如果做成課程設(shè)計保留功能 1 到 4 就夠拿基礎(chǔ)分畢業(yè)設(shè)計建議把功能 5 和 7 也做進去這樣論文里有“用戶設(shè)置”和“系統(tǒng)通信”兩個章節(jié)可寫內(nèi)容更充實也更容易過查重。1.3 總體方案架構(gòu)從系統(tǒng)角度看整個風(fēng)扇可以劃分為五個部分傳感器節(jié)點、單片機主控、執(zhí)行機構(gòu)、人機交互和輔助電源。系統(tǒng)工作時序可以概括為傳感器持續(xù)采集環(huán)境溫度單片機會定時讀取最新溫度值然后與用戶設(shè)定的溫度閾值比較計算目標(biāo)占空比再由定時器中斷產(chǎn)生 PWM 波形控制風(fēng)扇。LCD 顯示部分不參與控制邏輯只做狀態(tài)提示。按鍵檢測放在主循環(huán)中采用“掃描 消抖 狀態(tài)標(biāo)志”的方式避免阻塞溫度采樣。主循環(huán)偽代碼如下void main() { sys_init(); // 時鐘、GPIO、定時器、LCD 初始化 while (1) { read_temperature(); // 讀取溫度 update_working_mode(); // 判斷手動/自動 calc_pwm_duty(); // 計算目標(biāo)占空比 refresh_lcd(); // 刷新顯示 key_scan(); // 按鍵掃描與消抖 } }這種結(jié)構(gòu)的特點是實時性要求不高的任務(wù)都放在主循環(huán)輪詢PWM 輸出和 LCD 刷新使用定時器中斷防止電機轉(zhuǎn)速出現(xiàn)明顯抖動。很多同學(xué)一開始會把按鍵延時消抖放在主循環(huán)里一按下按鍵整塊屏幕就閃就是因為循環(huán)被 delay_ms(20) 阻塞了。2. 硬件選型與關(guān)鍵電路設(shè)計2.1 主控單片機選型這里假設(shè)項目采用 STC89C52RC 或兼容的 51 內(nèi)核單片機因為這是單片機畢業(yè)設(shè)計里最通用的方案。STC89C52RC 內(nèi)置 8KB Flash、512B RAM工作電壓 3.3V 到 5.5V外接 12MHz 晶振時完全能處理本項目的任務(wù)。如果指導(dǎo)老師指定必須用 STC15 或 STM32仍可沿用本文的設(shè)計思路只需調(diào)整底層寄存器配置。部分同學(xué)為了在答辯時體現(xiàn)“新意”會把芯片換成 STC15W4K32S4。這類芯片內(nèi)置 ADC、PWM 和 EEPROM外圍器件能省掉不少。但從論文寫作角度STC89C52RC 的參考資料最多最不容易卡在驅(qū)動上。建議如果項目周期少于兩個月就別在芯片選型上冒險。主控引腳分配可參考以下表格模塊引腳說明DS18B20 溫度傳感器P3.7單總線數(shù)據(jù)線需接 4.7kΩ 上拉電阻風(fēng)扇控制輸出P2.7輸出 PWM 信號經(jīng)驅(qū)動電路到電機LCD1602 數(shù)據(jù)口P0.0 ~ P0.78 位并行數(shù)據(jù)接 10kΩ 上拉排阻LCD 控制口P2.0 P2.2RS、RW、EN按鍵P1.0 P1.3模式切換、風(fēng)速加、風(fēng)速減、設(shè)置鍵蜂鳴器/指示燈P2.3用于擋位提示可選2.2 溫度傳感器選 DS18B20 還是 DHT11綠色風(fēng)扇控制的主要依據(jù)是環(huán)境溫度所以溫度傳感器精度和響應(yīng)速度直接影響風(fēng)扇是否亂轉(zhuǎn)。常見選擇有兩種DS18B20 和 DHT11。DS18B20 是單總線數(shù)字溫度傳感器測溫范圍 -55℃ 到 125℃分辨率默認 12 位精度典型值是 ±0.5℃。它只輸出溫度不測濕度很適合純溫控場景。缺點是單總線時序要求嚴(yán)格初始化、讀位、寫位都需要精確延時。如果用 STC89C52RC 且系統(tǒng)不做其他中斷干擾DS18B20 的時序一般沒問題。DHT11 同時輸出溫度和濕度成本也很低但溫度分辨率只有 1℃采樣周期最慢要等 1 秒以上而且濕度輸出在非空調(diào)環(huán)境下參考意義不大。如果題目名稱里有“溫濕度”三個字選 DHT11 更有說服力如果題目強調(diào)“溫度自動控制”DS18B20 更適合做連續(xù)調(diào)速。從畢設(shè)演示效果來說我更推薦 DS18B20。因為風(fēng)機的“檔位跳變”需要根據(jù)溫度連續(xù)變化DS18B20 的 0.0625℃ 分辨率雖然實際用不到這么細但讀出來是小數(shù)比 DHT11 的整數(shù)溫度更容易展示調(diào)理邏輯。也可以用 LM35 ADC 方案但那要占用單片機的 ADC 引腳STC89C52RC 沒有內(nèi)置 ADC需要外擴 ADC0832整體復(fù)雜度更高。2.3 風(fēng)機驅(qū)動電路別直接拿單片機引腳接電機風(fēng)扇電機是感性負載啟動電流和反電動勢都有可能損壞單片機引腳。常見驅(qū)動方式有四種三極管開關(guān)驅(qū)動、MOS 管驅(qū)動、電機驅(qū)動芯片 L9110S、繼電器開關(guān)驅(qū)動。如果風(fēng)扇是 5V 的小型直流風(fēng)機可以用一只 NPN 三極管如 S8050作低端開關(guān)并用二極管 IN4007 反向并聯(lián)在電機兩端續(xù)流。單片機引腳輸出高電平時三極管導(dǎo)通電機得電輸出低電平時三極管截止電機失電。由于工作電流在 200mA 以內(nèi)S8050 可以勝任但要注意基極串一個 1kΩ 限流電阻。如果是 12V 的電腦機箱風(fēng)扇功率比 5V 小風(fēng)扇大一些用三極管會比較燙最好改用 N 溝道 MOS 管加 PWM 驅(qū)動。MOS 管柵極電壓不能低于 10V如果單片機供電是 5V柵極驅(qū)動能力不足會導(dǎo)致管子沒有完全導(dǎo)通。常見的解決辦法是在驅(qū)動級加一個三極管做電平轉(zhuǎn)換或者直接選用 AO3400 這類邏輯電平 MOS 管5V 柵壓也可以完全導(dǎo)通。為了保證安全下面給出一個通用低端驅(qū)動電路描述單片機 PWM 引腳接 1kΩ 電阻到三極管/MOS 管柵極源極/發(fā)射極接地漏極/集電極接電機負極電機正極接電源電機兩端反向并聯(lián)續(xù)流二極管電源輸入端并聯(lián) 100μF 電解電容和 0.1μF 瓷片電容2.4 顯示電路LCD1602 接線與上拉問題LCD1602 是單片機畢業(yè)設(shè)計中最常見的顯示設(shè)備很多人在 51 單片機接 LCD 時遇到一個坑P0 口是開漏輸出直接接 LCD 數(shù)據(jù)總線會顯示亂碼必須在 P0 口外部接上拉電阻排阻例如 10kΩ 的 A103 排阻。如果用 STC 系列單片機內(nèi)部弱上拉可能能帶起來但為了穩(wěn)定性還是建議接上排阻。LCD1602 數(shù)據(jù)接口一般配置為 8 位模式接線引腳包括 RS、RW、EN、D0~D7。軟件初始化時要按數(shù)據(jù)手冊的順序執(zhí)行寫入指令清屏、功能設(shè)置、顯示開關(guān)、光標(biāo)設(shè)置。很多同學(xué)的 LCD 只亮屏不顯示文字問題往往出在初始化時序等待時間不夠而不是硬件接線錯。顯示內(nèi)容可以設(shè)計為兩行Temp: 26.5C Mode:Auto Fan: Gear3 PWM: 75%第一行顯示實時溫度和當(dāng)前模式第二行顯示風(fēng)速擋位和 PWM 占空比。經(jīng)過這種設(shè)計評審老師不用問就能看懂系統(tǒng)狀態(tài)。3. 軟件設(shè)計與核心代碼實現(xiàn)3.1 使用定時器中斷產(chǎn)生 PWM51 單片機內(nèi)部沒有專門的高精度 PWM 模塊STC89C52RC 的 PCA 模塊雖然在部分型號上可以用但標(biāo)準(zhǔn) 89C52 并不包含。為了實現(xiàn)“風(fēng)速無級調(diào)節(jié)”最簡單可靠的方法是用定時器 0 產(chǎn)生周期性中斷在中斷服務(wù)函數(shù)里按占空比翻轉(zhuǎn)電機控制引腳。假設(shè) PWM 頻率選 1kHz周期為 1ms。把 1ms 分成 100 份每份 10μs定時器中斷設(shè)置成 10μs 進入一次使用一個計數(shù)器從 0 加到 100。計數(shù)值小于占空比變量 pwm_duty 時輸出高電平否則輸出低電平就能形成周期 1kHz、占空比可調(diào)的 PWM 波形頻率人耳聽不到明顯噪聲也不至于因為頻率太低讓電機產(chǎn)生頓挫感。偽代碼如下unsigned char pwm_counter 0; // 0~99 循環(huán) unsigned char pwm_duty 0; // 0~100 void timer0_isr(void) interrupt 1 { TH0 0xFF; TL0 0x9C; // 10us 初值需按晶振頻率計算 pwm_counter; if (pwm_counter 100) { pwm_counter 0; } if (pwm_duty pwm_counter) { FAN_PIN 1; // 轉(zhuǎn)速段 ON } else { FAN_PIN 0; // 轉(zhuǎn)速段 OFF } }這里需要強調(diào)的是定時器初值必須用 12MHz 晶振和 12T 模式計算。STC89C52RC 默認 12T 模式系統(tǒng)時鐘為晶振除以 12即 1MHz 的機器周期。如果晶振是 12MHz機器周期 1μs想要 10μs 中斷定時器初值為 65536 - 10 65526也就是 TH00xFFTL00xF6。采用 11.0592MHz 晶振時應(yīng)重新計算。3.2 溫度讀取流程與濾波方法DS18B20 的驅(qū)動時序比較復(fù)雜一般分為三個步驟初始化、ROM 操作、功能操作。單總線通信要求主機產(chǎn)生復(fù)位脈沖等待 DS18B20 回應(yīng)存在脈沖然后發(fā)送跳過 ROM 指令 0xCC再發(fā)送轉(zhuǎn)換溫度指令 0x44。等待溫度轉(zhuǎn)換完成后再發(fā)送讀取暫存器指令 0xBE讀取兩個字節(jié)拼接后得到帶符號的 12 位溫度數(shù)據(jù)。對畢業(yè)設(shè)計而言建議直接使用常用的 DS18B20 驅(qū)動文件不需要從底層一點一點摳時序。但主函數(shù)里做一個“多次讀取取均值”的濾波會增加系統(tǒng)穩(wěn)定性。如果溫度突然跳變幾次導(dǎo)致風(fēng)扇轉(zhuǎn)速也跟著跳變輸出效果會顯得很差。一個簡單的滑動濾波示例unsigned int read_temp_filtered(void) { unsigned char i; unsigned int sum 0; for (i 0; i 4; i) { sum read_ds18b20_temp(); // 連續(xù)讀4次 } return sum / 4; }溫度讀取頻率不用太高建議每隔 200ms 到 500ms 讀一次因為 DS18B20 轉(zhuǎn)換時間本身需要 750ms12 位精度下。如果每次都立即轉(zhuǎn)換然后立刻讀取會導(dǎo)致讀出來的值是上一次的轉(zhuǎn)換結(jié)果表現(xiàn)為溫度變化滯后。正確做法是發(fā)起溫度轉(zhuǎn)換后等待一段時間或循環(huán)查詢忙標(biāo)志再讀暫存器。3.3 自動調(diào)速邏輯分段溫度控制自動模式下風(fēng)扇轉(zhuǎn)速和目標(biāo)溫度綁定。用戶先設(shè)置一個起始溫度例如 25℃再設(shè)置一個最大溫度例如 40℃。低于起始溫度時pwm_duty 為 0高于最大溫度時pwm_duty 為 100。在兩者之間線性插值就能得到平滑的調(diào)速效果。寫成代碼就是int map_temperature_to_duty(int temp_x4) { int temp_start 25; // 實際值建議放大10倍或4倍處理 int temp_end 40; int duty 0; if (temp_x4 temp_start) { duty 0; } else if (temp_x4 temp_end) { duty 100; } else { duty (temp_x4 - temp_start) * 100 / (temp_end - temp_start); } return duty; }溫度如果帶著小數(shù)點建議把溫度值統(tǒng)一放大 10 倍存成整數(shù)避免浮點數(shù)在 51 單片機里占用大量代碼空間和時間。C51 默認整數(shù)是 16 位放大 10 倍后可以表示的 0~6553.5 溫度范圍完全夠用。3.4 按鍵掃描與模式切換狀態(tài)機按鍵直接放在主循環(huán)里掃描時必須處理兩個問題機械抖動和重復(fù)觸發(fā)。機械抖動一般持續(xù) 5ms 到 20ms可以延時 10ms 后再確認一次電平。防抖之后還要等待按鍵松開再執(zhí)行功能而不能按下瞬間就連續(xù)加擋。更推薦使用狀態(tài)機寫法。將按鍵的電平狀態(tài)分為“未按下”“按下確認”“等待釋放”三個階段。這樣即使按鍵按住不放也只執(zhí)行一次加擋操作不會從擋位 1 一路加到 3。對于調(diào)速類操作這種限制很關(guān)鍵。下面是一個簡化按鍵掃描邏輯void key_scan(void) { unsigned char key_stat read_key_value(); switch (key_state_machine) { case KEY_IDLE: if (key_stat KEY_PRESSED) { key_state_machine KEY_CONFIRM; } break; case KEY_CONFIRM: delay_short(); if (key_stat KEY_PRESSED) { key_state_machine KEY_WAIT_RELEASE; excute_key_action(); } else { key_state_machine KEY_IDLE; } break; case KEY_WAIT_RELEASE: if (key_stat KEY_RELEASED) { key_state_machine KEY_IDLE; } break; default: key_state_machine KEY_IDLE; break; } }如果你把按鍵掃描寫在主循環(huán)里要注意主循環(huán)里不能有太長的阻塞延時。LCD 刷新和溫度讀取會占用時間而按鍵按下時長可能只有幾十毫秒一旦被阻塞漏掃就會出現(xiàn)“按了沒反應(yīng)”的錯覺。解決方案是把溫度讀取拆成定時狀態(tài)機主循環(huán)輪詢按鍵頻率盡量高一點。3.5 斷電記憶擋位如果題目要求“掉電后記住上次設(shè)置”STC89C52RC 片內(nèi)沒有真正意義的 EEPROM但很多 STC 系列芯片的數(shù)據(jù)手冊提供了 ISP/IAP 功能可以把程序 Flash 剩余空間當(dāng)成 EEPROM 使用。若使用 STC89C52RC傳統(tǒng)方案是外接 AT24C02 芯片通過 I2C 總線存取用戶設(shè)置的啟動溫度和模式。這一部分如果寫進論文會增加約 500 字的軟件設(shè)計章節(jié)。實際答辯時老師很容易追問“如果用戶設(shè)置了 35℃掉電再上電還是 35℃ 嗎” 如果沒有斷電記憶只能回答回默認值會給系統(tǒng)減分。所以建議至少在電路預(yù)留 AT24C02 的位置即使不焊接原理設(shè)計中也把 I2C 引腳畫出來。3.6 多任務(wù)調(diào)度思路定時器分時輪詢有的畢業(yè)設(shè)計題目要求學(xué)生“實現(xiàn)多個任務(wù)同時運行”例如電機調(diào)速的同時檢測按鍵、刷新顯示、采集溫度。51 單片機是單核順序執(zhí)行根本做不到線程級并行但可以用定時器中斷 標(biāo)志位實現(xiàn)時間片輪詢。模塊劃分如下功能塊調(diào)度周期實現(xiàn)方式PWM 輸出10μsTimer0 中斷直接控制引腳按鍵掃描5msTimer1 置標(biāo)志位主循環(huán)處理LCD 刷新200ms主循環(huán)中判斷時間標(biāo)志溫度采集500ms主循環(huán)中調(diào)用防止阻塞在這種結(jié)構(gòu)下不要讓某個模塊直接占用 while 循環(huán)所有延時盡量用全局時間標(biāo)志代替。溫度轉(zhuǎn)換等待期間主循環(huán)可以去掃描按鍵按鍵消抖期間LCD 可以先顯示舊狀態(tài)等消抖完成再一次更新。這種“操作系統(tǒng)的樸素思想”雖然不復(fù)雜卻非常符合畢業(yè)設(shè)計的調(diào)性。4. Proteus 仿真與實物搭建4.1 使用 Proteus 做純仿真驗證如果你的學(xué)校允許用 Proteus 仿真代替實物電路的搭建會比實際接線簡單一些。仿真中需要將單片機程序生成的 HEX 文件加載到 Proteus 里的 AT89C51/AT89C52 元件上。雙擊單片機元件在 Program File 一欄選擇 Keil 輸出目錄里的 .hex 文件設(shè)置晶振頻率為 12MHz點擊運行。此時可以用虛擬溫度傳感器或 DS18B20 模型模擬溫度變化觀察電機轉(zhuǎn)速是否按檔位變化。仿真時電機模型可以直接使用 Proteus 元件庫的 MOTOR-DC虛擬示波器可以接在單片機 PWM 引腳上觀察波形。但 Proteus 只做邏輯驗證不能替代真實電機的電流消耗測試仿真時電機轉(zhuǎn)得很順不代表實物的驅(qū)動電路一定不發(fā)熱。4.2 實物接線順序與防燒建議實物搭建要遵循“先控制后功率”的順序先把單片機最小系統(tǒng)、下載器、LCD 調(diào)通再接風(fēng)機驅(qū)動電路。很多板子燒毀都是因為電機電源和單片機電源共用一個 USB 口風(fēng)扇啟動瞬間壓降導(dǎo)致單片機反復(fù)復(fù)位電機電感反沖又疊加到電源軌上。推薦的供電方式是單片機系統(tǒng)單獨用 USB 或 5V 穩(wěn)壓電源供電電機電源與單片機電源共地但分開走線如果電機功率超過 3W就不要從單片機電源直接取電電機兩端必須并聯(lián)續(xù)流二極管二極管方向為反向截止方向確保感性電流有泄放回路電路調(diào)試不要一上來接通風(fēng)扇可以先用 LED 指示 PWM 輸出占空比正確后再接電機。具體做法是將 P2.7 引腳經(jīng) 1kΩ 電阻串聯(lián)一個 LED 到地調(diào)節(jié)按鍵觀察 LED 亮度變化再用示波器確認頻率和占空比。4.3 無感硬件怎么驗證有不少同學(xué)因為時間緊不能馬上買到實物元件需要用“軟件仿真 邏輯分析”的方式把代碼完整跑通。Keil 的調(diào)試模式里可以選擇各類仿真外設(shè)如果打開 System View 窗口發(fā)現(xiàn)是空白通常是在調(diào)試配置里沒有添加外設(shè)或沒有勾選對應(yīng)芯片型號。51 單片機在 Keil 中做仿真時至少需要配置晶振頻率、仿真器選項和調(diào)試端口如果是純軟件仿真則要使用“Simulator”模式而非“ULINK/CMSIS-DAP”。如果想在 Keil 調(diào)試中觀察某個引腳高低電平變化可以在調(diào)試模式下打開邏輯分析儀添加端口變量例如 PORT2.7然后單步運行或全速運行。系統(tǒng)會在邏輯分析窗口顯示引腳波形這樣可以不依賴外部示波器就能驗證 PWM 波形頻率和占空比。5. 功能測試與效果驗證5.1 測試準(zhǔn)備實物測試前準(zhǔn)備以下工具數(shù)字萬用表直流穩(wěn)壓電源或 USB 電源示波器沒有可以用邏輯分析儀代替溫度計或可調(diào)溫電吹風(fēng)USB 轉(zhuǎn) TTL 下載器測試用直流風(fēng)扇測試時不要用手直接觸碰高速旋轉(zhuǎn)的扇葉也不要讓風(fēng)扇對著衣物或紙張。需要人為改變傳感器溫度時用電吹風(fēng)低溫檔遠距離加熱速度要慢避免溫度突變讓風(fēng)機猛地拉高速。5.2 測試步驟與預(yù)期結(jié)果第一項基礎(chǔ)測試是上電顯示。接通電源后LCD1602 應(yīng)顯示默認溫度和模式如果 LCD 顯示亂碼或空白檢查 P0 上拉電阻、對比度電位器和初始化代碼。第二項按鍵測試包括手動加擋、手動減擋、模式切換。按加擋鍵時第二行“Fan”后面的擋位從 1 變?yōu)?2、3電機轉(zhuǎn)速應(yīng)該有明顯變化PWM 引腳輸出占空比分別接近 25%、50%、75% 或?qū)?yīng)的映射值。第三項是自動調(diào)速測試。先把模式切到 Auto再將溫度傳感器靠近熱源觀察溫度讀數(shù)和風(fēng)扇轉(zhuǎn)速是否同步上升。環(huán)境溫度穩(wěn)定在 26℃ 時風(fēng)扇應(yīng)低速運行手靠近傳感器讓溫度升到 35℃風(fēng)扇應(yīng)明顯加速。調(diào)回常溫后風(fēng)扇要滯后幾秒再降速這是正常的濾波與遲滯效果。第四項是斷電記憶測試。將自動模式的風(fēng)速上限設(shè)為 60%斷電后重新上電觀察系統(tǒng)是否恢復(fù)到最后設(shè)置值。如果沒有外接 AT24C02 且沒有實現(xiàn) IAP 存儲這項測試會失敗需要在論文中合理地寫“此功能暫未實現(xiàn)”不要拿假實驗數(shù)據(jù)寫在畢設(shè)記錄里。5.3 輸出效果量化評分時老師會關(guān)注“轉(zhuǎn)速變化是否線性”“溫度誤差多大”。你可以把不同溫度對應(yīng)的占空比記錄成表格環(huán)境溫度PWM 占空比風(fēng)扇狀態(tài)電流/電壓實測參考小于 25℃0%停待機電流極小28℃30%低速轉(zhuǎn)視電機規(guī)格32℃60%中速轉(zhuǎn)視電機規(guī)格38℃ 以上100%滿速轉(zhuǎn)接近電機額定電流這部分數(shù)據(jù)在做實物調(diào)試時用萬用表記錄。不要照抄網(wǎng)上的數(shù)值不同風(fēng)扇電機的額定電壓和電流差異很大用同一張表反而會讓答辯老師覺得你沒有實測。6. Keil 調(diào)試與常見問題排查6.1 Keil5 仿真時 System View 是空白的很多同學(xué)在使用 Keil5 做 51 單片機調(diào)試時打開 Debug 菜單下的 System Viewer 窗口發(fā)現(xiàn)是空白界面什么都不顯示。這個問題的原因通常是在設(shè)備選型階段選擇了通用 51 設(shè)備而不是具體型號或者調(diào)試模式?jīng)]有選擇 Simulator。解決方法是進入 Options for Target 對話框在 Debug 選項卡中把 Use Simulator 單選按鈕勾選上同時把 Dialog DLL 參數(shù)設(shè)置為 S8051.dllParameter 留空。重新啟動調(diào)試會話后System Viewer 會顯示當(dāng)前項目支持的寄存器外設(shè)。6.2 用 Keil 觀察引腳高低電平需要觀察單片機某個引腳是高電平還是低電平時Keil 的邏輯分析儀最方便。在調(diào)試模式下打開 View 菜單的 Analysis Windows 下的 Logic Analyzer 窗口點擊右上角的 Setup 圖標(biāo)輸入要觀察的信號例如 PORT2、PORT2.7 或 PWM 引腳對應(yīng)的位變量。添加完成后全速運行信號通道上會出現(xiàn)方波。如果沒有波形多半是程序沒有進入 main 循環(huán)或者定時器中斷沒有觸發(fā)。6.3 常見問題匯總問題現(xiàn)象可能原因排查方法解決方案LCD1602 只亮不顯示P0 口無上拉萬用表測 P0 上拉電壓外接 10kΩ 排阻LCD 顯示一行亂碼初始化指令順序錯誤檢查時序延時按標(biāo)準(zhǔn)流程重新初始化電機不轉(zhuǎn)控制引腳電平不對用 LED 代替電機測試確認三極管/MOS 正確導(dǎo)通電機轉(zhuǎn)速跳躍PWM 周期或占空比不穩(wěn)定示波器看 PWM 波形檢查定時器初值和中斷搶占溫度讀數(shù)恒為 85℃DS18B20 初始化失敗用萬用表測上拉電壓確認數(shù)據(jù)線 4.7kΩ 上拉按鍵一次觸發(fā)多次未做去抖或沒有等待釋放仿真觀察按鍵時間軸改造狀態(tài)機消抖一接電機單片機復(fù)位電源共地不穩(wěn)分供電源測電流電機單獨供電并加電容下載程序失敗下載器驅(qū)動/復(fù)位問題檢測串口號與目標(biāo)板供電按型號重新配置下載器7. 綠色節(jié)能效果與擴展方向7.1 如何評價“綠色”節(jié)能效果論文中的節(jié)能評價不能只寫“本系統(tǒng)節(jié)能”最好給出可對比的數(shù)據(jù)。簡單的方法是統(tǒng)計風(fēng)扇每天運行時長。假設(shè)普通風(fēng)扇無人管理全天候運行 24 小時功率 10W耗電約 240Wh。綠色風(fēng)扇只在溫度超過 25℃ 時運行而室溫高于啟動點的時段只有 8 小時且平均只以 60% 占空比運轉(zhuǎn)那么日耗電約 10W × 8h × 60% 48Wh節(jié)能約 80%。這個計算方法不需要復(fù)雜的功率計只需要用溫度傳感器記錄運行時間和風(fēng)速占空比即可。但論文里必須寫清楚額定功率和計算方法不能空算比例。7.2 可以繼續(xù)擴展的方向如果項目要沖優(yōu)秀畢設(shè)幾個方向值得考慮增加人體紅外傳感器檢測到人離開一段時間后自動停機這是“綠色節(jié)能”的進一步演繹。使用太陽能板給風(fēng)扇供電但太陽能板輸出電壓會隨光照波動需要加入鋰電池和充電管理模塊復(fù)雜度明顯增加。給系統(tǒng)加入藍牙/WiFi 模塊通過手機 App 查看溫度、切換模式實現(xiàn)物聯(lián)網(wǎng)控制。MCU 主板甚至可以封裝成小家電樣式的模型。在遮擋住直接出風(fēng)的地方放置空氣質(zhì)量傳感器實現(xiàn)“溫度 空氣品質(zhì)”雙條件聯(lián)動適合出現(xiàn)在智能家居方向題目里。以上擴展不要每個都做畢業(yè)設(shè)計要有明確主線。一兩個擴展功能加上一篇邏輯清楚的設(shè)計報告就足夠應(yīng)付評閱和答辯了。8. 安全與合規(guī)提醒單片機畢設(shè)雖然屬于教學(xué)訓(xùn)練項目但涉及電力電子和旋轉(zhuǎn)機械下面的安全邊界必須注意風(fēng)扇扇葉是高速旋轉(zhuǎn)部件調(diào)試時不要佩戴寬松衣物、長發(fā)靠近轉(zhuǎn)軸盡量使用護網(wǎng)罩住。外接 220V 交流改裝風(fēng)扇的方案除非指導(dǎo)老師明確要求并有人在現(xiàn)場否則不建議作為畢設(shè)方向低壓 12V 以下的直流風(fēng)扇足以完成所有功能演示。涉及溫度加熱測試時使用電吹風(fēng)或加熱臺不要使用明火。涉及電機驅(qū)動和電源模塊時所有接線必須在斷電狀態(tài)下完成防止短路。如果項目中使用別人的開源代碼、傳感器驅(qū)動、電路圖要在設(shè)計報告中注明參考來源學(xué)術(shù)誠信是畢業(yè)答辯的底線。9. 總結(jié)與下一步建議綠色風(fēng)扇的設(shè)計核心不在“風(fēng)扇”本身而在“綠色”兩個字帶來的控制邏輯擴展。做一個按鍵直通風(fēng)扇只需要一路繼電器但把題目升級成溫控節(jié)能風(fēng)扇后你的設(shè)計里就要包含傳感器采集、信號處理、PWM 驅(qū)動、狀態(tài)顯示和人機交互這基本覆蓋了 51 單片機課程的主要知識點。建議拿到題目“mcu-1173”的同學(xué)先不要急著寫代碼。第一步把功能列表和硬件框圖畫清楚確定自動、手動兩模式第二步把溫度到 PWM 占空比的映射曲線計算出來先做純仿真驗證邏輯第三步再下單買器件搭實物用一個禮拜時間完成硬件測試。最容易踩的坑是驅(qū)動電路發(fā)熱和 DS18B20 時序不穩(wěn)定這兩個問題都建議用示波器做分析不要憑感覺換電阻或改時序。代碼和仿真跑通之后再回來看“綠色節(jié)能”評價部分加一個簡單的能耗對比表這份畢業(yè)設(shè)計的完成度就足夠了。如果你做的是 Proteus 仿真方案記得把 Keil 生成的 HEX 文件路徑設(shè)置正確System View 調(diào)試外設(shè)打開如果你做的是實物方案嚴(yán)格遵守低壓供電原則并在論文里把模塊選型理由和每一級驅(qū)動的電壓電流寫清楚。整套方案到這里已經(jīng)可以落地。下一階段想增強項目亮點可以從“人走風(fēng)扇?!被颉斑h程調(diào)速”兩個方向里選一個擴展先把基礎(chǔ)版本調(diào)穩(wěn)定再往上疊功能會比一開始就追求大而全更順利。