基于STM32G474的SPI获取MT6816编码器绝对角度配置指南
前言:最近上手使用了一款编码器芯片,也是先艰难阅读了一下全英文版本的编码器的规格手册,然后通过SPI读取了一下绝对值角度。虽然发现使用起来还是挺简单的,但使用后还是会产生一个对其原理层面的好奇,比如磁编码器内部是如何工作的等等,了解多点不算多,简单记录一下。。。
1,关于编码器
目前市场上面比较常见的编码器有三种:光电编码器、磁编码器、 电感式编码器。三种编码器的用途各有异同。
1.1 光电编码器(Optical Encoder)
-
原理:通过发光器件(如LED)照射在带有透明和不透明图案的码盘上,接收器读取透光或遮光信号来判断位置或角度。本质是“光线切割式”计数
-
优点:精度高、分辨率可达上千线以上
-
缺点:易受灰尘、油污干扰
-
应用:工业自动化、高精度电机控制
1.2 电感式编码器(Inductive Encoder)
-
原理:通过电磁感应原理(类似变压器)检测金属目标的位置变化。
-
优点:抗灰尘油污能力强,适合恶劣环境
-
缺点:成本高、响应慢于磁式
-
应用:航空、军工、重工业
1.3 磁编码器(Magnetic Encoder)
-
原理:使用磁铁 + 霍尔、GMR 或 TMR 传感器检测磁场变化,计算角度或位置。本质是“磁场变化”感知角度。。。磁编码器主要由两个部分组成:永磁体(磁环或磁钢)、磁传感器芯片(如霍尔传感器或磁阻传感器)。当磁体随着轴旋转时,磁场的方向和强度会随之变化,磁传感器芯片感应到这些变化后,通过内部算法将其转换为角度信号或位置信号。。
以 MT6816 为代表的磁编码器通常使用 多轴霍尔传感器阵列,能够精确检测 X、Y 平面的磁通密度:永磁体磁场在平面上随旋转而变化,芯片感应到磁通分量 BxB_xBx 和 ByB_yBy,利用三角函数计算角度:θ=arctan2(By,Bx),这个角度就是当前磁体相对于初始位置的旋转角度
-
优点:抗干扰强、结构紧凑、耐环境
-
缺点:精度稍低于光电
-
应用:汽车、电动工具、伺服电机
2,MT6816简介
MT6816CT 是麦歌恩(MagEnc/Magconn)推出的一款 磁编码器芯片,集成了磁场感应、信号处理和角度解码模块,适用于旋转位置测量。MT6816CT 通过检测永磁体(一般安装在轴中心)周围的磁场变化来判断角度,适合高精度、无接触式的旋转测量应用。
2.1 主要特点

