18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

風(fēng)洞懸浮球:基于RT-Thread與MCXA156的簡單控制實(shí)踐 | 技術(shù)集結(jié)

RT-Thread官方賬號 ? 2025-10-17 11:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

目錄


項(xiàng)目概述


硬件選型與連接


軟件架構(gòu)設(shè)計(jì)


VL53L0X配置


風(fēng)扇控制 (PWM)


控制算法


遠(yuǎn)程監(jiān)控


OLED數(shù)據(jù)顯示


有待改進(jìn)的地方


項(xiàng)目源碼


直播回放

1 項(xiàng)目概述

本項(xiàng)目基于RT-Thread實(shí)時(shí)操作系統(tǒng)NXP FRDM-MCXA156 開發(fā)板,構(gòu)建了一個(gè)能夠?qū)⑵古仪蚍€(wěn)定懸浮在預(yù)定高度的控制系統(tǒng)。配備了本地?cái)?shù)據(jù)顯示屏和遠(yuǎn)程Web監(jiān)控界面,構(gòu)成了一個(gè)功能相對完整的嵌入式系統(tǒng)

項(xiàng)目核心功能:

高度測量: 通過VL53L0XToF激光測距傳感器,系統(tǒng)能夠以毫米級精度實(shí)時(shí)獲取乒乓球的高度。

復(fù)合控制算法: 考慮到管道內(nèi)風(fēng)的非線性特性,我沒有采用單一的PID控制器,而是使用簡單的PID + 前饋 + 增益調(diào)度的復(fù)合控制策略,以適應(yīng)不同目標(biāo)高度下的系統(tǒng)動(dòng)態(tài)變化。

多任務(wù)并發(fā)處理: 基于RT-Thread的多線程架構(gòu),將核心控制、OLED顯示、網(wǎng)絡(luò)通信等任務(wù)分離到不同的線程中,確保了控制任務(wù)的實(shí)時(shí)性不受其他功能影響。

遠(yuǎn)程監(jiān)控與人機(jī)交互: 系統(tǒng)通過RW007Wi-Fi模塊接入局域網(wǎng),并借助一個(gè)Python WebSocket代理,將數(shù)據(jù)實(shí)時(shí)推送到Web前端。用戶可以在瀏覽器上觀察高度、目標(biāo)等參數(shù)的實(shí)時(shí)曲線,并可遠(yuǎn)程下發(fā)指令,調(diào)整懸浮的目標(biāo)高度。

本文將詳細(xì)剖析該系統(tǒng)的硬件選型、軟件架構(gòu)、核心算法實(shí)現(xiàn)以及開發(fā)過程中遇到的挑戰(zhàn)與解決方案,希望能為對嵌入式控制系統(tǒng)感興趣的開發(fā)者提供一些參考和啟發(fā)。

2 硬件選型與連接

2.0 材料準(zhǔn)備

管道:亞克力管子(外徑50mm 厚度2mm 內(nèi)孔46mm 長50cm )

出風(fēng)口罩:隨便找一個(gè)飲料瓶,剪掉上半,底部戳幾個(gè)洞,罩在管道一側(cè),用于穩(wěn)定管道末端風(fēng)速并防止小球飛出

風(fēng)扇:pwm 4線風(fēng)扇(12v18000轉(zhuǎn) 4線)

降壓穩(wěn)壓模塊:12v轉(zhuǎn)5v,要有12v輸出和5v輸出,注意共地

2.1 核心控制器:NXP FRDM-MCXA156

性能: 搭載 ARM Cortex-M33 內(nèi)核,主頻高達(dá) 96MHz,為復(fù)雜的控制算法和多線程應(yīng)用提供了充足的算力。

外設(shè): 內(nèi)置多個(gè) I2C, SPI, PWM, UART接口,可以輕松連接本項(xiàng)目所需的各種外設(shè),無需額外的擴(kuò)展板。

生態(tài): NXP官方提供了完善的SDK和文檔支持,同時(shí)RT-Thread也對其有良好的適配,大大降低了開發(fā)門檻。

