ADS1220高精度ADC(TI)——應用 源碼

文章目錄

    • 德州儀器ADS1220概述
    • 資料
    • 引腳&封裝
    • 布線
    • 寄存器
      • 配置寄存器0(00h)
      • 配置寄存器1(01h)
      • 配置寄存器2(02h)
      • 配置寄存器3(03h)
    • 連續轉換流程
    • 驅動源碼
      • ads1220.c
      • ads1220.h

德州儀器ADS1220概述

  • 高性能 24 位Δ-Σ 模數轉換器(ADC)

  • 支持兩個差分輸入或四個單端輸入

  • 集成了低噪聲可編程增益放大器(PGA)、雙可編程激勵電流源、電壓基準、振蕩器、低側開關以及精密溫度傳感器

  • 支持高達 2000 SPS 的采樣速率,并能在單周期內完成穩定轉換

  • 其數字濾波器在 20SPS 采樣頻率下可同時抑制 50Hz 和 60Hz 干擾

  • 內部 PGA 提供高達 128V/V 的增益,特別適用于小型傳感器信號測量

  • 器件支持偽差分或全差分信號測量,并可通過配置禁用內部 PGA,在保持高輸入阻抗的同時提供最高 4V/V 增益,實現單端測量

  • 在禁用 PGA 的占空比模式下,器件功耗可低至 120μA

  • ADS1220 采用 VQFN-16 或 TSSOP-16 封裝,工作溫度范圍為 -40°C 至 +125°C,適用于嚴苛環境下的精密測量應用。

資料

ADS1220 DATASHEET

引腳&封裝

請添加圖片描述
請添加圖片描述

布線

在這里插入圖片描述
在AIN0和AIN1之間、AIN2和AIN3之間、REFP0和REFN0之間的外圍都是兩個電阻三個電容,其作用如下:

  • 抗混疊濾波
    差分電容與電阻構成一階RC濾波器,用于限制高頻噪聲和混疊效應。Δ-Σ ADC的調制器以高頻(如256kHz)采樣輸入信號,未衰減的高頻成分會混疊到通帶,導致測量誤差。
  • 共模噪聲抑制
    共模電容用于衰減共模噪聲。差分電容應比共模電容大10倍,以避免電容不匹配將共模噪聲轉為差分噪聲。
  • 保護ADC輸入
    外部濾波器電阻還限制輸入過壓時的電流,保護內部ESD二極管。

寄存器

在這里插入圖片描述

配置寄存器0(00h)

  • MUX[3:0] :輸入多路復用器配置,選擇差分/單端輸入組合或系統監測功能(如電源/基準監測)。
    單端測量需禁用PGA,差分測量可啟用PGA高增益。
  • GAIN[2:0] :設置PGA增益(1至128),禁用PGA時僅支持增益1/2/4。
    低噪聲放大器,用于放大微小傳感器信號(如熱電偶/RTD)。
  • PGA_BYPASS:禁用和旁路PGA以擴展共模電壓范圍(AVSS-0.1V至AVDD+0.1V)。
    單端信號測量或需寬共模電壓時啟用。 當PGA旁路時,內部放大器被禁用,犧牲增益換取更寬輸入范圍。

配置寄存器1(01h)

  • DR[2:0]:選擇數據速率(5SPS至2kSPS),隨工作模式(正常/占空比/Turbo)變化。
  • MODE[1:0]:設置工作模式(正常/占空比/Turbo)。
  • CM:轉換模式選擇(單次/連續)。
  • TS:啟用內部溫度傳感器模式。
  • BCS:控制10μA燒毀電流源,用于傳感器故障檢測。
    燒毀電流源用于檢測傳感器開路(拉至滿量程)或短路(近零讀數),但會引入測量誤差,精密測量需禁用以避免干擾。

配置寄存器2(02h)

  • VREF[1:0] :選擇基準源(內部2.048V/外部基準/電源)。
  • 50/60[1:0] :配置FIR濾波器抑制50Hz/60Hz工頻干擾。
    啟用抑制會限制數據速率(僅20SPS或5SPS下有效)。
    未啟用時(50/60[1:0]=00),濾波器帶寬更寬,適合高頻信號但抗干擾能力下降。
  • PSW:控制低側電源開關(AIN3/REFN1至AVSS)。
  • IDAC[2:0] :設置激勵電流源輸出(10μA至1.5mA)。
    典型應用是為RTD(電阻溫度檢測器)等傳感器提供精確的激勵電流,通過將IDAC1和IDAC2分別接入RTD的兩條引線,利用匹配的電流抵消引線電阻產生的壓降誤差。
    IDAC合規電壓是電流源輸出端電壓需≤AVDD-0.9V,否則精度下降。

