STM32F103驱动AD7124实战:从SPI配置到电压采集的完整指南

简介:这份资源是面向STM32开发者与嵌入式新手的AD7124高精度ADC驱动代码,基于STM32F103平台,采用模拟SPI方式实现,工程基于Keil5搭建并已完整调通。代码聚焦6通道、双极性、全功率采样与外部参考电压配置,未开启多余功能,便于读者直接移植到自己的采集项目中,也适合作为学习24位ADC寄存器配置与通信时序的参考。压缩包共215个文件,约6.18MB,包含35个c源文件、38个h头文件以及大量编译中间产物(d、o、crf文件)、Keil工程文件(uvprojx、uvoptx)、map映射文件与hex固件等,覆盖从源码到可执行文件的完整工程结构。目前已有6215人学习下载。作者在描述中坦言调试过程曲折,因此代码经过实际验证,新手无需怀疑其可用性,可直接对照工程理解AD7124初始化、通道切换与数据读取流程,并在此基础上扩展硬件SPI或更多通道应用。

1. 拿到一份调通的 AD7124 驱动,先别急着往板子上怼

如果你手头正捏着一块 STM32F103 的板子,旁边还躺着一颗 AD7124 这颗 24 位 Σ-Δ 型 ADC,那你大概率已经体会过那种“手册翻烂了、寄存器配了半天、读回来全是 0xFFFFFF”的绝望。这份资源就是冲这个场景来的:一套基于 STM32F103 的 AD7124 完整驱动代码,作者标注“已全部调通”,意味着 SPI 时序、寄存器配置、通道切换、数据读取这些最容易翻车的地方,已经有人替你趟过一遍了。它适合两类人:一类是刚接手高精度采集项目、想先跑通再研究的嵌入式新手;另一类是手上有现成硬件、懒得从零啃 80 页寄存器手册、想直接拿一份能跑的参考实现来改的熟手。关键词 ADC、AD7124、STM32F 驱动,基本就是这份代码的全部标签。

2. 先看清这套驱动到底封装了什么:从 SPI 到通道扫描的完整链路

2.1 硬件接口层:SPI 时序和片选是怎么接的

AD7124 和 STM32F103 之间走的是标准 4 线 SPI,但有几个细节如果没处理好,读出来的数据就是玄学。常见做法是:STM32 做 SPI 主机,AD7124 做从机,SCLK 空闲电平根据 CPOL/CPHA 配置,通常用 Mode 3(CPOL=1,CPHA=1)或者 Mode 1,具体看你的时序图。片选 CS 建议用普通 GPIO 手动拉低拉高,而不是用硬件 NSS,因为 AD7124 的寄存器读写需要严格的帧边界,硬件 NSS 有时候会在字节间隙抖动,导致命令解析错位。

下面这段是 SPI 初始化和字节收发的基础封装,基于 STM32 标准外设库的写法:

// spi.c - AD7124 SPI 底层收发 #include "spi.h" void AD7124_SPI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; // 使能 SPI 和 GPIO 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE); // SCLK(PA5) / MOSI(PA7) 复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // MISO(PA6) 浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // CS 用 PA4 普通推挽输出,手动控制 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_4); // 默认拉高 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // 空闲高 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // 第二边沿采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; // 约 1.1MHz SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); } // 收发一个字节,返回读到的数据 uint8_t AD7124_SPI_ReadWriteByte(uint8_t txData) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, txData); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); return SPI_I2S_ReceiveData(SPI1); }

逻辑说明:SPI 速率这里用了 64 分频,STM32F103 主频 72MHz 时 SCLK 约 1.1MHz,AD7124 手册允许的最高 SCLK 通常远高于此,但低速更稳,适合长线或干扰环境。CPOL/CPHA 选的是 Mode 3,如果你发现读回全 0 或全 1,第一个要改的就是这两个参数。CS 手动控制意味着每次读写寄存器前要拉低 PA4,结束后拉高,这个动作在寄存器操作函数里统一做。

2.2 寄存器读写:24 位数据怎么拆成 3 个字节

AD7124 的寄存器是 8 位地址 + 24 位数据的结构,通信寄存器决定下一步是读还是写、操作哪个寄存器。常见做法是封装两个函数:写寄存器和读寄存器,内部处理 CS 拉低、发命令、收发数据、CS 拉高。