2.2 各功能模塊

組件

型號

作用

選型理由

高度傳感器

VL53L0X

ToF激光測距

提供毫米級、高頻率的距離測量,不受環(huán)境光干擾,是本項(xiàng)目精確控制的基礎(chǔ)。

執(zhí)行器

(風(fēng)扇)

YS4028B12H

產(chǎn)生上升氣流

4028尺寸的暴力風(fēng)扇,支持PWM調(diào)速,能夠提供足夠大的風(fēng)量來托起乒乓球。

顯示屏

SSD1306

128x64 OLED

I2C接口,功耗低,體積小,方便在本地實(shí)時(shí)顯示關(guān)鍵數(shù)據(jù),便于調(diào)試。

Wi-Fi模塊

RW007

網(wǎng)絡(luò)通信

RT-Thread生態(tài)中常見的Wi-Fi模塊,驅(qū)動(dòng)成熟,可以方便地讓設(shè)備接入網(wǎng)絡(luò)。

2.3 硬件連接詳情

c4b7b34e-ab0c-11f0-8ce9-92fbcf53809c.png

所有模塊與 FRDM-MCXA156 開發(fā)板的連接如下表所示。

組件

開發(fā)板引腳

備注

PWM風(fēng)扇 (YS4028B12H)

P3_6

連接到FLEXPWM0_A0,用于PWM調(diào)速

ToF傳感器 (VL53L0X)

P0_22(SCL),P0_23(SDA),P2_0(XSHUT)

軟件I2C總線和開關(guān)控制

OLED屏幕 (SSD1306)

P1_9(SCL),P1_8(SDA)

硬件I2C總線 (LPI2C2),配置參考SSD1306配置

Wi-Fi模塊 (RW007)

(SPI)

連接到LPSPI1,配置參考rw007配置

調(diào)試串口

P0_2(RX),P0_3(TX)

連接到LPUART0

工作指示燈

P3_12

GPIO輸出

3 軟件架構(gòu)設(shè)計(jì)

本項(xiàng)目的軟件核心是運(yùn)行在MCXA156上的RT-Thread嵌入式固件,它與PC端的Python代理腳本和Web前端共同構(gòu)成一個(gè)完整的監(jiān)控系統(tǒng)。

3.1 整體架構(gòu)圖

下圖展示了系統(tǒng)的三個(gè)主要部分(嵌入式設(shè)備、中間代理、用戶端)以及它們之間的數(shù)據(jù)流和交互關(guān)系。

c4c654e4-ab0c-11f0-8ce9-92fbcf53809c.png

3.2 工作流程詳解

數(shù)據(jù)采集與控制 (主控制線程): 系統(tǒng)核心,該線程以20ms的周期運(yùn)行,在每個(gè)周期內(nèi):

通過I2C總線讀取VL53L0X傳感器的高度數(shù)據(jù)。

根據(jù)當(dāng)前高度和斜坡化的目標(biāo)高度,執(zhí)行PID + 前饋 + 增益調(diào)度算法,計(jì)算出最終的風(fēng)扇PWM占空比(轉(zhuǎn)速)。

調(diào)用PWM驅(qū)動(dòng),更新風(fēng)扇轉(zhuǎn)速。

將當(dāng)前高度、目標(biāo)高度等狀態(tài)信息寫入全局變量,供其他線程使用。

本地顯示 (OLED顯示線程): 該線程獨(dú)立于主控制循環(huán),它定期從全局變量中讀取最新的系統(tǒng)狀態(tài),并將其格式化后顯示在SSD1306屏幕上。

遠(yuǎn)程通信 (Websocket代理):

PC上運(yùn)行的websocket_proxy.py腳本一方面通過TCP連接到設(shè)備的TCP服務(wù)器,另一方面啟動(dòng)一個(gè)WebSocket服務(wù)等待Web瀏覽器的連接。代理腳本定期向設(shè)備發(fā)送get_status命令,設(shè)備執(zhí)行該命令后,會返回一個(gè)包含所有狀態(tài)信息的JSON字符串。腳本解析此字符串,并通過WebSocket將其推送給前