配置寄存器3(03h)

  • I1MUX[2:0]:路由IDAC1至指定引腳(AINx或基準輸入)。
  • I2MUX[2:0]:路由IDAC2至指定引腳(AINx或基準輸入)。
  • DRDYM:選擇DRDY指示模式(僅專用引腳或復用DOUT/DRDY)。
  • 保留位:固定寫0。

連續轉換流程

  1. 上電:延遲以允許電源穩定并完成上電復位(最小50 μs)。
  2. 配置SPI接口:將微控制器的SPI接口配置為模式1(CPOL = 0CPHA = 1)。
  3. 配置片選引腳:如果片選(CS)引腳未永久接地,將連接到CS的微控制器GPIO配置為輸出。
  4. 配置數據準備好引腳:將連接到DRDY引腳的微控制器GPIO配置為下降沿觸發的中斷輸入。
  5. 拉低片選信號:將CS拉低以選中設備。
  6. 延遲CSSC時間:延遲至少td(CSSC)的時間。
  7. 發送復位命令:發送復位命令(06h),確保設備在上電后正確復位。
  8. 延遲復位時間:延遲至少50 μs + 32 * t(CLK)的時間。
  9. 寫入寄存器配置:使用WREG命令(43h, 08h, 04h, 10h, 和00h)寫入相應的寄存器配置。
  10. 可選配置驗證:作為可選的驗證步驟,使用RREG命令(23h)讀回所有配置寄存器。
  11. 啟動轉換:發送START/SYNC命令(08h),以連續轉換模式啟動轉換。
  12. 延遲SCCS時間:延遲至少td(SCCS)的時間。
  13. 釋放片選信號:將CS拉高以重置串行接口。
  14. 數據讀取循環,循環執行以下操作:
    14.1 等待DRDY引腳變為低電平。
    14.2 將CS拉低。
    14.3 延遲至少td(CSSC)的時間。
    14.4 發送24個SCLK上升沿,以從DOUT/DRDY讀取轉換數據。
    14.5 延遲至少td(SCCS)的時間。
    14.6 將CS拉高。
  15. 進入待機模式
    15.1 將CS拉低。
    15.2 延遲至少td(CSSC)的時間。
    15.3 發送POWERDOWN命令(02h),停止轉換并將設備置于待機模式。
    15.4 延遲至少td(SCCS)的時間。
    15.5 將CS拉高。

注:上面的步驟14.1中,等待DRDY引腳變為低電平,但在一些應用中,DRDY引腳可能沒有接入MCU。
這種情況可以等待DOUT/DRDY引腳變為低電平,以確認ADC已經完成轉化。
但需要注意先拉低片選,再去等待DOUT/DRDY引腳變為低電平。
.
在這里插入圖片描述

驅動源碼

ads1220.c