// ad7124_reg.c - 寄存器读写 #include "ad7124.h" // 写寄存器:addr 为寄存器地址,data 为 24 位数据 void AD7124_WriteRegister(uint8_t addr, uint32_t data) { AD7124_CS_LOW(); // 通信寄存器:写操作,地址 addr AD7124_SPI_ReadWriteByte(AD7124_COMM_REG_WR | addr); // 依次发 24 位数据,高字节在前 AD7124_SPI_ReadWriteByte((data >> 16) & 0xFF); AD7124_SPI_ReadWriteByte((data >> 8) & 0xFF); AD7124_SPI_ReadWriteByte(data & 0xFF); AD7124_CS_HIGH(); } // 读寄存器:addr 为寄存器地址,返回 24 位数据 uint32_t AD7124_ReadRegister(uint8_t addr) { uint32_t data = 0; AD7124_CS_LOW(); // 通信寄存器:读操作,地址 addr AD7124_SPI_ReadWriteByte(AD7124_COMM_REG_RD | addr); // 读回 24 位 data |= (uint32_t)AD7124_SPI_ReadWriteByte(0xFF) << 16; data |= (uint32_t)AD7124_SPI_ReadWriteByte(0xFF) << 8; data |= (uint32_t)AD7124_SPI_ReadWriteByte(0xFF); AD7124_CS_HIGH(); return data; }

参数说明:AD7124_COMM_REG_WR和AD7124_COMM_REG_RD是通信寄存器的读写标志位,通常是 0x00 和 0x40,具体值要对照手册确认。addr是寄存器地址,比如配置寄存器 0x01、数据寄存器 0x02 等。注意每次读写之间 CS 必须拉高,否则 AD7124 会把下一次通信当成当前帧的延续,导致命令错位。这个坑我在早期调试时踩过,现象是读配置寄存器返回的值总是偏移一个字节。

2.3 通道配置与扫描:怎么让 AD7124 轮流采多路信号

AD7124 有多路模拟输入,可以通过配置寄存器设置每个通道的使能、增益、滤波等参数。常见做法是初始化时把用到的通道写进配置寄存器,然后设置 ADC 控制寄存器为连续转换模式,数据寄存器会自动更新。

// ad7124_init.c - 通道配置示例 void AD7124_SetupChannels(void) { // 配置寄存器 0:使能通道 0,增益 1,单极性 // 具体位定义参考手册,这里只写关键字段 uint32_t cfg0 = 0; cfg0 |= (0 << 12); // 增益 = 1 cfg0 |= (0 << 11); // 单极性 cfg0 |= (0 << 10); // 使能缓冲 AD7124_WriteRegister(AD7124_CFG_0_REG, cfg0); // 配置寄存器 1:通道 1 uint32_t cfg1 = cfg0; // 同样参数 AD7124_WriteRegister(AD7124_CFG_1_REG, cfg1); // 通道寄存器:使能 AIN0/AIN1 对应通道 0,AIN2/AIN3 对应通道 1 AD7124_WriteRegister(AD7124_CH_0_REG, 0x0001); // 使能,正输入 AIN0,负输入 AIN1 AD7124_WriteRegister(AD7124_CH_1_REG, 0x0043); // 使能,正输入 AIN2,负输入 AIN3 // ADC 控制寄存器:连续转换模式,内部基准 uint32_t adc_ctrl = 0; adc_ctrl |= (0 << 11); // 连续转换 adc_ctrl |= (1 << 6); // 内部基准使能 AD7124_WriteRegister(AD7124_ADC_CTRL_REG, adc_ctrl); }

逻辑说明:通道寄存器的低 4 位是正输入选择,接着 4 位是负输入选择,最高位是使能位。上面0x0001表示通道 0 使能,正输入 AIN0,负输入 AIN1;0x0043表示通道 1 使能,正输入 AIN2,负输入 AIN3。实际项目中通道号对应的引脚要查原理图,别照抄。ADC 控制寄存器里连续转换模式让芯片自己轮询使能的通道,数据寄存器会依次更新,你只需要在需要的时候读数据寄存器即可。

2.4 数据读取与转换:24 位原始码怎么变成电压值

读数据寄存器得到的是 24 位原始码,要转成电压需要知道基准电压和增益。常见做法是用内部基准 2.5V,增益为 1 时,电压 = (原始码 / 2^23) * 2.5V(单极性)。如果是双极性,公式略有不同。