4 VL53L0X配置

可以直接使用vl53l0x這個(gè)軟件包

4.1 軟件包的啟用與配置

啟用軟件包:在 RT-Thread online packages ---> peripheral libraries and drivers ---> sensors drivers ---> 中,勾選[*] VL53L0X Time of flight(TOF) sensor.。

sensor_v1驅(qū)動(dòng):勾選[*] Enable sensor_v1 divce framework 并啟用sample。

配置I2C總線:使用軟件I2C,配置如下

c4ce3bdc-ab0c-11f0-8ce9-92fbcf53809c.png

修改一下sample

MSH_CMD_EXPORT(read_distance_sample, read distance sample);staticintrt_hw_vl53l0x_port(void){ structrt_sensor_configcfg; cfg.intf.dev_name="i2c1"; /* i2c bus */ cfg.intf.user_data= (void*)0x29; /* i2c slave addr */ rt_hw_vl53l0x_init("vl53l0x", &cfg,64);/* xshutdown ctrl pin */ returnRT_EOK;}INIT_COMPONENT_EXPORT(rt_hw_vl53l0x_port);// 在vl53l0x_sensor_v1.c中#define VL53L0X_I2C_BUS "i2c1" /* i2c linked */

4.2 應(yīng)用層調(diào)用

配置完成后,VL53L0X傳感器就被注冊為RT-Thread系統(tǒng)中一個(gè)名為tof_vl53l0x的標(biāo)準(zhǔn)設(shè)備(要把RT_NAME_MAX改大一點(diǎn)才能顯示完全)。在main.c中,我們只需通過標(biāo)準(zhǔn)設(shè)備接口即可與之交互,代碼非常簡潔:

/* --- main.c --- */// 1. 查找并打開設(shè)備rt_device_ttof_dev =rt_device_find("tof_vl53l0x");rt_device_open(tof_dev, RT_DEVICE_FLAG_RDONLY);// 2. 在主循環(huán)中讀取數(shù)據(jù)structrt_sensor_datasensor_data;rt_size_tres =rt_device_read(tof_dev,0, &sensor_data,1);// 3. 獲取毫米為單位的距離值current_height = sensor_data.data.proximity;

5 風(fēng)扇控制 (PWM)

參考Servo_sg90庫,改一改就能用,當(dāng)然也可以直接操作pwm

5.1 引腳配置

MSH_CMD_EXPORT(read_distance_sample, read distance sample);staticintrt_hw_vl53l0x_port(void){ structrt_sensor_configcfg; cfg.intf.dev_name="i2c1"; /* i2c bus */ cfg.intf.user_data= (void*)0x29; /* i2c slave addr */ rt_hw_vl53l0x_init("vl53l0x", &cfg,64);/* xshutdown ctrl pin */ returnRT_EOK;}INIT_COMPONENT_EXPORT(rt_hw_vl53l0x_port);// 在vl53l0x_sensor_v1.c中#define VL53L0X_I2C_BUS "i2c1" /* i2c linked */

5.2 核心實(shí)現(xiàn)

驅(qū)動(dòng)的核心在于ys4028b12h_set_speed函數(shù):