/********************************************************************************* @file    ads1220.c* @author  zjq* @brief   ads1220 bsp*******************************************************************************/
#include "ads1220.h"
#include "Gpio.h"
#include "spi.h"/* Cmd ***********************************************************************/
const uint8_t ADS1220_CMD_RESET     = 0x06;
const uint8_t ADS1220_CMD_START     = 0x08;
const uint8_t ADS1220_CMD_RDATA     = 0x10;
const uint8_t ADS1220_CMD_PWR_DOWN  = 0x02;
const uint8_t ADS1220_CMD_READ_REG  = 0x20;
const uint8_t ADS1220_CMD_WRITE_REG = 0x40;/* Static Function ***********************************************************/
static ADS1220_StatusTypedef ADS1220_SPI_Write(uint8_t const *pWrite, uint8_t len);
static ADS1220_StatusTypedef ADS1220_SPI_Receive(uint8_t *pRecv, uint8_t len);
static ADS1220_StatusTypedef ADS1220_WriteRegister(uint32_t regStartAddr, uint32_t regNum, uint8_t *pData);
static ADS1220_StatusTypedef ADS1220_ReadRegister(uint32_t regStartAddr, uint32_t regNum, uint8_t *pData);/*** @brief Use SPI Write to ADS1220* @param pWrite* @param len* @retval ADS1220 Status*/
static ADS1220_StatusTypedef ADS1220_SPI_Write(uint8_t const *pWrite, uint8_t len)
{for (uint8_t i = 0; i < len; i++){if (HAL_OK != HAL_SPI_Transmit(&hspi3, &pWrite[i], 1, 10)){return ADS1220_FAIL;}}return ADS1220_OK;
}/*** @brief Use SPI Read From ADS1220* @param pRecv* @param len* @retval ADS1220 Status*/
static ADS1220_StatusTypedef ADS1220_SPI_Receive(uint8_t *pRecv, uint8_t len)
{uint8_t temp = 0xff;for (uint8_t i = 0; i < len; i++){if (HAL_OK != HAL_SPI_TransmitReceive(&hspi3, &temp, &pRecv[i], 1, 10)){return ADS1220_FAIL;}}return ADS1220_OK;
}/*** @brief Write ADS1220 Register* @param regStartAddr* @param regNum* @param pData* @retval ADS1220 Status*/
static ADS1220_StatusTypedef ADS1220_WriteRegister(uint32_t regStartAddr, uint32_t regNum, uint8_t *pData)
{ADS1220_CS_LOW();HAL_Delay(10);uint8_t temp = ((regStartAddr << 2) & 0x0c);temp |= (regNum - 1) & 0x03;temp |= ADS1220_CMD_WRITE_REG;if (ADS1220_OK != ADS1220_SPI_Write(&temp, 1)){return ADS1220_FAIL;}if (ADS1220_OK != ADS1220_SPI_Write(pData, regNum)){return ADS1220_FAIL;}ADS1220_CS_HIGH();return ADS1220_OK;
}/*** @brief Read ADS1220 Register* @param regStartAddr* @param regNum* @param pData* @retval ADS1220 Status*/
static ADS1220_StatusTypedef ADS1220_ReadRegister(uint32_t regStartAddr, uint32_t regNum, uint8_t *pData)
{ADS1220_CS_LOW();HAL_Delay(5);uint8_t temp = ((regStartAddr << 2) & 0x0c);temp |= (regNum - 1) & 0x03;temp |= ADS1220_CMD_READ_REG;if (ADS1220_OK != ADS1220_SPI_Write(&temp, 1)){return ADS1220_FAIL;}if (ADS1220_OK != ADS1220_SPI_Receive(pData, regNum)){return ADS1220_FAIL;}ADS1220_CS_HIGH();return ADS1220_OK;
}/* Global Function ***********************************************************//*** @brief Initialize ADS1220* @param void* @note* @retval void*/
void ADS1220_Init(void)
{MX_SPI3_Init();ADS1220_Reset();
}/*** @brief Select ADS1220 channel* @param  chl* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Channal_Sel(uint8_t chl)
{static uint8_t recvTemp[4] = {0};static uint8_t sendTemp[4] = {0};switch (chl){case ADS1220_CH0:sendTemp[0] = MUX_P_AIN0_N_AVSS;break;case ADS1220_CH1:sendTemp[0] = MUX_P_AIN1_N_AVSS;break;case ADS1220_CH2:sendTemp[0] = MUX_P_AIN2_N_AVSS;break;case ADS1220_CH3:sendTemp[0] = MUX_P_AIN3_N_AVSS;break;}sendTemp[0] |= GAIN_1 | PGA_BYPASS;sendTemp[1] = DR_45SPS | MODE_NORMAL | CM_SINGLE | TS_OFF | BCS_OFF;sendTemp[2] = VREF_EXT_REF0_PINS | FIR_50_60 | PSW_OPEN | IDAC_OFF;sendTemp[3] = I1MUX_DISABLED | I2MUX_DISABLED | DRDY_ON_DOUT_DRDY;ADS1220_WriteRegister(0x00, 4, sendTemp);HAL_Delay(5);ADS1220_ReadRegister(0x00, 4, recvTemp);for (uint8_t i = 0; i < 4; i++){if (sendTemp[i] != recvTemp[i]){return ADS1220_FAIL;}}return ADS1220_OK;
}/*** @brief Start ADS1220 ADC convert* @param  void* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Start(void)
{ADS1220_CS_LOW();if (ADS1220_OK != ADS1220_SPI_Write(&ADS1220_CMD_START, 1)){ADS1220_CS_HIGH();return ADS1220_FAIL;}ADS1220_CS_HIGH();return ADS1220_OK;
}/*** @brief Reset ADS1220* @param  void* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Reset(void)
{ADS1220_CS_LOW();if (ADS1220_OK != ADS1220_SPI_Write(&ADS1220_CMD_RESET, 1)){ADS1220_CS_HIGH();return ADS1220_FAIL;}ADS1220_CS_HIGH();return ADS1220_OK;
}/*** @brief Wait ADS1220 DRDY pin* @param  timeout* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Wait_DRDY(uint8_t timeout)
{uint32_t beginTime = HAL_GetTick();ADS1220_CS_LOW();HAL_Delay(5);while ((HAL_GetTick() - beginTime) < timeout){if (ADS1220_DRDY_RDY == ADS1220_DRDY_GET()){ADS1220_CS_HIGH();return ADS1220_OK;}}ADS1220_CS_HIGH();return ADS1220_FAIL;
}/*** @brief Read ADS1220 ADC convert result* @param  void* @note* @retval Convert result*/
int32_t ADS1220_Read_Data(void)
{uint8_t  temp[3]   = {0};uint32_t returnVal = 0;ADS1220_CS_LOW();if (ADS1220_OK != ADS1220_SPI_Write(&ADS1220_CMD_RDATA, 1)){return 0;}if (ADS1220_OK != ADS1220_SPI_Receive(temp, 3)){return 0;}ADS1220_CS_HIGH();returnVal = (temp[0] << 16) | (temp[1] << 8) | (temp[2]);if (returnVal & 0x800000){returnVal |= 0xff000000;}return returnVal;
}/*** @brief ADS1220 ADC convert once and read result* @param  chl* @note* @retval Convert result*/
int32_t ADS1220_ReadConvertOnce(uint8_t chl)
{ADS1220_Channal_Sel(chl);ADS1220_Start();ADS1220_Wait_DRDY(30);return ADS1220_Read_Data();
}

