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.mzph.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;是一家集设计、开发、生产、销售、安装、服务为一体的阀门…