/* --- applications/fan/YS4028B12H.c --- */rt_err_tys4028b12h_set_speed(ys4028b12h_cfg_tcfg,floatspeed){ // ... 省略參數(shù)檢查 ... // 核心邏輯:根據(jù)速度百分比計(jì)算脈沖寬度值 cfg->pulse = (int)(cfg->period * speed); // 調(diào)用RT-Thread底層PWM API進(jìn)行設(shè)置 rt_pwm_set(cfg->name, cfg->channel, cfg->period, cfg->pulse); returnRT_EOK;}

main.c的主控制循環(huán)中,只需調(diào)用這個(gè)高層API即可:

/* --- main.c --- */// ... PID計(jì)算之后 ...floatfinal_fan_speed = ff_speed + pid_output;// ... 限幅之后 ...ys4028b12h_set_speed(cfg, final_fan_speed);

便于維護(hù)和拓展

6 控制算法

考慮到風(fēng)洞系統(tǒng)是一個(gè)典型的非線性系統(tǒng)(在不同高度,維持懸浮所需的風(fēng)力變化并非線性),單一的PID控制器難以在整個(gè)高度范圍(50mm ~ 450mm)內(nèi)都取得良好效果。因此,本項(xiàng)目采用了一套簡單的復(fù)合控制策略。

6.1 復(fù)合控制策略概覽

我們的控制算法主要由以下四個(gè)部分組成,它們在 main.c 的主控制循環(huán)中協(xié)同工作:

設(shè)定值斜坡 (Ramped Setpoint):變更高度時(shí)讓目標(biāo)高度緩慢變化,避免目標(biāo)高度突變帶來的系統(tǒng)劇烈震蕩。

增益調(diào)度 (Gain Scheduling):根據(jù)當(dāng)前目標(biāo)高度,動(dòng)態(tài)調(diào)整PID參數(shù)(Kp, Ki, Kd),以適應(yīng)系統(tǒng)的非線性。

前饋控制 (Feed-forward):引入一個(gè)基礎(chǔ)風(fēng)速,作為PID控制的“預(yù)補(bǔ)償”,加快系統(tǒng)響應(yīng)。

PID閉環(huán)控制:經(jīng)典的比例-積分-微分控制器,用于消除系統(tǒng)的穩(wěn)態(tài)誤差。

6.2 代碼實(shí)現(xiàn)

設(shè)定值斜坡

當(dāng)用戶設(shè)置一個(gè)新的target_height時(shí),不直接將其作為PID控制器的目標(biāo),而是引入一個(gè)中間變量ramped_height,讓它以固定的步長RAMP_STEP逐漸逼近最終目標(biāo)。

/* --- main.c --- */// 每一次變化的步長#defineRAMP_STEP 0.5f// 最終目標(biāo)值floattarget_height =250.0f;// PID控制器當(dāng)前追蹤的、平滑變化的目標(biāo)floatramped_height =250.0f;// 在主循環(huán)中if(FABS(ramped_height - target_height) > RAMP_STEP) { if(ramped_height < target_height) ramped_height += RAMP_STEP;? ? else?ramped_height -= RAMP_STEP;? ? // 當(dāng)追蹤目標(biāo)變化時(shí),需要同步更新PID增益? ? update_pid_gains_by_target(ramped_height);}?else?{? ? ramped_height = target_height;}

這樣做可以有效防止因目標(biāo)值瞬間變化過大而導(dǎo)致的超調(diào)和震蕩。

增益調(diào)度與前饋

增益調(diào)度和前饋都基于預(yù)先測定好的查找表。在main.c中,我們定義了gain_schedule_table 和 ff_table。

gain_schedule_table: 存儲了不同高度下,經(jīng)過優(yōu)化的PID參數(shù)組。

ff_table: 存儲了不同高度下,一個(gè)大致能讓球懸浮的基礎(chǔ)風(fēng)速(事實(shí)上,很難找,找到一個(gè)緩慢上升的速度就可以了)。

update_pid_gains_by_target()get_feedforward_speed()函數(shù)會根據(jù)當(dāng)前的ramped_height,通過線性插值的方式,從查找表中計(jì)算出最合適的Kp, Ki, Kd和基礎(chǔ)風(fēng)速ff_speed。

/* --- main.c: update_pid_gains_by_target() 偽代碼 --- */// 1. 找到目標(biāo)高度所在的區(qū)間lower_bound = find_closest_lower_entry(target);upper_bound = find_closest_upper_entry(target);// 2. 計(jì)算插值比例ratio = (target - lower_bound.height) / (upper_bound.height - lower_bound.height);// 3. 線性插值計(jì)算出當(dāng)前高度對應(yīng)的Kp, Ki, KdKP = lower_bound.kp + ratio * (upper_bound.kp - lower_bound.kp);KI = lower_bound.ki + ratio * (upper_bound.ki - lower_bound.ki);KD = lower_bound.kd + ratio * (upper_bound.kd - lower_bound.kd);

PID核心計(jì)算與輸出

最后,將前饋控制量與PID控制器的輸出量相加,得到最終的風(fēng)扇速度。

/* --- main.c: 主控制循環(huán)核心 --- */// PID 控制器核心計(jì)算floaterror= ramped_height - (float)current_height;integral_error +=error;float derivative_error =error- previous_error;float pid_output = (KP *error) + (KI * integral_error) + (KD * derivative_error);previous_error =error;// 前饋與PID輸出合并float ff_speed = get_feedforward_speed(ramped_height);float final_fan_speed = ff_speed + pid_output;// 輸出限幅與積分抗飽和if(final_fan_speed >1.0f) { final_fan_speed =1.0f; integral_error -=error;// 抗飽和:當(dāng)輸出飽和時(shí),減去本次積分量}if(final_fan_speed

當(dāng)計(jì)算出的final_fan_speed超出物理限制(>1.0<0.0)時(shí),我們會從積分項(xiàng)integral_error中減去(或加上)本次的誤差。這可以防止積分項(xiàng)在輸出飽和期間無限制地累積,從而避免了在系統(tǒng)恢復(fù)時(shí)可能出現(xiàn)的巨大超調(diào)。

7 遠(yuǎn)程監(jiān)控

c4e424c4-ab0c-11f0-8ce9-92fbcf53809c.png

為了讓控制過程可視化,并能遠(yuǎn)程干預(yù),本項(xiàng)目設(shè)計(jì)了一套基于Web的遠(yuǎn)程監(jiān)控系統(tǒng)。其核心思想是:在設(shè)備端運(yùn)行一個(gè)自定義的TCP應(yīng)用層協(xié)議服務(wù)器,并通過一個(gè)PC端的Python腳本作為代理,將TCP協(xié)議轉(zhuǎn)換成Web前端通用的WebSocket協(xié)議。

7.1 設(shè)備端:自定義TCP服務(wù)器 (remote.c)

參考network_samples,我在設(shè)備端實(shí)現(xiàn)了一個(gè)簡單的TCP服務(wù)器(applications/remote/remote.c),它監(jiān)聽在5000端口。這個(gè)服務(wù)器的功能非常專一,只響應(yīng)兩個(gè)核心命令:

get_status: 當(dāng)收到此命令時(shí),服務(wù)器會立即讀取系統(tǒng)中所有相關(guān)的全局變量(如當(dāng)前高度、目標(biāo)高度、PID參數(shù)等),將它們打包成一個(gè)JSON字符串,然后發(fā)送給客戶端。

pid_tune: 當(dāng)收到此命令(例如pid_tune -t 300)時(shí),服務(wù)器會直接調(diào)用已有的pid_tune()MSH函數(shù),從而實(shí)現(xiàn)對系統(tǒng)參數(shù)的修改。

/* --- applications/remote/remote.c: 命令分發(fā)偽代碼 --- */// ... 接收并解析命令 ...if(strcmp(argv[0],"get_status")==0){// 打包JSON并發(fā)送sprintf(send_buf,"{"current_height":%ld, ... }", current_height,...); send(connected, send_buf,...);}elseif (strcmp(argv[0],"pid_tune")==0){// 直接調(diào)用MSH函數(shù) pid_tune(argc, argv); send(connected,"OK\r\n",...);}

這里復(fù)用了為串口命令行調(diào)試而編寫的pid_tune函數(shù),因?yàn)橹恍枰獔?zhí)行修改不需要回顯,系統(tǒng)的實(shí)時(shí)信息由get_status完成。

7.2 中間代理:WebSocket協(xié)議轉(zhuǎn)換器 (websocket_proxy.py)

它使用Python的asynciowebsockets庫,同時(shí)維護(hù)兩類連接:

1.一個(gè)到設(shè)備TCP服務(wù)器的持久連接:

它會定期(每100ms)自動(dòng)發(fā)送get_status命令來拉取最新數(shù)據(jù)。

當(dāng)從TCP連接收到設(shè)備返回的JSON數(shù)據(jù)后,它會立即將這些數(shù)據(jù)廣播給所有連接到它的WebSocket客戶端。

多個(gè)來自Web瀏覽器的WebSocket連接:

當(dāng)從任何一個(gè)WebSocket客戶端收到命令時(shí)(如用戶在網(wǎng)頁上調(diào)整了目標(biāo)高度),它會將這條命令原封不動(dòng)地通過TCP連接轉(zhuǎn)發(fā)給設(shè)備。

# --- applications/remote/websocket_proxy.py: 核心邏輯偽代碼 ---# 任務(wù)一:定期請求狀態(tài)asyncdefrequest_status_periodically(): whileTrue: tcp_writer.write(b"get_status\r\n") awaitasyncio.sleep(0.1)# 任務(wù)二:處理TCP收到的數(shù)據(jù)asyncdeftcp_communication_manager(): whileTrue: message =awaittcp_reader.read() # 如果是JSON數(shù)據(jù) ifis_json(message): # 廣播給所有WebSocket客戶端 forclientinclients: awaitclient.send(message)# 任務(wù)三:處理WebSocket客戶端發(fā)來的命令asyncdefhandle_websocket_client(websocket): asyncforcommandinwebsocket: # 直接轉(zhuǎn)發(fā)給TCP服務(wù)器 tcp_writer.write(command.encode())