ads1220.h

/********************************************************************************* @file    ads1220.h* @author  zjq* @brief   ads1220 bsp*******************************************************************************/
#ifndef __ADS_1220_H
#define __ADS_1220_H#include "stdint.h"
#include "sys.h"/* 函數返回值 */
typedef enum
{ADS1220_OK   = 0x00U,ADS1220_FAIL = 0x01U,
} ADS1220_StatusTypedef;/* 通道選擇 */
#define ADS1220_CH0          (0)
#define ADS1220_CH1          (1)
#define ADS1220_CH2          (2)
#define ADS1220_CH3          (3)/* Reg0 [7:4]MUX */
#define MUX_P_AIN0_N_AIN1    (0X00U)
#define MUX_P_AIN0_N_AIN2    (0X10U)
#define MUX_P_AIN0_N_AIN3    (0X20U)
#define MUX_P_AIN1_N_AIN2    (0X30U)
#define MUX_P_AIN1_N_AIN3    (0X40U)
#define MUX_P_AIN2_N_AIN3    (0X50U)
#define MUX_P_AIN1_N_AIN0    (0X60U)
#define MUX_P_AIN3_N_AIN2    (0X70U)
#define MUX_P_AIN0_N_AVSS    (0X80U)
#define MUX_P_AIN1_N_AVSS    (0X90U)
#define MUX_P_AIN2_N_AVSS    (0XA0U)
#define MUX_P_AIN3_N_AVSS    (0XB0U)
#define MUX_P_REFP_N_REFN    (0XC0U)
#define MUX_P_AVDD_N_AVSS    (0XD0U)
#define MUX_PN_SHORT_HALFVDD (0XE0U)
/* Reg0 [3:1]GAIN */
#define GAIN_1               (0X00U)
#define GAIN_2               (0X02U)
#define GAIN_4               (0X04U)
#define GAIN_8               (0X06U)
#define GAIN_16              (0X08U)
#define GAIN_32              (0X0AU)
#define GAIN_64              (0X0CU)
#define GAIN_128             (0X0EU)
/* Reg0 [0]PGA_BYPASS */
#define PGA_BYPASS           (0X01U)
#define PGA_AMP              (0X00U)
/* Reg1 [7:5]DR */
#define DR_20SPS             (0X00U)
#define DR_45SPS             (0X20U)
#define DR_90SPS             (0X40U)
#define DR_175SPS            (0X60U)
#define DR_330SPS            (0X80U)
#define DR_600SPS            (0XA0U)
#define DR_1000SPS           (0XC0U)
/* Reg1 [4:3]MODE */
#define MODE_NORMAL          (0X00U)
#define MODE_DUTY            (0X08U)
#define MODE_TURBO           (0X10U)
/* Reg1 [2]CM */
#define CM_SINGLE            (0X00U)
#define CM_CONTINUE          (0X04U)
/* Reg1 [1]TS */
#define TS_ON                (0X02U)
#define TS_OFF               (0X00U)
/* Reg1 [0]BCS */
#define BCS_ON               (0X01U)
#define BCS_OFF              (0X00U)
/* Reg2 [7:6]VREF */
#define VREF_INTERNAL        (0X00U)
#define VREF_EXT_REF0_PINS   (0X40U)
#define VREF_EXT_REF1_PINS   (0X80U)
#define VREF_AVDD            (0XC0U)
/* Reg2 [5:4]50/60 */
#define FIR_NONE             (0X00U)
#define FIR_50_60            (0X10U)
#define FIR_50               (0X20U)
#define FIR_60               (0X30U)
/* Reg2 [3]PSW */
#define PSW_OPEN             (0X00U)
#define PSW_CLOSES           (0X08U)
/* Reg2 [2:0]IDAC */
#define IDAC_OFF             (0X00U)
#define IDAC_10uA            (0X01U)
#define IDAC_50uA            (0X02U)
#define IDAC_100uA           (0X03U)
#define IDAC_250uA           (0X04U)
#define IDAC_500uA           (0X05U)
#define IDAC_1000uA          (0X06U)
#define IDAC_1500uA          (0X07U)
/* Reg3 [7:5]I1MUX */
#define I1MUX_DISABLED       (0X00U)
#define I1MUX_AIN0           (0X20U)
#define I1MUX_AIN1           (0X40U)
#define I1MUX_AIN2           (0X60U)
#define I1MUX_AIN3           (0X80U)
#define I1MUX_REFP0          (0XA0U)
#define I1MUX_REFN0          (0XC0U)
/* Reg3 [4:2]I2MUX */
#define I2MUX_DISABLED       (0X00U)
#define I2MUX_AIN0           (0X04U)
#define I2MUX_AIN1           (0X08U)
#define I2MUX_AIN2           (0X0CU)
#define I2MUX_AIN3           (0X10U)
#define I2MUX_REFP0          (0X14U)
#define I2MUX_REFN0          (0X18U)
/* Reg3 [1]DRDYM */
#define DRDY_ON_DOUT_DRDY    (0X02U)
#define DRDY_ON_DRDY_ONLY    (0X00U)/* Global Function ***********************************************************/
/*** @brief Initialize ADS1220* @param void* @note* @retval void*/
void ADS1220_Init(void);/*** @brief Select ADS1220 channel* @param  chl* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Channal_Sel(uint8_t chl);/*** @brief Start ADS1220 ADC convert* @param  void* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Start(void);/*** @brief Reset ADS1220* @param  void* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Reset(void);/*** @brief Wait ADS1220 DRDY pin* @param  timeout* @note* @retval ADS1220 Status*/
ADS1220_StatusTypedef ADS1220_Wait_DRDY(uint8_t timeout);/*** @brief Read ADS1220 ADC convert result* @param  void* @note* @retval Convert result*/
int32_t ADS1220_Read_Data(void);/*** @brief ADS1220 ADC convert once and read result* @param  chl* @note* @retval Convert result*/
int32_t ADS1220_ReadConvertOnce(uint8_t chl);#endif

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

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

相關文章

Uniapp 安卓實現訊飛語音聽寫(復制即用)

在移動應用開發中&#xff0c;語音交互功能能夠極大提升用戶體驗&#xff0c;讓操作更加便捷自然。訊飛語音聽寫技術憑借其高準確率和穩定性&#xff0c;成為眾多開發者的選擇。本文將詳細介紹如何在 Uniapp 項目中&#xff0c;實現安卓端的訊飛語音聽寫功能&#xff0c;幫助你…

【golang】DNS 資源記錄(RR)接口

Go 中 miekg/dns 包對 DNS 資源記錄&#xff08;RR&#xff09;接口 的定義&#xff1a; type RR interface {Header() *RR_HeaderString() stringcopy() RRlen(off int, compression map[string]struct{}) intpack(...)unpack(...)parse(...)isDuplicate(r2 RR) bool }這個接…

16.2 VDMA視頻轉發實驗之模擬源

文章目錄 1 實驗任務2 系統框圖3 硬件設計3.1 IP核配置3.2 注意事項3.3 自定義IP核源碼 4 軟件設計4.1 注意事項4.2 工程源碼4.2.1 main.c文件 1 實驗任務 基于14.1&#xff0c;相較于16.1&#xff0c;使用自定義IP核vid_gen_motion替換Xilinx TPG IP核。 2 系統框圖 基于14…

深度學習之用CelebA_Spoof數據集搭建一個活體檢測-訓練好的模型用MNN來推理

一、模型轉換準備 首先確保已完成PyTorch到ONNX的轉換&#xff1a;深度學習之用CelebA_Spoof數據集搭建活體檢測系統&#xff1a;模型驗證與測試。這里有將PyTorch到ONNX格式的模型轉換。 二、ONNX轉MNN 使用MNN轉換工具進行格式轉換&#xff1a;具體的編譯過程可以參考MNN的…

JVM學習專題(一)類加載器與雙親委派

目錄 1、JVM加載運行全過程梳理 2、JVM Hotspot底層 3、war包、jar包如何加載 4、類加載器 我們來查看一下getLauncher&#xff1a; 1.我們先查看getExtClassLoader() 2、再來看看getAppClassLoader(extcl) 5、雙親委派機制 1.職責明確&#xff0c;路徑隔離?&#xff…

部署安裝gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm

目錄 ?編輯 實驗環境 所需軟件 實驗開始 安裝部署gitlab171.配置清華源倉庫&#xff08;版本高的系統無需做&#xff09;vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下載包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…

使用LoRA微調Qwen2.5-VL-7B-Instruct完成電氣主接線圖識別

使用LoRA微調Qwen2.5-VL-7B-Instruct完成電氣主接線圖識別 動機 任務適配需求 Qwen2.5-VL在視覺理解方面表現優異&#xff0c;但電氣主接線圖識別需要特定領域的結構化輸出能力&#xff08;如設備參數提取、拓撲關系解析&#xff09;。微調可增強模型對專業符號&#xff08;如…

系統集成項目管理工程師學習筆記

第九章 項目管理概論 1、項目基本要素 項目基礎 項目是為創造獨特的產品、服務或成果而進行的臨時性工作。 項目具有臨時性、獨特性、漸進明細的特點。項目的“臨時性”是指項目只有明確的起點和終點。“臨時性”并一定意味著項目的持續時間短。 項目可宣告結束的情況&…

Secs/Gem第七講(基于secs4net項目的ChatGpt介紹)

好的&#xff0c;那我們現在進入&#xff1a; 第七講&#xff1a;掉電重連后&#xff0c;為什么設備不再上報事件&#xff1f;——持久化與自動恢復的系統設計 關鍵詞&#xff1a;掉電恢復、狀態重建、初始化流程、SecsMessage 緩存機制、自動重連、事件再注冊 本講目標 你將理…

室內定位:熱門研究方向與未解難題深度解析