// ad7124_read.c - 读取并转换 float AD7124_ReadVoltage(void) { uint32_t raw = AD7124_ReadRegister(AD7124_DATA_REG); // 单极性,内部基准 2.5V,增益 1 float voltage = ((float)raw / 8388608.0f) * 2.5f; // 2^23 = 8388608 return voltage; }

参数说明:8388608.0f是 2 的 23 次方,对应 24 位 ADC 单极性满量程。如果增益不是 1,分母要乘增益;如果基准是外部 5V,把 2.5f 换成 5.0f。注意读数据寄存器之前最好检查状态寄存器的 RDY 位,确保数据已更新,否则可能读到旧值。这个细节在连续转换模式下尤其重要,我一般会在读之前加一个超时等待。

3. 把代码跑起来:从工程搭建到第一个电压读数

3.1 工程目录怎么组织:别把所有文件堆在 main.c 里

拿到一份驱动代码,第一件事是看目录结构。这套代码常见做法是分成三层:底层 SPI 驱动、AD7124 寄存器操作层、应用层。目录大概长这样:

project/ ├── CMSIS/ // STM32 内核文件 ├── STM32F10x_StdPeriph_Driver/ // 标准外设库 ├── User/ │ ├── main.c // 主循环,初始化 + 读数据 │ ├── spi.c / spi.h // SPI 底层 │ ├── ad7124.c / ad7124.h // AD7124 驱动 │ └── delay.c / delay.h // 延时函数 └── Project.uvprojx // Keil 工程文件

如果你用的是 HAL 库,把 spi.c 换成 HAL 的 SPI 初始化即可,寄存器操作层不用大改。关键是别把 AD7124 的寄存器配置直接写在 main 里,否则换一颗 ADC 或者改通道时你会想哭。

3.2 初始化顺序:先 SPI 再 AD7124 最后开转换

初始化顺序错了,后面全是白费。常见做法是:

  1. 系统时钟配置(STM32F103 通常 72MHz)
  2. 延时函数初始化
  3. SPI 初始化
  4. AD7124 复位(拉低 RESET 引脚或者发复位命令)
  5. 写配置寄存器、通道寄存器
  6. 写 ADC 控制寄存器,启动连续转换
  7. 等待 RDY 位,读数据
// main.c - 初始化流程 int main(void) { Delay_Init(); AD7124_SPI_Init(); AD7124_Reset(); // 硬件复位或软件复位 AD7124_SetupChannels(); // 配置通道和 ADC AD7124_StartConversion(); // 启动连续转换 while (1) { if (AD7124_DataReady()) // 检查 RDY { float v = AD7124_ReadVoltage(); printf("Voltage: %.6f V\r\n", v); } } }

逻辑说明:AD7124_Reset()通常是把 RESET 引脚拉低一段时间再拉高,或者写通信寄存器的复位命令。AD7124_DataReady()读状态寄存器的 RDY 位,为 0 表示数据就绪。主循环里不要用死延时等数据,用 RDY 查询或者 DRDY 引脚中断更靠谱。

3.3 用串口打印验证:第一个读数出来之前别急着接传感器

代码跑起来后,先别接传感器,把 AD7124 的输入短接到地或者基准,看读数是否接近 0 或满量程。常见做法是:

  • 短接到地:读数应该接近 0x000000,电压接近 0V
  • 短接到基准:读数应该接近 0x7FFFFF(单极性),电压接近 2.5V
  • 如果读数跳得厉害,检查基准电压是否稳定、SPI 速率是否过高、电源是否干净

串口打印用 printf 重定向到 USART1,波特率 115200。如果打印出来全是 0 或者 0xFFFFFF,先查 SPI 模式,再查 CS 时序,最后查寄存器地址有没有写错。

4. 避坑与排查:那些让读数变成玄学的瞬间

4.1 读回全 0 或全 1:SPI 模式或 CS 时序错了

现象:读任何寄存器都返回 0x000000 或 0xFFFFFF。原因:SPI 的 CPOL/CPHA 和 AD7124 不匹配,或者 CS 在字节之间被拉高导致帧断裂。解决:把 CPOL/CPHA 改成 Mode 1 或 Mode 3 试一遍,CS 确保在整个读写过程中保持低电平,读写完成后再拉高。

4.2 数据跳动大:基准不稳或滤波没配

