零知開源——基于STM32F407VET6實現ULN2003AN驅動28BYJ-48步進電機控制系統

??零知IDE 是一個真正屬于國人自己的開源軟件平臺,在開發效率上超越了Arduino平臺并且更加容易上手,大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品,測試產品。快來動手試試吧!

?訪問零知實驗室,獲取更多實戰項目和教程資源吧!

www.lingzhilab.com

目錄

一、硬件系統設計

1.1 器件清單

1.2 接線方案

1.3 硬件連接圖

1.4 實物接線圖

二、軟件架構設計

2.1 庫文件及初始化

2.2 電壓校準算法

2.3 狀態機按鍵處理

2.4 電位器模擬值處理

2.5 完整代碼

三、操作過程及展示

3.1 系統連接

3.2 校準測試

3.3?功能驗證

四、控制系統模塊詳解

4.1?ULN2003AN驅動芯片

4.2?28BYJ-48步進電機

五、常見問題解答

Q1: 電位器控制不線性如何調整?

Q2: 顯示屏顯示異常怎么辦?

Q3: 按鍵無響應如何解決?

Q4: 電機振動大且噪音明顯?


(1)項目概述

????????本項目基于STM32F407VET6零知標準板開發了一套完整的步進電機智能控制系統,通過電位器實現精確的速度控制,按鍵控制方向切換,并配備1.3寸TFT顯示屏實時顯示系統狀態。系統采用ULN2003AN驅動芯片控制28BYJ-48步進電機,實現了平滑的速度調節和精準的位置控制。

(2)項目亮點

? ? ? ? >自動識別電位器有效電壓范圍(3.4V-4.0V),實現線性速度映射
? ? ? ? >采用狀態機設計,確保按鍵響應穩定可靠
? ? ? ? >1.3寸TFT顯示屏提供豐富的狀態信息顯示
? ? ? ? >指數曲線速度映射算法,低速控制更精準

(3)項目難點及解決方案

? ? ? ? 問題描述:電位器在3.4-4.0V范圍內電機才轉動

解決方案:

????????實現電壓范圍重新映射算法,通過校準參數自適應不同電位器特性

? ? ? ? 問題描述:28BYJ-48步進電機在低速時扭矩不足

解決方案:

????????設置最小啟動速度(MIN_SPEED),并采用指數曲線速度映射

一、硬件系統設計

1.1 器件清單

規格型號數量備注
零知增強板1STM32F407VET6主控芯片
28BYJ-4815V減速步進電機
ULN2003AN驅動板1達林頓管陣列驅動
1.3寸TFT LCD (ST7789)1240×240分辨率
10KΩ旋轉電位器1線性電位器
6×6mm輕觸開關1常開型
杜邦線若干母對母、母對公

1.2 接線方案

根據代碼定義進行以下接線操作、如需定義為其他引腳請自行修改代碼:

(1)電機驅動部分接線

零知增強板引腳ULN2003AN驅動板28BYJ-48步進電機功能
8IN1/電機控制
9IN2/電機控制
10IN3/電機控制
11IN4/電機控制
/排線連接排線連接電機驅動
5V(外部)+/電機電源
GND-/電機地線

(2)ST7789顯示屏接線

零知增強板引腳ST7789引腳功能
3.3VVCC電源
GNDGND
7CS片選
6DC數據/命令控制
5RES復位
12SDASPI數據線
13SCLSPI時鐘線

(3)電機操作部分接線

零知增強板引腳電位器按鍵功能
5V左側引腳/供電
GND右側引腳/地線
A0中間引腳/信號輸入
2/高電平一端信號輸入,內部上拉

? ? ? ? ps:電機需要消耗大量電力,最好直接從外部 5V 電源供電

1.3 硬件連接圖

1.4 實物接線圖

二、軟件架構設計

2.1 庫文件及初始化

// 主要庫文件引入
#include <AccelStepper.h>      // 步進電機控制庫
#include <Adafruit_GFX.h>      // 圖形顯示庫
#include <Adafruit_ST7789.h>   // ST7789顯示屏驅動
#include <SPI.h>               // SPI通信庫#define TFT_CS   7    // 顯示屏片選
#define TFT_SCL  13   // 顯示屏時鐘
#define TFT_SDA  12   // 顯示屏數據
#define TFT_DC   6    // 顯示屏數據/命令
#define TFT_RST  5    // 顯示屏復位
#define BUTTON_PIN 2  // 按鍵引腳(內部上拉)
#define POT_PIN A0    // 電位器模擬輸入

2.2 電壓校準算法

// 電壓校準參數 - 關鍵創新點
#define POT_MIN_VOLTAGE 3.4  // 電機啟動最小電壓
#define POT_MAX_VOLTAGE 4.0  // 電機最大速度電壓// 計算對應的ADC值范圍
#define POT_MIN_ADC (int)((POT_MIN_VOLTAGE / 5.0) * 1023)
#define POT_MAX_ADC (int)((POT_MAX_VOLTAGE / 5.0) * 1023)// 速度映射函數
if (potValue <= POT_MIN_ADC) {targetSpeed = 0;  // 低于最小電壓停止
} else if (potValue >= POT_MAX_ADC) {targetSpeed = MAX_SPEED;  // 高于最大電壓全速
} else {// 線性映射計算targetSpeed = map(potValue, POT_MIN_ADC, POT_MAX_ADC, MIN_SPEED, MAX_SPEED);
}

2.3 狀態機按鍵處理