2.2 一般说明
- MagnTek旋转位置传感器MT6816是款基于先进AMR技术的IC。
- 在x-y传感器平面内的旋转磁场产生两个正弦信号,表示传感器与磁场方向的夹角(a)。
- 该传感器仅对x-y平面中的磁场方向敏感,因为传感元件的输出被专门设计为独立于磁场强度。这使得设备对磁场变化、杂散磁场、气隙变化和轴心偏移的敏感度降低。
- 该传感器系列提供增量ABZ输出模式使芯片适合替换各种光学编码器。
- 最大分辨率为每转4096步或1024脉冲。
- 标准的 SPI(3线或4线)接口允许主机微控制器从 MT6816 中读取 14 位绝对角度位置数据。
- 绝对角度位置也作为 12位PWM 输出提供。
2.3 外围电路定义
在这里选用的是4线SPI模式,所以下面连接的主控的接口也会是SPI的4总线模式
2.4 内部结构图
3,MT6816的SPI模式介绍
3.1 MT6816SPI时序
MT6816 SPI使用模式=3(CPOL=1,CPHA=1)来交换数据。如图所示,数据传输从CSN的下降沿开始。MT6816在SCK的上升沿上采样数据,数据传输最终随着CSN的上升沿停止。
3.2 四线SPI协议
SPI数据传输从CSN的下降沿开始,并在CSN的上升沿停止。SCK是串行端口时钟,由SPI主设备控制,在没有SPI传输时为高电平。MOSI(主输出从输入)和MISO(主输入从输出)是串行端口的输入和输出,在SCK的下降沿驱动,应该在SCK的上升沿捕获。
- 位0:读/写命令位,当它低时,数据DI7~DI0被写入设备,当它高时,从设备读取数据DO7~D00。
- 位1-7:地址A6~A0。这是索引寄存器的地址字段。位8-15:数据DI7~DI0(写入模式)。这是将被写入设备的数据(MSB首先
- 位 8-15:数据 D07~DO0(读取模式)。这是将从设备读取的数据(MSB首先)
3.3 四线SPI读取角度
0~360°的绝对角度0可以通过以下公式计算:
位 0x04[1]这是一个诊断位,表示磁通密度不足。当MT6816无法检测到足够的磁场以进行正常操作时,此位被设置为高。
位 0x04[0]是奇偶检验位,它遵循偶检验规则。如果0x03【7:0】和0x04【7:1】的逻辑高的个数为偶数,则0x04[0]=0.如果0x03【7:0】和0x04【7:1】的逻辑高是奇数,0x04[0]=1
4,基于STM32G474的MT6816的SPI获取角度配置代码
基本逻辑是拉低片选,写入1000 0010(0x83 最高位代表读取,后7位代表读取的索引寄存器的地址字段),写入03寄存器的地址和指令,读取03寄存器的数据,拉高片选,得到第一个数据,再次拉低片选,写入0x04寄存器的地址和指令,读取04寄存器的数据,将得到的14bit的数据进行拼接就可以得到对应的编码器的角度数值,除以16384,乘以角度360°得到角度值。
驱动都是通过cubemx配置得到的,后面的角度获取进行位操作获取一下就可以了
spi.c
/* USER CODE BEGIN Header */
/********************************************************************************* @file spi.c* @brief This file provides code for the configuration* of the SPI instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "spi.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */SPI_HandleTypeDef hspi1;
DMA_HandleTypeDef hdma_spi1_tx;
DMA_HandleTypeDef hdma_spi1_rx;// #define SPI_DMA_BUFFER_SIZE 16// uint8_t spi_tx_buffer[SPI_DMA_BUFFER_SIZE];
// uint8_t spi_rx_buffer[SPI_DMA_BUFFER_SIZE];
/* spi1 init function */
void MX_SPI1_Init(void)
{/* USER CODE BEGIN spi1_Init 0 *//* USER CODE END spi1_Init 0 *//* USER CODE BEGIN spi1_Init 1 *//* USER CODE END spi1_Init 1 */hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_16BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 7;hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;if (HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN SPI1_Init 2 */}void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(spiHandle->Instance==SPI1){/* USER CODE BEGIN SPI1_MspInit 0 *//* USER CODE END SPI1_MspInit 0 *//* SPI1 clock enable */__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_DMA1_CLK_ENABLE();/**SPI1 GPIO ConfigurationPB5 ------> SPI1_SCKPB6 ------> SPI1_MISOPB7 ------> SPI1_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN SPI1_MspInit 1 *//* SPI1 interrupt Init */HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(SPI1_IRQn);/* USER CODE END SPI1_MspInit 1 */}
}void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{if(spiHandle->Instance==SPI1){/* USER CODE BEGIN SPI1_MspDeInit 0 *//* USER CODE END SPI1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_SPI1_CLK_DISABLE();/**SPI1 GPIO ConfigurationPB5 ------> SPI1_SCKPB6 ------> SPI1_MISOPB7 ------> SPI1_MOSI*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);/* SPI1 interrupt Deinit */HAL_NVIC_DisableIRQ(SPI1_IRQn);/* USER CODE BEGIN SPI1_MspDeInit 1 *//* USER CODE END SPI1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{if (hspi == &hspi1){// printf("SPI1 DMA Transfer Completed!\r\n");}
}/* USER CODE END 1 */
spi.h
/* USER CODE BEGIN Header */
/********************************************************************************* @file spi.h* @brief This file contains all the function prototypes for* the spi.c file******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SPI_H__
#define __SPI_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes */extern SPI_HandleTypeDef hspi1;
extern DMA_HandleTypeDef hdma_spi1_tx;
extern DMA_HandleTypeDef hdma_spi1_rx;/* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_SPI1_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif#endif /* __SPI_H__ */
mt6816.c
#include "mt6816.h"
#include "FastMath.h"// E_MISO ----> PA6
// E_MOSI ----> PA7
// E_SCK ----> PA5
// E_NSS ----> PA15
// E_DI2 ----> PB3/************************************************** SPI接发数据的驱动配置接口* ***********************************************/
void GPIO_NSS_init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pins : PB9 */GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);SPI_NSS_0(); //设置低电平选中芯片
}static uint8_t SPI_ReadWriteOneByte(uint8_t tx_data)
{uint8_t Rxdata = 0, ret = 0;ret = HAL_SPI_TransmitReceive(&hspi1, &tx_data, &Rxdata, 1, 0xffffffff); //阻塞方式读写if (ret == 0) return Rxdata; return 0;
}static uint8_t SPI_ReadWriteData(uint8_t const *tx_data, uint8_t *Rxdata, uint16_t len)
{return HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)tx_data, Rxdata, len, 0xffffffff); //阻塞方式读写
}/*** 绝对值 编码器初始化*/
void mt6816_absolute_init(void)
{GPIO_NSS_init();MX_SPI1_Init();
}
/************************************************ SPI 读取编码器角度值 ***********************************************/
/*
绝对角度寄存器 Angle[13:0]
|-----------------------------------------------
|地址|位7||位6||位5||位4||位3||位2||位1||位0|类型|
|-----------------------------------------------
|0x003| Angle[13:6] |只读|
|-----------------------------------------------
|0x004| Angle[5:0] |只读|
|-----------------------------------------------
*/
uint16_t mt6816_read_angle(void)
{uint16_t Angle = 0;uint8_t status = 0; //检测磁通密度是否满足条件uint8_t TxData[2] = {0};uint8_t RxData[2] = {0};uint8_t ret = 0; TxData[0] = Read | 0x03;TxData[1] = Read | 0x04;SPI_NSS_0();ret = SPI_ReadWriteData((uint8_t const *)&TxData[0], (uint8_t *)&RxData[0], 1);SPI_NSS_1();SPI_NSS_0();ret = SPI_ReadWriteData((uint8_t const *)&TxData[1], (uint8_t *)&RxData[1], 1);SPI_NSS_1();if (ret == 0) {status = RxData[1]&0x02; if (status == 0) {Angle = ((uint16_t)RxData[0] << 5) | ((uint16_t)RxData[1] >> 2);}}// float e_angle = Angle / 16384 * 2 * 3.14159265359f;OSA_INFO("read angle/%.2f, status/%d", Angle, status);return Angle;
}
mt6816.h
#ifndef MT6816_H
#define MT6816_H
#include <stdio.h>
#include <stdint.h>
#include <string.h>#include "spi.h"
#include "gpio.h"
#include "tim.h"#ifdef __cplusplus
extern "C" {
#endif// PB9-NSS
#define SPI_NSS_0() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)
#define SPI_NSS_1() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)//CMD
#define Read 0x80
#define Write 0x00/*** 绝对值 编码器初始化*/
void mt6816_absolute_init(void);
uint16_t mt6816_read_angle(void);#ifdef __cplusplus
}
#endif#endif
上面所写的很多内容是参考官方的手册翻译过来的,有兴趣的小伙伴可以看一下原版的手册,已经上传到文章顶端了。。。
参考文章:
STM32 SPI获取MT6816磁编码器绝对角度-CSDN博客
步进电机驱动(Xdrive)学习2.1- MT6816 磁编码器-CSDN博客
相关文章:
基于STM32G474的SPI获取MT6816编码器绝对角度配置指南
前言:最近上手使用了一款编码器芯片,也是先艰难阅读了一下全英文版本的编码器的规格手册,然后通过SPI读取了一下绝对值角度。虽然发现使用起来还是挺简单的,但使用后还是会产生一个对其原理层面的好奇,比如磁编码器内部…...
深入学习ReentrantLock
ReentrantLock 0. 前言:为什么需要 ReentrantLock?1. 基础概念与核心特性1.1 什么是 ReentrantLock?1.2 ReentrantLock vs. synchronized1.3 核心特性详解1.3.1 可重入性 (Reentrancy)1.3.2 公平性选择 (Fairness Choice)1.3.3 可中断获取锁 …...
Spring Boot 集成金蝶 API 演示
✨ Spring Boot 集成金蝶 API 演示:登录 / 注销 Cookie 保存 本文将通过 Spring Boot 完整实现一套金蝶接口集成模型,包括: ✅ 普通登录✅ AppSecret 登录✅ 注销✅ Cookie 保存与复用 📅 项目结构 src/ ├── controller/ │…...
适用于 HAL 的 AIDL
目录 设计初衷 注意 编写AIDLHAL接口 查找AIDLHAL接口 扩展接口 将现有HAL从HIDL转换为AIDL AIDL与HIDL之间的主要差异 针对HAL的供应商测试套件(VTS)测试 Android 11 中引入了在 Android 中使用 AIDL 实现 HAL 的功能, 从而可以在不使用 HIDL 的情况下实现 Android 的部分…...
49、Spring Boot 详细讲义(六)(SpringBoot2.x整合Mybatis实现CURD操作和分页查询详细项目文档)
项目文档:银行借据信息CURD操作和分页查询 一、项目概述 1. 项目简介 本项目旨在使用Spring Boot框架整合MyBatis连接Mysql数据库实现借据信息的增加、删除、修改和查询功能,同时支持分页查询,并提供对应的Restful风格的接口。 2.环境准备 2.1.工具和软件准备 JDK(建议…...
C# 运行web项目
1、web项目直接点击顶部运行...
GPU服务器声音很响可以怎么处理
当GPU服务器运行时噪音过大,通常是由于高负载下散热风扇高速运转所致。以下是分步骤的解决方案,帮助您有效降低噪音并保持设备稳定运行: 一、排查噪音来源 定位声源 • 使用 声级计 或手机分贝检测APP,确定最大噪音位置࿰…...
Java如何选择ojdbc驱动
如何选择ojdbc驱动? 取决于短板。 如果JDK版本高,数据库版本低,根据Oracle数据库版本选择。如果JDK版本低,数据库版本高,根据Java版本选择。 Oracle官网OJDBC驱动和受支持的JDK版本 23ai 21c 19c 驱动类型选择 oj…...
【微思就业推荐 】T岗位-北京,福州,厦门等地
到微思学习,免费推荐就业!学员内推! 原创 厦门微思网络 2025年04月 有哪些大公司在招OCP认证人才? 有哪些大公司在招聘拥有HCIE认证的人才 ① 委托单位:润欣商业管理(厦门)有限公司 央企-华润资产的子公司 岗位&am…...
Linux 命令全解析:从零开始掌握 Linux 命令行
Linux 作为一款强大的开源操作系统,广泛应用于服务器、嵌入式系统以及超级计算机领域。掌握 Linux 命令行技能,是每一位开发者和系统管理员的必备能力。本文将从基础开始,为你详细介绍常用的 Linux 命令,以及它们的使用场景和示例…...
2025年4月份生活有感
今天在5000B培训的下午,一起入所来的小伙伴,有个申请了深圳大学的博士,已录取。哎,想起了当年申博时候信心和决心不足,导致后面匆匆的拿了offer去工作。看到同事的选择还是非常羡慕,想到自己5月份的婚礼&am…...
鸿蒙系统开发状态更新字段区别对比
在鸿蒙系统开发中,状态管理是构建响应式UI的核心机制,主要通过装饰器(Decorators)实现字段的状态观测与更新。根据鸿蒙的版本(V1稳定版和V2试用版),支持的装饰器及其特性有所不同。以下是主要状…...
CEPH OSD_SLOW_PING_TIME_FRONT/BACK 警告处理
ceph config set mgr mon_warn_on_slow_ping_time 2000说明:mon_warn_on_slow_ping_time 该值默认为0,那么只要 osd 心跳超过 mon_warn_on_slow_ping_ratio of osd_heartbeat_grace. 也就是超过 mon_warn_on_slow_ping_ratio和mon_warn_on_slow_ping_rat…...
HTML应用指南:利用POST请求获取全国小菜园门店位置信息
小菜园作为一家以徽菜为主的快餐品牌,自2013年成立以来,凭借其独特的烹饪理念和精致的东方口味菜品,在中国市场上迅速崛起。该品牌强调少油少盐、减少调味品使用,旨在传承并发扬徽州风味的独特魅力。这种健康且不失美味的烹饪方式…...
Python在去中心化物联网中的应用:数据安全、智能合约与边缘计算的融合
Python在去中心化物联网中的应用:数据安全、智能合约与边缘计算的融合 在万物互联的时代,传统物联网(IoT)架构依赖于集中式服务器来管理数据、设备互联与身份认证。然而,随着设备数量激增,中心化架构的可扩展性、安全性和隐私问题逐渐暴露。去中心化物联网(DeIoT)通过…...
CEPH配置优化建议
一、硬件配置优化 磁盘选择: SSD 与 HDD 搭配:使用 SSD 作为 OSD 日志盘(Journal)或元数据存储,HDD 作为数据盘。推荐 SSD 与 HDD 的比例为 1:3~5,具体根据业务负载调整。 RAID 禁用:避免使用硬…...
深度学习入门:神经网络的学习
目录 1 从数据中学习1.1 数据驱动1.2 训练数据和测试数据 2损失函数2.1 均方误差2.2 交叉熵误差2.3 mini-batch学习2.4 mini-batch版交叉熵误差的实现2.5 为何要设定损失函数 3 数值微分3.1 数值微分3.3 偏导数 4 梯度4.1 梯度法4.2 神经网络的梯度 5 学习算法的实现5.1 2层神经…...
机器学习_决策树
决策树的特点 可以处理非线性的问题可解释强,没有θ模型简单,模型预测效率高 if else不容易显示的使用函数表达,不可微 决策树的生成和预测 生成:通过大量数据生成一颗非常好的树,用这棵树来预测新来的数据。 预测&…...
深入理解UML动态图:系统行为建模全景指南
目录 前言1. 动态图概述2. 用例图(Use Case Diagram)2.1 定义与作用2.2 应用价值2.3 实践建议 3. 顺序图(Sequence Diagram)3.1 定义与特征3.2 应用优势3.3 建模建议 4. 活动图(Activity Diagram)4.1 定义与…...
Linux驱动开发进阶(九)- SPI子系统BSP驱动
文章目录 1、前言2、SPI总线注册3、SPI设备注册4、SPI驱动注册5、SPI BSP驱动 1、前言 学习参考书籍以及本文涉及的示例程序:李山文的《Linux驱动开发进阶》本文属于个人学习后的总结,不太具备教学功能。 2、SPI总线注册 驱动源码文件:dri…...
wabpack学习记录
wabpack学习记录 前言 项目写了不少 对webpack了解甚少 只记住一些 必要的概念以及指令 所以像深究一下具体是什么 可以做什么 如何做等 package.json 文件详解 name: 项目的名称。 version: 项目的版本号。 description: 项目的描述。 author: 项目的作者或维护者信息。 l…...
计算机视觉——基于 Yolov8 目标检测与 OpenCV 光流实现目标追踪
1. 概述 目标检测(Object Detection)和目标追踪(Object Tracking)是计算机视觉中的两个关键技术,它们在多种实际应用场景中发挥着重要作用。 目标检测指的是在静态图像或视频帧中识别出特定类别的目标对象࿰…...
React 更新 state 中的数组
更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象,它虽然是可变的,但是却应该被视为不可变。同对象一样,当你想要更新存储于 state 中的数组时,你需要创建一个新的数组(或者创建一份已有数组…...
[250415] OpenAI 推出 GPT-4.1 系列,支持 1M token
目录 OpenAI 推出 GPT-4.1 系列 OpenAI 推出 GPT-4.1 系列 OpenAI 宣布,新一代 GPT-4.1 模型系列正式发布,包括 GPT-4.1, GPT-4.1 mini 和 GPT-4.1 nano 三款模型,该系列模型在各项性能指标上全面超越 GPT-4o 和 GPT-4o mini,尤其…...
分布式锁+秒杀异步优化
文章目录 问题思路setnx实现锁误删问题和解决方案Redis Lua脚本问题引出解决方案 setnx实现的问题Redission快速入门redission可重入锁原理 秒杀优化(异步优化)异步秒杀思路秒杀资格判断Redis消息队列 问题 比如我们两个机器都部署了我们项目,这里nginx使用轮询的方…...
数据服务化 VS 数据中台:战略演进中的价值重构
在企业数据战略的演进历程中,数据中台曾被视为解决数据孤岛的 “万能钥匙”,而数据服务化的兴起则标志着企业从 “数据资源囤积” 向 “数据价值释放” 的深刻转型。两者的核心差异不仅在于技术架构,更在于对数据资产的定位与使用理念的根本分…...
PL/SQL登录慢,程序连接Oracle 提示无法连接或无监听
PL/SQL登录慢,程序连接Oracle 提示无法连接或无监听 错误提示:ORA-12541: TNS: 无监听程序 的解决办法, 现象:PL/SQL登录慢,程序连接Oracle 提示无法连接或无监听 监听已经正常开起,但还是PL/SQL登录慢或…...
【JAVAFX】自定义FXML 文件存放的位置以及使用
情况 1:FXML 文件与调用类在同一个包中(推荐) 假设类 MainApp 的包是 com.example,且 FXML 文件放在 resources/com/example 下: 项目根目录 ├── src │ └── sample │ └── Main.java ├── src/s…...
DDoS(分布式拒绝服务)攻击
DDoS(分布式拒绝服务)攻击 这是一份全面系统的 DDoS(分布式拒绝服务攻击)知识总结,适合用于学习、报告、讲稿或者面试准备。内容涵盖定义、原理、危害、利用、工具、防护策略等。 一、什么是DDoS DDoS(Distributed Denial of Se…...
scikit-learn初探
KFold k交叉验证,k-1个作为训练集,剩下的作为测试集 split split(X, yNone, groupsNone)X: (n_samples, n_features)的矩阵,行数为n_samples,列数为n_features y:(n_samples,)为列向量,表示监…...
深入解析 sklearn 中的多种特征编码方式:功能、适用场景与选择建议
标题:深入解析 sklearn 中的多种特征编码方式:功能、适用场景与选择建议 摘要: 在机器学习中,特征编码是数据预处理的重要环节,直接影响模型的性能和效果。本文详细介绍了 sklearn 及其生态中(含第三方库…...
windows10 wsl2 安装ubuntu和docker
见 弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门-阿里云开发者社区 如果启动docker时报下面这个错, 那是因为systemctl没有启用 sudo systemctl start docker System has not been booted with systemd as init system (PID 1)…...
一文读懂WPF系列之依赖属性与附加属性
依赖属性与附加属性 依赖属性对比C#属性WPF依赖属性(Dependency Properties)优先级计算与值决策回调与验证机制WPF 自带的依赖属性自定义依赖属性 附加属性本质与定义与依赖属性的区别附加属性的典型应用场景自定义附加属性注意事项 属性…...
1×1卷积与GoogleNet
11卷积 卷积核的尺寸等于1的卷积核 11卷积有什么用 1. 通道混合与特征转换 背景:在卷积神经网络中,输入数据通常有多个通道(例如RGB图像有3个通道,经过卷积层后通道数可能会增加)。不同通道的特征图可能包含了不同的…...
Handsontable 表格组件的使用
文章目录 1. 安装 Handsontable2. 创建一个基本表格3. 主要配置3.1、 data 数据3.2、 columns 指定列配置 4. Handsontable 高级功能4.1、 添加排序4.2、 过滤数据4.3、 选中行高亮4.4、 只读单元格4.5、 校验数据 5. Handsontable 与 Vue结合6. 总结 Handsontable 是一个强大的…...
消息中间件面试题
前言 本章内容来自B站黑马程序员java大厂面试题与小林coding 如有侵权立即删除 博主学习笔记,如果有不对的地方,海涵。 如果这篇文章对你有帮助,可以点点关注,点点赞,谢谢你! 1.通用篇 1.1 什么是消息…...
数据结构与算法--1.判断数组中元素是否有重复
在C语言中,我们可以使用类似的方法来实现判断数组中是否有重复值的功能。由于C语言没有内置的哈希集合(如Python的set或C的unordered_set),我们需要自己实现一个简单的哈希表或使用其他方法。 方法一:暴力法ÿ…...
硬件工程师面试常见问题(1)
第一问:单片机上电后没有运转,首先要检查什么? (1)单片机供电是否正常& 电路焊接检查 用万用表测量对应引脚的供电电压,检查对不对。 (2)单片机复位是否释放 用万用表测量复位引…...
测试100问:web测试和APP测试的区别
哈喽,大家好,我是十二,那今天要为大家分享的是高频面试题:web测试和 App测试的区别。 从功能测试方面来讲,web测试和 App测试在测试的流程以及测试用例的设计上是没有区别的,那主要的区别包含以下三个方面&…...
Leetcode 3518. Smallest Palindromic Rearrangement II
Leetcode 3518. Smallest Palindromic Rearrangement II 1. 解题思路2. 代码实现 题目链接:Leetcode 3518. Smallest Palindromic Rearrangement II 1. 解题思路 这一题是题目Leetcode 3517. Smallest Palindromic Rearrangement I的升级版本,其主要的…...
Golang|订单相关
文章目录 秒杀写库策略确保缓存的订单数据不丢失 秒杀写库策略 在我们的抽奖函数中,抽中奖品、减库存成功返回给前端后就应该生成订单写入数据库 但是这里有问题,我们的抽奖函数是支持高并发的,并发量大的情况下mysql无法支持这么大并发量的写…...
Python+Playwright:编写自动化测试的避坑策略
PythonPlaywright:编写自动化测试的避坑策略 前言一、告别 time.sleep(),拥抱 Playwright 的智能等待二、选择健壮、面向用户的选择器,优先使用 data-testid三、严格管理环境与依赖,确保一致性四、分离测试数据与逻辑,…...
P12130 [蓝桥杯 2025 省 B] 移动距离
P12130 [蓝桥杯 2025 省 B] 移动距离 - 洛谷 题目描述 小明初始在二维平面的原点,他想前往坐标 (233, 666)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用: 水平向右移动,…...
关于 人工智能(AI)发展简史 的详细梳理,按时间阶段划分,涵盖关键里程碑、技术突破、重要人物及挑战
以下是关于 人工智能(AI)发展简史 的详细梳理,按时间阶段划分,涵盖关键里程碑、技术突破、重要人物及挑战: 字数:约2500字 逻辑结构:时间线清晰,分阶段描述技术突破、关键事件与挑战…...
Formality:Bug记录
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文记录博主在使用Synopsys的形式验证工具Formality中遇到的几个Bug。 Bug复现 情况一 // 例1 module dff (input clk, input d_in, output d_out …...
react-07React提交表单数据调用同一方法(高阶函数,函数柯里化概念)
1.高阶函数与函数柯里化概念 高阶函数:符合其中之一,那该函数为高阶函数 1.A函数,接收的参数是一个函数,那么A就是高阶函数2.A函数,调用的返回值是一个函数,那么A就是高阶函数 常见的高阶函数:…...
js ES6箭头函数的作用
前置知识 1、箭头函数语法简洁,相较于传统的函数表达式,箭头函数的语法更为简洁,尤其适用于简单的函数。 2、解决this取向问题,在传统函数中,this 的值取决于函数的调用方式,这可能会导致一些难以理解和调…...
淘宝商品数据高并发采集方案:API 接口限流机制与分布式调用实战
一、引言 在电商领域,对淘宝商品数据进行采集是一项常见且重要的任务。随着业务规模的扩大,高并发采集需求日益凸显。然而,淘宝 API 接口存在限流机制,为了高效且合规地完成数据采集,需要采用分布式调用的策略。本文将…...
python爬虫 线程,进程,协程
0x00 线程 线程是一个执行单位,是在一个进程里面的,是共享进程里面的提供的内存等资源,使用多个线程时和使用多个进程相比,多个线程使用的内存等资源较少。进程像一座“房子”(独立资源),线程是…...
《忘尘谷》音阶与调性解析
一、音高与音名的对应关系 根据搜索结果及音乐理论,结合《忘尘谷》的曲谱信息,其音阶与调性分析如下: 调性判定 原曲调性为 D调(原曲标注为D调),但曲谱编配时采用 C调指法,通过变调夹夹2品&…...