8 OLED數(shù)據(jù)顯示

除了遠(yuǎn)程監(jiān)控,本項(xiàng)目還集成了一塊 SSD1306 OLED屏幕,用于在設(shè)備端實(shí)時(shí)顯示關(guān)鍵信息。

8.1 顯示線程

為了不影響核心控制邏輯的實(shí)時(shí)性,要將OLED的刷新任務(wù)放在一個(gè)獨(dú)立的線程中。

/* --- main.c --- */screen_thread =rt_thread_create("ScreenUpdate", screen_on,RT_NULL,1280,11,20);rt_thread_startup(screen_thread);

screen_on函數(shù)(位于applications/OLED/screen.c)是這個(gè)線程的實(shí)體。它與主控制線程是并發(fā)執(zhí)行的。

8.2 通過全局變量進(jìn)行線程間通信

我創(chuàng)建了一個(gè)頭文件applications/system_vars.h,在其中使用 extern 關(guān)鍵字聲明了所有需要在線程間共享的變量。

/* --- applications/system_vars.h --- */#ifndefSYSTEM_VARS_H#defineSYSTEM_VARS_H// ...externint32_tcurrent_height;externfloat target_height;// ...#endif

主控制線程作為生產(chǎn)者,在每次循環(huán)的最后,會更新這些全局變量的值。

OLED顯示線程作為消費(fèi)者,它只需包含system_vars.h這個(gè)頭文件,就可以直接訪問這些變量的最新值。

/* --- applications/OLED/screen.c --- */#include// 包含全局變量聲明voidscreen_on(){ // ... u8g2初始化 ... while(1) { // 直接讀取全局變量 sprintf(buf,"Current: %d", current_height); u8g2_DrawStr(&u8g2,10,18, buf); sprintf(buf,"Target: %d", (int)target_height); u8g2_DrawStr(&u8g2,10,36, buf); u8g2_SendBuffer(&u8g2); rt_thread_mdelay(500);// 降低刷新率,避免閃爍 }}

這種“生產(chǎn)者-消費(fèi)者”模式,通過共享內(nèi)存(全局變量)進(jìn)行通信,是一種簡單高效的線程間數(shù)據(jù)交換方式。對于本項(xiàng)目這種數(shù)據(jù)關(guān)系簡單、實(shí)時(shí)性要求不極端的場景來說,是一個(gè)非常合適的選擇。