// 按鍵狀態枚舉
enum ButtonState { IDLE, PRESSED, DEBOUNCING };
ButtonState buttonState = IDLE;void handleButton() {int buttonReading = digitalRead(BUTTON_PIN);switch (buttonState) {case IDLE:if (buttonReading == LOW) {buttonState = DEBOUNCING;lastButtonTime = millis();}break;// ... 狀態處理邏輯}
}

2.4 電位器模擬值處理

void handlePotentiometer() {// 讀取電位器值int potValue = analogRead(POT_PIN);// 只有當電位器值顯著變化時才處理if (abs(potValue - lastPotValue) > 3) {lastPotValue = potValue;if (DEBUG_MODE && millis() % 500 < 10) {float voltage = (float)potValue / 1023.0 * ADC_REF_VOLTAGE;Serial.print("Pot ADC: ");Serial.print(potValue);Serial.print(" | Voltage: ");Serial.print(voltage);Serial.print("V");}// 重新映射電位器值到速度范圍if (potValue <= POT_MIN_ADC) {// 低于最小電壓,電機停止targetSpeed = 0;} else if (potValue >= POT_MAX_ADC) {// 高于最大電壓,電機全速運行targetSpeed = MAX_SPEED;} else {// 在有效范圍內線性映射targetSpeed = map(potValue, POT_MIN_ADC, POT_MAX_ADC, MIN_SPEED, MAX_SPEED);}if (DEBUG_MODE && millis() % 500 < 10) {Serial.print(" | Target Speed: ");Serial.println(targetSpeed);}// 平滑調整當前速度到目標速度if (abs(targetSpeed - currentSpeed) > SPEED_RAMP_RATE) {if (targetSpeed > currentSpeed) {currentSpeed += SPEED_RAMP_RATE;} else {currentSpeed -= SPEED_RAMP_RATE;}} else {currentSpeed = targetSpeed;}// 更新速度顯示updateSpeedDisplay();}
}

2.5 完整代碼

// Include the necessary libraries
#include <AccelStepper.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>// Define step constant
#define MotorInterfaceType 8// Display pins
#define TFT_CS   7
#define TFT_SCL  13
#define TFT_SDA  12
#define TFT_DC   6
#define TFT_RST  5// Button pin
#define BUTTON_PIN 2// Potentiometer pin
#define POT_PIN A0// Creates motor instance
AccelStepper myStepper(MotorInterfaceType, 8, 10, 9, 11);// Creates display instance with updated pin configuration
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_SDA, TFT_SCL, TFT_RST);// Variables for control
int motorDirection = 1; // 1 for forward, -1 for reverse
int currentSpeed = 0;
int targetSpeed = 0;
bool motorRunning = false;
int lastPotValue = 0;// Button state machine variables
enum ButtonState { IDLE, PRESSED, DEBOUNCING };
ButtonState buttonState = IDLE;
unsigned long lastButtonTime = 0;
#define DEBOUNCE_DELAY 50// UI layout constants
#define TITLE_Y 15
#define DIRECTION_Y 60
#define SPEED_Y 90
#define POSITION_Y 120
#define STATE_Y 150
#define INFO_Y 180
#define VALUE_X 130// Speed control parameters
#define MIN_SPEED 0      // 最小速度
#define MAX_SPEED 800   // 最大速度
#define SPEED_RAMP_RATE 10 // 速度變化率// 電位器校準參數 - 根據您的測量結果調整這些值
#define POT_MIN_VOLTAGE 3.4  // 電機開始轉動的最小電壓
#define POT_MAX_VOLTAGE 4.0  // 電機達到最大速度的電壓
#define ADC_REF_VOLTAGE 5.0  // ADC參考電壓// 計算對應的模擬值范圍
#define POT_MIN_ADC (int)((POT_MIN_VOLTAGE / ADC_REF_VOLTAGE) * 1023)
#define POT_MAX_ADC (int)((POT_MAX_VOLTAGE / ADC_REF_VOLTAGE) * 1023)// 調試模式
#define DEBUG_MODE truevoid setup() {// 初始化串口(用于調試)if (DEBUG_MODE) {Serial.begin(115200);Serial.println("System initialized");Serial.print("POT_MIN_ADC: ");Serial.println(POT_MIN_ADC);Serial.print("POT_MAX_ADC: ");Serial.println(POT_MAX_ADC);}// 初始化顯示屏tft.init(240, 240);tft.setRotation(1);tft.fillScreen(ST77XX_BLACK);// 初始化按鈕pinMode(BUTTON_PIN, INPUT_PULLUP);// 初始化電機myStepper.setMaxSpeed(MAX_SPEED);myStepper.setAcceleration(500.0);myStepper.setSpeed(0);// 繪制UIdrawUI();
}void loop() {// 處理按鈕狀態機handleButton();// 讀取電位器值并設置速度handlePotentiometer();// 運行電機runMotor();// 定期更新顯示static unsigned long lastUpdate = 0;if (millis() - lastUpdate > 100) {updatePositionDisplay();updateStateDisplay();lastUpdate = millis();}
}void handleButton() {int buttonReading = digitalRead(BUTTON_PIN);switch (buttonState) {case IDLE:if (buttonReading == LOW) {buttonState = DEBOUNCING;lastButtonTime = millis();}break;case DEBOUNCING:if (millis() - lastButtonTime > DEBOUNCE_DELAY) {if (digitalRead(BUTTON_PIN) == LOW) {buttonState = PRESSED;// 按鈕動作 - 改變方向motorDirection = -motorDirection;updateDirectionDisplay();if (DEBUG_MODE) {Serial.print("Direction changed to: ");Serial.println(motorDirection > 0 ? "FORWARD" : "REVERSE");}} else {buttonState = IDLE;}}break;case PRESSED:if (buttonReading == HIGH) {buttonState = IDLE;}break;}
}void handlePotentiometer() {// 讀取電位器值int potValue = analogRead(POT_PIN);// 只有當電位器值顯著變化時才處理if (abs(potValue - lastPotValue) > 3) {lastPotValue = potValue;if (DEBUG_MODE && millis() % 500 < 10) {float voltage = (float)potValue / 1023.0 * ADC_REF_VOLTAGE;Serial.print("Pot ADC: ");Serial.print(potValue);Serial.print(" | Voltage: ");Serial.print(voltage);Serial.print("V");}// 重新映射電位器值到速度范圍if (potValue <= POT_MIN_ADC) {// 低于最小電壓,電機停止targetSpeed = 0;} else if (potValue >= POT_MAX_ADC) {// 高于最大電壓,電機全速運行targetSpeed = MAX_SPEED;} else {// 在有效范圍內線性映射targetSpeed = map(potValue, POT_MIN_ADC, POT_MAX_ADC, MIN_SPEED, MAX_SPEED);}if (DEBUG_MODE && millis() % 500 < 10) {Serial.print(" | Target Speed: ");Serial.println(targetSpeed);}// 平滑調整當前速度到目標速度if (abs(targetSpeed - currentSpeed) > SPEED_RAMP_RATE) {if (targetSpeed > currentSpeed) {currentSpeed += SPEED_RAMP_RATE;} else {currentSpeed -= SPEED_RAMP_RATE;}} else {currentSpeed = targetSpeed;}// 更新速度顯示updateSpeedDisplay();}
}void runMotor() {// 設置電機速度和方向int effectiveSpeed = motorDirection * currentSpeed;myStepper.setSpeed(effectiveSpeed);// 運行電機myStepper.runSpeed();motorRunning = (currentSpeed > 0);
}void drawUI() {// 清屏tft.fillScreen(ST77XX_BLACK);// 繪制帶裝飾線的標題tft.drawFastHLine(0, 30, 240, ST77XX_WHITE);tft.setCursor(40, TITLE_Y);tft.setTextSize(3);tft.setTextColor(ST77XX_YELLOW);tft.println("MOTOR CTRL");// 繪制標簽tft.setTextSize(2);tft.setTextColor(ST77XX_WHITE);tft.setCursor(20, DIRECTION_Y);tft.println("Direction:");tft.setCursor(20, SPEED_Y);tft.println("Speed:");tft.setCursor(20, POSITION_Y);tft.println("Position:");tft.setCursor(20, STATE_Y);tft.println("Status:");// 繪制校準信息tft.setTextSize(1);tft.setCursor(10, INFO_Y);tft.print("Calib: ");tft.print(POT_MIN_VOLTAGE, 1);tft.print("V-");tft.print(POT_MAX_VOLTAGE, 1);tft.print("V (");tft.print(POT_MIN_ADC);tft.print("-");tft.print(POT_MAX_ADC);tft.print(")");// 繪制控制說明tft.setCursor(10, INFO_Y + 15);tft.println("Button: Direction | Pot: Speed");// 繪制初始值updateDirectionDisplay();updateSpeedDisplay();updatePositionDisplay();updateStateDisplay();
}void updateDirectionDisplay() {tft.fillRect(VALUE_X, DIRECTION_Y, 100, 20, ST77XX_BLACK);tft.setCursor(VALUE_X, DIRECTION_Y);tft.setTextSize(2);if (motorDirection > 0) {tft.setTextColor(ST77XX_GREEN);tft.print("FORWARD");} else {tft.setTextColor(ST77XX_RED);tft.print("REVERSE");}
}void updateSpeedDisplay() {tft.fillRect(VALUE_X, SPEED_Y, 100, 20, ST77XX_BLACK);tft.setCursor(VALUE_X, SPEED_Y);tft.setTextSize(2);tft.setTextColor(ST77XX_CYAN);tft.print(currentSpeed);tft.print(" step/s");
}void updatePositionDisplay() {tft.fillRect(VALUE_X, POSITION_Y, 100, 20, ST77XX_BLACK);tft.setCursor(VALUE_X, POSITION_Y);tft.setTextSize(2);tft.setTextColor(ST77XX_WHITE);tft.print(myStepper.currentPosition());
}void updateStateDisplay() {tft.fillRect(VALUE_X, STATE_Y, 100, 20, ST77XX_BLACK);tft.setCursor(VALUE_X, STATE_Y);tft.setTextSize(2);if (motorRunning) {tft.setTextColor(ST77XX_GREEN);tft.print("RUNNING");} else {tft.setTextColor(ST77XX_RED);tft.print("STOPPED");}
}

? ? ? ? 如圖所示,步進電機控制系統的工作流程圖

三、操作過程及展示

3.1 系統連接

????????將ULN2003AN驅動板接入5~12V外部電源,連接28BYJ-48電機到驅動板輸出端,按照接線表連接零知增強板與各模塊,確保所有電源正確連接后上電

3.2 校準測試

(1)上傳代碼到零知IDE的零知增強板

(2)旋轉電位器,觀察電機響應
(3)根據實際電壓范圍調整校準參數

(4)測試按鍵功能,確認方向切換正常

3.3 視頻演示驗證

ULN2003AN驅動28BYJ-48步進電機控制系統

????????緩慢旋轉電位器,觀察速度線性增加。按下按鍵,驗證方向切換功能。電位器逆時針旋轉到底,確認電機停止

四、控制系統模塊詳解

4.1?ULN2003AN驅動芯片

(1)功能說明

????????ULN2003AN是高壓大電流達林頓晶體管陣列,包含7個NPN達林頓對管,每個可驅動500mA和50V負載。在本項目中用于驅動28BYJ-48步進電機的四相繞組。

????????該板具有四個控制輸入接口和一個電源接口,還配備了一個與電機連接器相兼容的 Molex 連接器,可直接插入電機。同時,板上設有四個 LED,用于顯示四條控制輸入線上的活動狀態,并且帶有一個開 / 關跳線,以便在需要時禁用步進電機。

(2)工作流程

????????接收MCU發出的控制信號、通過達林頓管放大電流、驅動步進電機各相繞組、提供反向電動勢保護二極管

4.2?28BYJ-48步進電機

(1)工作原理

????????基于齒輪與電磁鐵的協同作用,通過一次推動輪子一個 “步” 來實現運動

????????向線圈發送高脈沖時,線圈會通電,進而吸引最靠近齒輪的齒,使電機以精確且固定的角度增量(即步長)旋轉。其 360 度旋轉的步數取決于齒輪上的齒數

(2)引腳排列

????????28BYJ-48 步進電機有五根線。引腳排列如下:

????????28BYJ-48 包含兩個線圈,每個線圈都設有一個中心抽頭,這兩個中心抽頭在電機內部相連,并通過紅線引出。

????????而線圈的一端與中心抽頭共同構成一相,所以 28BYJ-48 總共有四相:

????????紅線始終拉高,因此當另一根引線拉低時,該相通電。

????????僅當各相按稱為步進順序的邏輯順序通電時,步進電機才會旋轉。

(3)齒輪減速比

????????依據數據表,28BYJ-48 步進電機在全步模式下運行時,每一步對應的旋轉角度為 11.25°,由此可算出每完成 360° 旋轉需要 32 步(360°÷11.25°=32)

????????該電機配備了 1/64 的減速齒輪組(實際減速比為 1/63.68395,不過在多數情況下,1/64 的近似值已能滿足需求)。

????????這也就意味著,電機實際完成一圈旋轉需要約 2038 步(32 步 / 轉 ×63.68395≈2037.8864 步,近似為 2038 步)。

(4)能量消耗

????????28BYJ-48 步進電機的典型電流消耗約為 240mA。

????????由于其耗電量較大,因此建議直接采用外部 5V 電源供電,而非通過 零知增強板供電。

????????需要注意的是,即便處于靜止狀態,該電機也會消耗功率以維持當前位置。

(5)技術規格

工作電壓5VDC
工作電流240mA(典型值)
相數4
齒輪減速比64:1
步距角5.625°/64
頻率100赫茲
牽引扭矩>34.3mN.m(120Hz)
自定位扭矩>34.3mN.m
摩擦力矩600-1200 克力·厘米
拉入扭矩300 克力.厘米

五、常見問題解答

Q1: 電位器控制不線性如何調整?

????????A:修改代碼中的POT_MIN_VOLTAGEPOT_MAX_VOLTAGE參數,匹配實際電壓范圍。

Q2: 顯示屏顯示異常怎么辦?

????????A:檢查SPI接線是否正確,確認CS、DC、RST引腳定義與代碼一致。

Q3: 按鍵無響應如何解決?

????????A:確認按鍵是否正確連接到GND和引腳2,檢查內部上拉電阻是否啟用。

Q4: 電機振動大且噪音明顯?

????????A:降低MAX_SPEED值,或增加加速度參數,使速度變化更平滑。

項目資源:

? ? ? ? 步進電機數據表:28BYJ-48 數據表

? ? ? ? 庫文件依賴:AccelStepper 庫

????????本項目成功實現了一套基于零知標準板的智能步進電機控制系統,希望能為您的嵌入式學習和開發提供有價值的參考!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94907.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何多個手機設備的實現不同公網IP

為了避免多個手機設備使用相同的公網IP地址導致平臺檢測關聯&#xff0c;可以通過以下方法實現不同公網IP的分配和管理. 一、移動網絡&#xff08;SIM 卡&#xff09;方案 1.移動數據與Wi-Fi切換&#xff1a;通過切換移動數據和不同Wi-Fi網絡&#xff08;如家庭Wi-Fi、公共Wi-F…

沙箱操作指南

這是一份通用且詳細的沙箱操作指南。沙箱(Sandbox)是一種安全隔離環境,常用于測試未經驗證的代碼、軟件、文件或訪問可疑網址,而不會對真實系統造成危害。 本指南將分為以下幾個部分: 沙箱是什么? 為什么需要使用沙箱? 如何使用沙箱?(三種主要類型) 最佳實踐與注意事…

【數字IC后端】引導時鐘樹CTS的生成方向之anchor driver

如何控制數字IC后端CTS的生成方向&#xff1f;我們可以引入anchor driver來實現引導。景芯12nm車規APR實戰中&#xff0c;我們可以看到&#xff0c;絕大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1這個mux&#xff0c;…

「Java EE開發指南」如何使用MyEclipse啟用自動JSP驗證?

自動JSP驗證可以在兩種情況下啟用&#xff0c;在本文中您將學習如何正確使用它。 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 您可以在保存JSP編輯器的內容或執行“Clean”操作時啟用自動JSP驗證。要進行正確的驗證&#xff0c;必須使用完整的JDK JVM啟動MyEcl…

leetcode_73 矩陣置零

1. 題意 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 2. 題解 想不到O(1)的空間復雜度的做法&#xff0c; 只有抄抄題解這樣子才能維持的了生活。 2.1 暴力 維護兩個標記數組&#xff0c;分…

優雅地實現ChatGPT式的打字機效果:Spring Boot 流式響應

01 引言 之前專門介紹過流式響應的數據的接收、發送以及使用SSE由服務端推送數據的文章&#xff0c;但是要求前端必須使用EventSource訂閱實現。 有沒有通過直接通過瀏覽器訪問或者Fetch API直接調用的方式呢&#xff1f;效果還能和ChatGPT一樣&#xff0c;實現打字機的效果呢&…

Git 刪除文件

在 Git 中&#xff0c;刪除文件同樣被視為一種修改操作。下面我們通過實際操作演示如何刪除文件。假設要刪除文件 file5&#xff0c;如果你直接在文件系統中執行了刪除&#xff1a;這種直接刪除的方式并不會在 Git 中生效&#xff0c;反而會導致工作區與版本庫不一致。使用 git…

虛幻基礎:角色變換角色視角蒙太奇運動

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄角色視角機臂使用pawn控制旋轉&#xff1a;旋轉體將失去作用旋轉體攝像機&#xff1a;可以使用旋轉體控制&#xff1a;pawn不起作用角色變換角色移動&#xff1a;由移動組件控制移動方向&#xff1a;給組件任意一個方…

【LeetCode】31. 下一個排列

文章目錄31. 下一個排列題目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路1. 問題本質與字典序回顧2. 經典算法三步曲&#xff08;必須原地、常數空間&#xff09;3. 直觀示例與過程可視化4. 與“62. 不同路徑”風格對應的分析維度4.1 …

CVPR2025丨VL2Lite:如何將巨型VLM的“知識”精煉后灌入輕量網絡?這項蒸餾技術實現了任務專用的極致壓縮

關注gongzhonghao【CVPR頂會精選】小模型&#xff08;Small Models&#xff09;通常指參數量較小、計算與存儲成本更低的深度學習模型。近年來&#xff0c;它們在移動端部署、邊緣計算和隱私保護等場景中快速發展&#xff0c;逐漸成為大模型的輕量化補充。隨著蒸餾、剪枝、量化…

【SystemUI】鎖屏來通知默認亮屏Wake模式

一、問題描述 基于 Android 14平臺&#xff0c;鎖屏狀態下來通知時默認是進入Doze模式&#xff0c;此時屏幕不能點擊只能查看通知信息且很快滅屏&#xff0c;用戶體驗不是很好&#xff0c;要求修改為通知直接亮屏。二、問題分析 梳理鎖屏狀態下&#xff08;特指設備息屏或處于D…

高并發寫入、毫秒級查詢——盤古信息攜手 TDengine 時序數據庫解決六大技術挑戰

小T導讀&#xff1a;廣東盤古信息科技股份有限公司&#xff08;下文簡稱盤古信息&#xff09;成立于 2005 年&#xff0c;是一家基于工業互聯網平臺的數字化管理解決方案供應商&#xff0c;公司自主研發的 IMS&#xff08;數字化智能制造系統&#xff09;可為離散、流程及混合制…

Unity 打包 iOS,Xcode 構建并上傳 App Store

一、準備工作&#xff08;環境、賬號、證書與項目基礎&#xff09;系統與工具macOS&#xff1a;使用與最新 Xcode 兼容的版本。Xcode&#xff1a;從 Mac App Store 安裝最新穩定版&#xff08;建議與當前 App Store 必需的 Xcode 主版本保持一致&#xff09;。Unity&#xff1a…

Windows系統安裝stata軟件教程

1、解壓縮2、點擊next3、選擇第一個&#xff0c;然后next4、這里隨便填寫就行5、選擇stataMP&#xff0c;然后next6、這里改個路徑&#xff0c;例如D:\Program Files\Stata18\7、這里不用管&#xff0c;選擇next8、點擊install&#xff0c;開始安裝過程9、安裝過程展示。10、最…

Android 開發 - 數據共享(數據共享、內容提供者實現、動態權限申請)

一、數據共享 1、內容提供者 內容提供者 ContentProvider 為 APP 存取內部數據提供統一的外部接口&#xff0c;讓不同的應用之間得以共享數據2、流程理解 Client APP 將用戶的輸入內容通過 ContentProvider 跨進程通信傳遞給 Server APP3、數據訪問 利用 ContentProvider 只實現…

【51單片機按鍵按下數碼管秒增計時并LED亮釋放停計時LED熄】2022-11-12

緣由單片機控制數碼管及LED燈-嵌入式-CSDN問答 #include "REG52.h" sbit k1P3^0; unsigned char Js0;//計時 unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 ,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64,15,56}; //共陰0~F消隱減號 void…

IBMS集成管理系統與3D數字孿生智能服務系統的應用

一九九二九九零七八八三一、數據全生命周期安全&#xff1a;從采集到銷毀的閉環防護整合系統的核心風險之一是數據泄露或篡改&#xff08;如設備控制參數、建筑安防布局、人員動線數據&#xff09;&#xff0c;需覆蓋數據流轉的每個環節&#xff1a;1. 數據采集階段&#xff1a…

Vue3組件加載順序

父組件&#xff1a;QualityFile.vue<script setup lang"ts" name"QualityFile"> ...... </script><template><el-container class"container"><el-header class"header"><!-- 標題 --><div cl…

GitHub 宕機自救指南:應急預案與替代平臺

GitHub 宕機自救指南:應急預案與替代平臺 對于全球數百萬開發者而言,GitHub 的穩定運行至關重要。然而,即便是最可靠的服務也可能出現意外中斷。當 GitHub 無法訪問時,代碼托管、協作開發、持續集成與部署(CI/CD)等關鍵環節都將受到影響。本指南旨在為您提供一套完整的應…

將跨平臺框架或游戲引擎開發的 macOS 應用上架 Mac App Store

隨著 macOS 用戶數量的增長&#xff0c;越來越多的開發者希望將自己的桌面應用或游戲上架到 Mac App Store&#xff0c;以便觸達更多用戶并獲得官方的分發優勢。但 Apple 的上架流程相比其他平臺要嚴格得多&#xff0c;涉及簽名、打包、沙盒、審核、公證等環節。本文將以博文的…