现象:电压读数跳动几十毫伏甚至上百毫伏。原因:内部基准还没稳定就启动转换,或者滤波寄存器配置的采样率太高。解决:启动转换前加 10ms 以上延时等基准稳定,把滤波寄存器配成较低的输出速率(比如 10SPS),牺牲速度换稳定。

4.3 通道切换后读到旧值:没等 RDY 就读

现象:切换通道后第一次读到的还是上一个通道的值。原因:连续转换模式下,通道切换后需要等一个完整的转换周期,数据寄存器才会更新。解决:每次读之前检查 RDY 位,或者用 DRDY 引脚中断触发读取。

4.4 通信完全没反应:RESET 引脚没接或没拉高

现象:SPI 发什么都是 0,AD7124 像死了一样。原因:RESET 引脚悬空或者一直拉低,芯片处于复位状态。解决:RESET 引脚接 GPIO,初始化时拉低至少 100ns 再拉高,或者直接接 3.3V 上拉。

4.5 读数据寄存器返回 0x800000:溢出或负满量程

现象:读数据寄存器得到 0x800000。原因:输入电压超出量程,或者双极性模式下负满量程。解决:检查输入电压是否在基准范围内,确认配置寄存器的极性设置和增益是否匹配实际信号。

5. 二次开发怎么改:换通道、换基准、换 MCU 的实操思路

拿到这份代码,你大概率不会原封不动用,总得改点东西。我一般会从三个方向下手:换通道、换基准、换 MCU。

换通道最简单,改AD7124_SetupChannels()里的通道寄存器值就行。比如你要用 AIN4 和 AIN5 作为差分输入,就把通道寄存器的正输入改成 4,负输入改成 5。注意通道号对应的物理引脚要查原理图,别照着代码里的注释抄。改完通道后,配置寄存器也要对应改增益和极性,否则读数会差一个系数。

换基准分两种情况:用内部基准还是外部基准。内部基准 2.5V 在 ADC 控制寄存器里使能,代码里已经写了。如果你用外部基准,比如 REFIN1 接 5V,那要把 ADC 控制寄存器的内部基准关掉,同时电压换算公式里的 2.5f 改成 5.0f。外部基准的好处是精度更高,但布线要讲究,基准芯片的退耦电容不能省。

换 MCU 是改动最大的。如果你从 STM32F103 换到 F4 或者 G0,SPI 底层要重写,但 AD7124 寄存器操作层几乎不用动。我的习惯是把 SPI 收发封装成两个函数指针,初始化时根据 MCU 类型赋值,这样上层驱动完全不用改。下面是一个简单的函数指针封装示例:

// ad7124_port.h - 移植层接口 typedef struct { void (*cs_low)(void); void (*cs_high)(void); uint8_t (*spi_rw)(uint8_t tx); void (*delay_ms)(uint32_t ms); } AD7124_Port_t; extern AD7124_Port_t ad7124_port; // 在 main.c 里根据 MCU 填充 AD7124_Port_t ad7124_port = { .cs_low = AD7124_CS_LOW, .cs_high = AD7124_CS_HIGH, .spi_rw = AD7124_SPI_ReadWriteByte, .delay_ms = Delay_ms };

这样换 MCU 时只需要重新实现这几个函数,AD7124 的寄存器读写和通道配置代码原封不动。验证方法也简单:短接到地读 0,短接到基准读满量程,中间接一个分压电阻看读数是否线性。我一般会拿一个 1.5V 电池串两个等值电阻分压,理论值 0.75V,实测偏差在 1mV 以内就算通过。

从那以后我每次拿到新的 ADC 驱动,都强制先跑一遍“短接到地、短接到基准、分压验证”这三步,确认底层通了再往上叠业务逻辑。希望这份代码帮你省下啃手册的那几天。

本文还有配套的精品资源,点击获取

相关新闻

AI如何重塑散修交易员:从信息处理到决策逻辑的进化

AI如何重塑散修交易员:从信息处理到决策逻辑的进化

如果几年前有人跟我说&#xff0c;一个独自对着几块屏幕、没有团队没有后台的人&#xff0c;能靠一套AI助手完成过去一个小型投研团队才能干完的活&#xff0c;我多半是不信的。但最近这一年&#xff0c;我跟身边几位专职做交易的“散修”朋友聊下来&#xff0c;不得不承认&…

2026/10/20 20:12:36 阅读更多 →
分布式驱动下路面附着系数估计:UKF与CKF对比与工程实践

分布式驱动下路面附着系数估计:UKF与CKF对比与工程实践