9 有待改進(jìn)的地方

傳感器的I2C問題VL53L0X傳感器在連接到MCXA156的硬件I2C總線時(shí),始終無法被正確初始化,會卡在一個(gè)叫VL53L0X_device_read_strobe的函數(shù)上,嘗試次數(shù)超過2000,然后返回錯(cuò)誤。排查了連線問題,也確認(rèn)了I2C引腳配置了(SSD1306可以正常使用),找不出來,發(fā)現(xiàn)使用軟件i2c沒問題就擺了。

控制精度:因?yàn)榭刂扑惴ū容^簡單,而且PWM風(fēng)扇對PWM占空比的響應(yīng)也不是完全線性的(階梯式的),加之管道內(nèi)的風(fēng)流比較復(fù)雜,所以小球在懸浮時(shí)最大會有10mm左右的上下波動(dòng),無法做到讓小球精確的懸浮在指定的高度。

控制算法優(yōu)化:目前的PID參數(shù)和前饋表是通過手動(dòng)試湊和簡單的評估腳本(貝葉斯優(yōu)化)得到的。未來可以引入更高級的系統(tǒng)辨識方法(如基于MATLAB的System Identification Toolbox)來建立更精確的數(shù)學(xué)模型,或采用在線自動(dòng)整定算法(如Ziegler-Nichols或繼電反饋法)來自動(dòng)優(yōu)化參數(shù)。

增加魯棒性:可以增加對傳感器數(shù)據(jù)異常值的濾波處理(如卡爾曼濾波),以應(yīng)對乒乓球快速晃動(dòng)或偶爾的測量噪聲。

風(fēng)扇驅(qū)動(dòng):暫時(shí)只寫了set_speed,還有通過pwm讀取當(dāng)前轉(zhuǎn)速的功能沒有做。

希望本文的分享,能為同樣走在嵌入式開發(fā)道路上的朋友們提供一些有價(jià)值的參考。

10 項(xiàng)目源碼

GitHub倉庫地址https://github.com/Cylopsis/Little-Wind-Tunnel

歡迎大家提出寶貴的意見和建議。

11 直播回放

微信視頻號直播講解回放

RT-Thread Github 開源倉庫,歡迎撒個(gè)星(Star)支持,更期待你的代碼貢獻(xiàn):https://github.com/RT-Thread/rt-thread

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    6027

    瀏覽量

    110693
  • 實(shí)時(shí)操作系統(tǒng)

    關(guān)注

    1

    文章

    205

    瀏覽量

    31711
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1506

    瀏覽量

    43888
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread全球技術(shù)大會:RT-Thread開源重塑軟件發(fā)展新生態(tài)

    RT-Thread全球技術(shù)大會:RT-Thread開源重塑軟件發(fā)展新生態(tài),市場空間巨大,以開放的心態(tài)不斷提升技術(shù)水平,大膽創(chuàng)新,迎接挑戰(zhàn)! ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 10:47 ?1607次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:<b class='flag-5'>RT-Thread</b>開源重塑軟件發(fā)展新生態(tài)

    RT-Thread全球技術(shù)大會:螢石研發(fā)團(tuán)隊(duì)使用RT-Thread技術(shù)挑戰(zhàn)

    RT-Thread全球技術(shù)大會:研發(fā)團(tuán)隊(duì)使用RT-Thread技術(shù)挑戰(zhàn) ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 11:36 ?1775次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:螢石研發(fā)團(tuán)隊(duì)使用<b class='flag-5'>RT-Thread</b>的<b class='flag-5'>技術(shù)</b>挑戰(zhàn)

    2022 RT-Thread全球技術(shù)大會:螢石EZIOT SDK對RT-Thread的支持

    2022 RT-Thread全球技術(shù)大會:RT-Thread在攝像頭及IoT設(shè)備上的實(shí)踐經(jīng)驗(yàn)分享
    的頭像 發(fā)表于 05-27 11:08 ?1683次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:螢石EZIOT SDK對<b class='flag-5'>RT-Thread</b>的支持

    RT-Thread全球技術(shù)大會:RT-Thread Smart更好的兼容Linux生態(tài)

    RT-Thread全球技術(shù)大會:RT-Thread Smart更好的兼容Linux生態(tài) ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:31 ?2268次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:<b class='flag-5'>RT-Thread</b> Smart更好的兼容Linux生態(tài)

    RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機(jī)制

    RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機(jī)制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:49 ?2030次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作機(jī)制

    RT-Thread全球技術(shù)大會:在RT-Thread上編寫測試用例

    RT-Thread全球技術(shù)大會:在RT-Thread上編寫測試用例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:28 ?1903次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:在<b class='flag-5'>RT-Thread</b>上編寫測試用例

    RT-Thread全球技術(shù)大會:RT-Thread測試用例集合案例

    RT-Thread全球技術(shù)大會:RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:34 ?2580次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:<b class='flag-5'>RT-Thread</b>測試用例集合案例

    RT-Thread全球技術(shù)大會:RT-Thread對POSIX的實(shí)現(xiàn)情況介紹

    RT-Thread全球技術(shù)大會:RT-Thread對POSIX的實(shí)現(xiàn)情況介紹 ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:52 ?2316次閱讀
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技術(shù)</b>大會:<b class='flag-5'>RT-Thread</b>對POSIX的實(shí)現(xiàn)情況介紹

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    免費(fèi)申請 | FRDM-MCXA156評測活動(dòng)發(fā)布!

    RT-Thread現(xiàn)已支持恩智浦官方推出的FRDM-MCXA156開發(fā)板并提供BSP!為了讓大家更好地體驗(yàn)MCXA156高能效微控制器的魅力,RT-
    的頭像 發(fā)表于 02-10 18:45 ?698次閱讀
    免費(fèi)申請 | FRDM-<b class='flag-5'>MCXA156</b>評測活動(dòng)發(fā)布!

    《恩智浦FRDM-MCXA156開發(fā)實(shí)踐指南》上線啦

    RT-Thread率先支持NXPFRDM-MCXA156,并聯(lián)合恩智浦半導(dǎo)體推出了NXPFRDM-MCXA156開發(fā)板評測活動(dòng)。測評活動(dòng)順利完成,并且有了不錯(cuò)的產(chǎn)出,我們將大家的測試文檔及代碼整理后
    的頭像 發(fā)表于 04-06 10:51 ?2150次閱讀
    《恩智浦FRDM-<b class='flag-5'>MCXA156</b>開發(fā)<b class='flag-5'>實(shí)踐</b>指南》上線啦

    CherryUSB-HID設(shè)備實(shí)踐 | 技術(shù)集結(jié)

    本文為大家?guī)鞢herryUSB-HID設(shè)備實(shí)踐,以MCXA156為例。開發(fā)環(huán)境搭建請參考RT-Thread的快速入門,咱們就直入主題,折騰USB去。CherryUSB的移植適配據(jù)筆者理解
    的頭像 發(fā)表于 04-27 17:46 ?1158次閱讀
    CherryUSB-HID設(shè)備<b class='flag-5'>實(shí)踐</b> | <b class='flag-5'>技術(shù)</b><b class='flag-5'>集結(jié)</b>

    明晚!基于RT-Thread 的 PID 控制實(shí)踐,從驅(qū)動(dòng)到算法到監(jiān)控,一次學(xué)會!| 問學(xué)直播

    RT-Thread簡單PID控制實(shí)踐》精彩直播!本次直播將基于RT-Thread實(shí)時(shí)操作系統(tǒng)與NXPFRDM-
    的頭像 發(fā)表于 09-01 17:04 ?929次閱讀
    明晚!基于<b class='flag-5'>RT-Thread</b> 的 PID <b class='flag-5'>控制</b><b class='flag-5'>實(shí)踐</b>,從驅(qū)動(dòng)到算法到監(jiān)控,一次學(xué)會!| 問學(xué)直播