I. 引言:對普適性室內定位的持續探索 A. 室內定位在現代應用中的重要性 室內定位系統(IPS)正迅速成為眾多應用領域的基石技術,其重要性源于現代社會人們約70%至90%的時間在室內度過的事實 1。這些應用橫跨多個行業,包括應急響應 1、智能建筑與智慧城市 6、醫療健康(如病…

Android學習總結之Glide自定義三級緩存(實戰篇)

一、為什么需要三級緩存 內存緩存&#xff08;Memory Cache&#xff09; 內存緩存旨在快速顯示剛瀏覽過的圖片&#xff0c;例如在滑動列表時來回切換的圖片。在 Glide 中&#xff0c;內存緩存使用 LruCache 算法&#xff08;最近最少使用&#xff09;&#xff0c;能自動清理長…

Linux的文件查找與壓縮

查找文件 find命令 # 命令&#xff1a;find 路徑范圍 選項1 選項1的值 \[選項2 選項2 的值…]# 作用&#xff1a;用于查找文檔&#xff08;其選項有55 個之多&#xff09;# 選項&#xff1a;# -name&#xff1a;按照文檔名稱進行搜索&#xff08;支持模糊搜索&#xff0c;\* &…

python處理異常,JSON

異常處理 #異常處理 # 在連接MySQL數據庫的過程中&#xff0c;如果不能有效地處理異常&#xff0c;則異常信息過于復雜&#xff0c;對用戶不友好&#xff0c;暴露過多的敏感信息 # 所以&#xff0c;在真實的生產環境中&#xff0c; 程序必須有效地處理和控制異常&#xff0c;按…

線程的兩種實現方式

線程的兩種實現方式——內核支持線程&#xff08;kernal Supported Thread, KST&#xff09;&#xff0c; 用戶級線程&#xff08;User Level Thread, ULT&#xff09; 1. 內核支持線程 顧名思義&#xff0c;內核支持線程即為在內核支持下的那些線程&#xff0c;它們的創建&am…

vue3基礎學習(上) [簡單標簽] (vscode)

目錄 1. Vue簡介 2. 創建Vue應用 2.1 下載JS文件 2.2 引用JS文件 2.3 調用Vue方法?編輯 2.4 運行一下試試: 2.5 代碼如下 3.模塊化開發模式 3.1 Live Server插件 3.2 運行 4. 常用的標簽 4.1 reactive 4.1.1 運行結果 4.1.2 代碼: 4.2 ref 4.2.1 運行結果 4.2.2…

自定義分區器-基礎

什么是分區 在 Spark 里&#xff0c;彈性分布式數據集&#xff08;RDD&#xff09;是核心的數據抽象&#xff0c;它是不可變的、可分區的、里面的元素并行計算的集合。 在 Spark 中&#xff0c;分區是指將數據集按照一定的規則劃分成多個較小的子集&#xff0c;每個子集可以獨立…

深入解析HTTP協議演進:從1.0到3.0的全面對比

HTTP協議作為互聯網的基礎協議&#xff0c;經歷了多個版本的迭代演進。本文將詳細解析HTTP 1.0、HTTP 1.1、HTTP/2和HTTP/3的核心特性與區別&#xff0c;幫助開發者深入理解網絡協議的發展脈絡。 一、HTTP 1.0&#xff1a;互聯網的奠基者 核心特點&#xff1a; 短連接模式&am…

基于windows環境Oracle主備切換之后OGG同步進程恢復

基于windows環境Oracle主備切換之后OGG同步進程恢復 場景&#xff1a;db1是主庫&#xff0c;db2是備庫&#xff0c;ogg從db2備庫抽取數據同步到目標數據庫 db1 - db2(ADG) – ogg – targetdb 場景&#xff1a;db2是主庫&#xff0c;db1是備庫&#xff0c;ogg從db1備庫抽取數…

微服務,服務粒度多少合適

項目服務化好處 復用性&#xff0c;消除代碼拷貝專注性&#xff0c;防止復雜性擴散解耦合&#xff0c;消除公共庫耦合高質量&#xff0c;SQL穩定性有保障易擴展&#xff0c;消除數據庫解耦合高效率&#xff0c;調用方研發效率提升 微服務拆分實現策略 統一服務層一個子業務一…

【工奧閥門科技有限公司】簽約智橙PLM

近日&#xff0c;工奧閥門科技有限公司正式簽約了智橙泵閥行業版PLM。 忠于質量&#xff0c;臻于服務&#xff0c;精于研發 工奧閥門科技有限公司&#xff08;以下簡稱工奧閥門&#xff09;坐落于浙江永嘉&#xff0c;是一家集設計、開發、生產、銷售、安裝、服務為一體的閥門…