题目这些词一摆出来&#xff0c;懂的都懂——路面附着系数&#xff0c;μ值&#xff0c;这个参数在底盘控制里的地位太特殊了。ABS、TCS、ESC、分布式四驱扭矩分配&#xff0c;哪个都绕不开它。但车上偏偏没有传感器能直接测它&#xff0c;只能靠观测器和滤波算法“猜”。传统集…

2026/10/20 20:12:36 阅读更多 →
火焰烟雾检测实战:D-Fire数据集与YOLO训练避坑指南

火焰烟雾检测实战:D-Fire数据集与YOLO训练避坑指南

简介&#xff1a;面向目标检测入门与火灾监测应用场景的火焰烟雾YOLO数据集&#xff0c;适合正在学习YOLO系列模型、需要真实标注图片进行训练与验证的开发者&#xff0c;也适合安防与智能楼宇领域的算法工程师快速构建预警原型。压缩包内共3个文件&#xff0c;包含Python辅助脚…

2026/10/20 20:11:34 阅读更多 →

最新新闻

通用型Makefile:多级目录自动收集与依赖追踪实战

通用型Makefile:多级目录自动收集与依赖追踪实战

做C/C项目时间长了&#xff0c;几乎每个人都会攒一套自己的Makefile。早年我在一个跨平台工具项目里用的还是那种把所有文件路径一行行写死的Makefile&#xff0c;源码目录从两层涨到四层之后&#xff0c;每次新增一个模块都要回去改源文件列表、改编译规则、改clean&#xff0…

2026/10/20 23:02:12 阅读更多 →
STM32启动流程全解析:从复位向量到main函数前的完整路径

STM32启动流程全解析:从复位向量到main函数前的完整路径

朋友们平时点灯、调外设都很顺&#xff0c;但有没有想过这样一个问题&#xff1a;你在Keil里点一下下载&#xff0c;程序跑到main之前&#xff0c;芯片到底做了什么&#xff1f;很多新手甚至部分老手&#xff0c;遇到程序不跑、变量莫名清零、一进中断就HardFault这类问题&…

2026/10/20 23:02:12 阅读更多 →
diagram-design:从草图到可维护工程资产的图表设计化生产方法论

diagram-design:从草图到可维护工程资产的图表设计化生产方法论

1. 从一张草图到一套系统&#xff1a;diagram-design 到底在解决什么问题 第一次听到 “diagram-design” 这个词&#xff0c;很多人会下意识觉得它只是“画图”的另一种说法。但真正在项目里被图表折磨过的人知道&#xff0c;画图本身从来不是最痛的部分。最痛的是&#xff1a…

2026/10/20 23:02:12 阅读更多 →
RNN文本分类实战:从数据预处理到BiGRU模型调参全记录

RNN文本分类实战:从数据预处理到BiGRU模型调参全记录

前阵子接手一个文本分类需求&#xff1a;给一批用户评论打标签&#xff0c;正向、负向、中性三选一。同事的第一反应是直接上预训练模型&#xff0c;说效果肯定好。我的想法不太一样——先别急着烧显卡&#xff0c;RNN文本分类这个经典方案&#xff0c;在数据量只有几万条、以短…

2026/10/20 23:02:12 阅读更多 →
从JSESSIONID泄露到任意文件上传:Web安全链路复盘与加固实践

从JSESSIONID泄露到任意文件上传:Web安全链路复盘与加固实践

先聊一个我实际遇到的场景。某集团IT负责人打来电话时&#xff0c;语气已经明显不对&#xff1a;服务器上多了一个陌生文件&#xff0c;文件名看起来是正常图片&#xff0c;后缀却是JSP。顺着访问日志往回翻&#xff0c;攻击行为大概发生在十几个小时前&#xff0c;先有几个来自…

2026/10/20 23:02:12 阅读更多 →
运输层深度解析:TCP可靠性、拥塞控制与排障实战

运输层深度解析:TCP可靠性、拥塞控制与排障实战

刚接触网络那几年&#xff0c;我最早排的一个“玄学故障”就是TCP连接建不起来。两台服务器明明在同一个二层网段&#xff0c;ping 100%通&#xff0c;HTTP就是打不开。抓包一看&#xff0c;三次握手的最后一个ACK发出去就没了下文。那时候我才真正理解&#xff0c;运输层虽然不…

2026/10/20 23:01:09 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →