基于AS7341的光谱强度显示:STM32驱动与颜色识别实战

简介:基于AS7341的光谱强度显示程序是一份面向STM32开发者与颜色识别、环境光测量等应用场景的嵌入式源码工程。程序通过标准库软件模拟IIC协议读取AS7341多通道光谱数据,并利用转换函数将光谱值映射为RGB565色彩,实时显示在1.44寸TFT屏上,可用于颜色识别、植物光照监测等教学与项目原型开发。压缩包共222个文件,5.75MB,包含STM32标准外设库源文件与头文件(如stm32f10x_tim.c、stm32f10x_i2c.c)、编译输出文件(axf、hex、map)以及Keil工程配置文件(uvprojx、uvoptx)等,结构完整,可直接在Keil中打开编译调试。已有769人学习下载,适合对光谱传感与嵌入式显示感兴趣的开发者参考。资源价值在于可直接复用的驱动与显示代码,省去从零配置IIC和TFT的步骤;同时提供光谱到RGB的转换思路,便于理解多通道传感器数据可视化的实现方法,有助于快速搭建光谱检测原型。

1. 基于AS7341的光谱强度显示程序:它和你玩过的RGB颜色传感器不在一个级别

调过RGB颜色传感器的人都有过这种经历:同一个目标物,换个光源,读出来的R、G、B三个值立马变样,靠阈值判色基本靠猜。基于AS7341的光谱强度显示程序能带来一种完全不同的玩法——它把可见光切成8个窄带通道加上近红外和Clear通道,输出的是“光谱能量分布”而不是被压缩过的三原色。换句话说,它能让你“看见”颜色的构成。这份资源适合做颜色识别、物料分选、液体浓度检测或光是拿来做光谱可视化Demo的人。不需要昂贵的分光计,一块STM32加一个AS7341模块就能把光谱条形图刷到OLED上。接下来我把拆解它的过程完整写出来,包括寄存器配置、SMUX切换、积分时间计算、显示刷新和几个能让你少掉头发的坑。

2. 先搞清楚AS7341读回来的到底是什么:通道、SMUX与积分时间

2.1 十一个物理单元不等于十一个真实“通道”

AS7341内部的探测器被划分为多个光谱单元,公开资料里常看到的“11通道”指的是两组探测器的总数量:第一组是8个可见光窄带通道F1~F8,覆盖大约410nm到680nm的可见光范围;第二组包括一个近红外通道(NIR)和一个全波段通道(Clear)。再加上一组不参与光谱输出的冗余探测单元,凑成11这个数字。实际可用的光谱数据点是10个,其中F1~F8是颜色识别的主力。

单元中心波长/覆盖典型用途
F1约415nm紫蓝区域,适合区分蓝紫
F2约445nm蓝色区域
F3约480nm蓝绿过渡
F4约515nm绿色区域
F5约555nm绿黄区域
F6约590nm黄色区域
F7约630nm橙红区域
F8约680nm深红区域
NIR近红外宽带红外补偿、环境光混入检测
Clear整个可见波段总亮度参考

这10个数据点组合起来就是一份迷你光谱。相比TCS34725那种只有红绿蓝三色加Clear的芯片,它的优势在于波长分辨率高出一个量级。比如两个长相接近的红色,RGB传感器可能给出几乎一样的数值,而AS7341在F6、F7、F8三个通道的响应会出现明显差异,这就是光谱测量和颜色传感器最大的区别。

2.2 为什么默认配置一次读不出全部通道

很多人第一次上手时有个困惑:我把使能寄存器打开了,ADC数据寄存器也读了,怎么只有6个有效值?这不是芯片坏了,而是它内部的SMUX(传感器复用矩阵)在起作用。AS7341内部的ADC通道数量少于光谱探测单元数量,硬件上通过一个类似开关矩阵的结构把不同波长的探测器分时接入ADC。

常见的做法是分两组测量:第一组把F1、F2、F3、F4加上Clear接进ADC,读出5个值;第二组再把F5、F6、F7、F8加上NIR接进ADC,再读出5个值。两次测量拼起来才是完整的10通道光谱。资源包里的驱动把这一层封装成了类似as7341_read_all()的接口,但你在做二次开发时一定要知道这个高一层的逻辑——否则你自己写寄存器配置时很可能漏掉一组SMUX切换,导致得到的“光谱”永远是残缺的一半。

2.3 积分时间才是控制灵敏度的真正旋钮

AS7341的积分时间不像普通I2C传感器那样写一个寄存器就完事,它由两个寄存器配合控制:ASTEP和ATIME。芯片内部的振荡频率决定了每个LSB对应的时间基准,实际积分时间的计算公式为:

T_INT = (ASTEP + 1) × (ATIME + 1) × 2.78µs

举例来说,ASTEP写入999、ATIME写入0时,积分时间是1000 × 1 × 2.78µs,约2.78ms。如果你把ATIME也改成9,积分时间就变成27.8ms。这个参数直接影响低光照下的读数稳定性,也直接影响显示刷新的频率。资源包中默认的一组参数是ASTEP=999、ATIME=0,适合室内照明环境。做高灵敏度场景时,我一般会先把ATIME拉大,而不是急着在代码里做多次采样平均——前者是硬件层面的积累,后者只是软件滤波,两者效果差距很大。

一次完整测量的流程通常是这样:先将SMUX切到第一组映射,写入命令寄存器启动测量,轮询状态寄存器直到数据就绪,读取第一组ADC值;再切到第二组映射,重复上述动作。下面这段伪代码展示了基本流程:

void read_spectrum_group1(uint16_t *buf, uint8_t len) { // 切换SMUX到 F1-F4 + Clear smux_select(GROUP_1); // 写命令寄存器,启动一次测量 write_reg(REG_CMD, CMD_START); // 等待状态寄存器bit0置1,表示数据就绪 while (!(read_reg(REG_STATUS) & 0x01)); // 从ADC数据寄存器依次读取 for (uint8_t i = 0; i < len; i++) { buf[i] = read_adc_channel(i); } // 停止测量,准备下一次切换 write_reg(REG_CMD, CMD_STOP); }

这里的smux_select()只是在内部把一组SMUX配置表写入寄存器,这一组配置表在资源包的smux_table.c里可以直接拿到。寄存器地址和命令字我建议不要凭记忆写,直接对照包内附的数据手册片段来核对,因为不同芯片版本个别保留位可能不一样。反正我每次换一个批次的芯片,都会先读一遍ID寄存器确认器件版本。

3. 硬件接线与驱动初始化:I2C时序决定数据上限

3.1 接线表和电平匹配

这份资源的代码基于STM32的HAL库,I2C通信采用7位地址0x39。接线本身不复杂:

信号模块引脚接STM32引脚备注
电源VDD3.3V2.7V~3.6V,不要接5V
地GNDGND共地必须接
数据SDAPB7(示例)需要上拉电阻
时钟SCLPB6(示例)需要上拉电阻
LED电源VLED3.3V串限流电阻部分模块板载LED已接好
中断INT可选GPIO不需要时悬空

最容易翻车的地方是VLED。AS7341本身不自带光源,需要外部LED照明。如果买的是裸片或最小模块,VLED引脚要接一颗LED及限流电阻到电源,而不是直接当电源引脚用。在“光谱强度显示”这个场景里,照明光源对测量结果的影响非常大,后面第5章会展开讲。

3.3V电平的STM32和AS7341直连没有电气问题,但如果你拿5V的单片机开发板去接,SDA和SCL的高电平就可能超标。遇到过有人把SCL接到5V后,芯片能通信但读数异常,测了半天最后发现是电平问题。

3.2 初始化序列可以照抄但建议理解

资源包里的初始化函数做了四件事:上电、等待稳定、配置SMUX映射、设置积分参数。我从包里抽出一段核心代码,做了精简注释:

// as7341_init.c static void as7341_write_reg(uint8_t reg, uint8_t val) { uint8_t data[2] = {reg, val}; // 这里的i2c_write是HAL库封装的写函数,对寄存器地址做一次字节编址 i2c_write(AS7341_ADDR, data, 2); } static uint8_t as7341_read_reg(uint8_t reg) { uint8_t val = 0; i2c_write_read(AS7341_ADDR, &reg, 1, &val, 1); return val; } void as7341_init(void) { // 1. 先给芯片上电 as7341_write_reg(REG_ENABLE, 0x01); // 等待内部上电复位完成,常见做法是延时5ms以上 delay_ms(5); // 2. 写入SMUX映射表,把探测单元切换到ADC输入 // 映射表根据数据手册寄存器0x00~0x2F的配置生成 for (uint8_t i = 0; i < SMUX_TABLE_LEN; i++) { as7341_write_reg(REG_SMUX_BASE + i, smux_table[i]); } // 3. 设置积分时间相关寄存器 // ASTEP低字节寄存器 as7341_write_reg(REG_ASTEP_LOW, (uint8_t)(ASTEP_VALUE & 0xFF)); // ASTEP高字节寄存器 as7341_write_reg(REG_ASTEP_HIGH, (uint8_t)(ASTEP_VALUE >> 8)); // ATIME寄存器 as7341_write_reg(REG_ATIME, ATIME_VALUE); // 4. 使能光谱测量,等待进入稳定工作状态 as7341_write_reg(REG_CMD, CMD_START); delay_ms(10); as7341_write_reg(REG_CMD, CMD_STOP); }

这里有个细节值得注意:smux_table[]并不是随便一组数值,它的每一位都对应某个探测单元是否接入ADC,而且高位和低位的含义和通道顺序有关。资源包中这个表已经按顺序排好,我不建议在你还没跑通基础例程时去修改它。ASTEP_VALUE和ATIME_VALUE在头文件里定义,默认值分别是999和0。如果你发现室内光下读数偏低,优先调ATIME到2或3,而不是改SMUX表。

3.3 上电时序的几种异常表现

初始化后读寄存器如果一直是0xFF,大概率不是芯片坏,而是通信根本没建立。先量SDA和SCL有没有3.3V上拉电压,再确认STM32的I2C时钟速率。我的习惯是初始化为100kHz,等所有功能跑通后再提高到400kHz。有时候把速率从400kHz降到100kHz,那些偶发通信失败直接消失。AS7341对时序的要求不像部分传感器那么苛刻,但总线上如果还挂了OLED或者其他I2C设备,就没那么乐观了。资源包的例程里默认I2C速率是100kHz,这是稳妥选择。

4. 把原始读数变成光谱条:归一化计算与显示实现

4.1 ADC原始值的含义

AS7341的ADC输出是16位无符号数。读出来的原始值直接受积分时间、照明强度、目标反射率三个因素影响。它不像普通温度传感器那样有个固定换算公式,真实物理含义是“在某段波长范围内接收到的光子数量经过电荷积分后的数字表示”。所以比较两个传感器的原始值没有意义,有意义的比较是:同一个传感器、同一种照明条件下,不同目标物之间的相对响应差异。

在显示程序里,第一步是把两组数据拼成一个完整的10通道数组。这一步看似简单,但顺序错是常见问题。我见过有人把第二组数据接到第一组前面,结果F5~F8的数据跑到F1~F4的位置,光谱条形图看起来莫名其妙。资源包里的as7341_read_all()返回的数组顺序是固定的:索引0~3对应F1~F4,索引4是Clear,索引5~8对应F5~F8,索引9是NIR。你拿到数据后先打印一遍每个索引对应的原始值,确认和你的预期波段一致,再往上层走。

4.2 归一化与OLED条形图

直接显示原始值有个问题:不同积分时间下数值范围变化极大,条形图要么顶格要么只有短短一截。常用的做法是做最大值归一化,把最大通道的值映射到显示器的最大高度。下面这段代码展示了一个精简的采样和显示流程:

// spectrum_display.c #define SPECTRUM_CHANNELS 10 void spectrum_sample_and_display(void) { uint16_t raw[SPECTRUM_CHANNELS] = {0}; uint8_t bar[SPECTRUM_CHANNELS] = {0}; uint16_t max_value = 1; // 一次完整的10通道采样:内部完成两次SMUX分组读取 as7341_read_all(raw); // 找最大值,用于归一化 for (uint8_t i = 0; i < SPECTRUM_CHANNELS; i++) { if (raw[i] > max_value) max_value = raw[i]; } // 把每个通道映射到0~63的条形高度 for (uint8_t i = 0; i < SPECTRUM_CHANNELS; i++) { bar[i] = (uint32_t)raw[i] * 63 / max_value; } // 在OLED上按通道顺序画条形图 oled_clear_bars(); for (uint8_t i = 0; i < SPECTRUM_CHANNELS; i++) { oled_draw_bar(i, bar[i]); // 第i根条,高度bar[i] } }

这段代码逻辑很直接:采样、找最大值、归一化、画条。有一个参数需要注意,桶高度63不是拍脑袋定的,它是OLED屏64像素高度留出顶部一行做边框的余量。如果你用的显示屏是128×32的,那63就改成31。另外,oled_draw_bar()内部如果用了矩形填充,注意把单根条的宽度控制在6~8像素,10根条加间距才能在128像素宽的屏幕上放得舒服。

4.3 显示刷新频率怎么定

刷新率最高不能超过测量周期的倒数。假设积分时间2.78ms,两组测量就是约5.56ms,加上I2C传输和OLED绘制的时间,20Hz刷新率很容易做到。但实际使用中,我建议把刷新率限制在10Hz以下。原因是人眼对光谱条形图这类渐变信息有视觉暂留,刷新太快反而会看到闪烁和频条跳动。更关键的是光源频闪——普通室内LED灯其实在以100Hz或120Hz的频率闪烁,如果积分时间和刷新周期跟它拍频,读数就会周期性波动。

资源包例程里的主循环用了delay_ms(100),也就是接近10Hz刷新率。这个数值不是随手写的,它避开了常见电源频率的拍频区间,也让OLED显示的视觉体验比较稳定。做高精度测量时,我一般会把连续4次采样的值做平均再显示,而不是单次裸奔。平均窗口不要太大,否则程序对这个颜色变化的响应会迟钝。

4.4 串口输出一个可读的文本光谱

调试阶段OLED显示效率可能不高,串口打印反而能帮你更快发现问题。用一个简单的循环把通道名和原始值打印出来就够了。看数据时先做两步确认:用手机闪光灯照一下,F1~F8的原始值应该呈现一个从蓝到红的平滑变化;再把手指放到传感器窗口上,所有通道值都会大幅下降。如果这两条都符合,说明你的采集链路是通的。

5. 实测中踩过的五个坑:现象、原因与寄存器玄学

5.1 读数全是0xFFFF

这个现象一般出现在刚上电或者复位后不久。原因有两类:第一类是SMUX还没配置完成就开始读ADC,寄存器返回默认复位值;第二类是I2C地址不对,读回来的是总线上的垃圾数据。解决方法是初始化后强制等待20ms再做第一次采样,同时用I2C扫描工具确认地址。我之前遇到过一次,芯片焊在转接板上地址被一个电阻拉成了另一个值,排查了很久。如果你手头有逻辑分析仪,直接抓I2C波形是最快的。

5.2 同一块色卡两次测量结果差异大

两次间隔几秒钟,同一目标读数差了20%甚至更多,这通常不是芯片问题。最常见的原因是照明不稳定,尤其是普通LED灯和市电频率的拍频;另一个原因是积分时间设置太短,ASTEP=0或ATIME=0时内部电荷积累太少,信噪比不足。解决方法是先按第2章的公式把积分时间调到10ms以上,再看波动是否减小。如果波动依然很大,就要考虑是不是有环境光从侧面漏进传感器窗口。

5.3 条形图顶格但颜色信息丢失

显示上所有条都撞到顶部,说明信号饱和。原因大概率是积分时间过长或照明过强。AS7341的ADC输出超过65535就会饱和。硬件上可以减小照明LED的电流,软件上优先调小ASTEP而不是ATIME。资源包里的ASTEP=999在强光下确实会饱和,我通常会准备一份“强光配置”,把ASTEP降到249,ATIME保持0,积分时间缩到约0.7ms,专门应对白色物体近距离测试。

5.4 两组数据拼出来有明显断带

F1~F4一组读出来正常,F5~F8一组明显偏低或偏高。这是SMUX切换时序引起的。如果两组测量之间间隔太久,环境光发生变化,前后两组的基线就不同。解决方法是在完成两组读取之前不要做其他耗时操作,更不要在两次切换之间去刷OLED。资源包里的实现是连续读完两组再统一处理数据,这个顺序不要动。

5.5 I2C偶发通信失败

现象是偶尔某次采样全部读到0x00,程序卡在等待状态寄存器那里。原因通常是总线电容过大或干扰。解决步骤有三步:把I2C速率降回100kHz;检查SDA/SCL上拉电阻是不是太大,模块上用10kΩ上拉在长跳线场景下容易出问题,换成4.7kΩ会更稳;最后把传感器和STM32之间的杜邦线缩短到10cm以内。这一步做完,绝大多数偶发通信问题会消失。

6. 让光谱数据更有说服力:白平衡与标定系数

6.1 白平衡系数的计算

原始的光谱数据能看出相对趋势,但没法稳定地表达“这是什么颜色”。原因在于LED光源本身的光谱就不是均匀的,再加上传感器每个通道的响应率不同,直接比较F2和F7的数值没有意义。白平衡校准可以解决这个问题:找一块白色参考面,在固定照明下采集一组数据,记录为white[i]。之后每次测量都乘以一个系数:

// white_calib.c #define CHANNEL_NUM 10 static float calib_coeff[CHANNEL_NUM] = {0}; static uint16_t white_ref[CHANNEL_NUM]; void calibrate_from_white(void) { uint16_t raw[CHANNEL_NUM]; as7341_read_all(raw); // 找到白色参考采集中的最大值 uint16_t max_ref = 1; for (uint8_t i = 0; i < CHANNEL_NUM; i++) { if (raw[i] > max_ref) max_ref = raw[i]; } // 每个通道的系数 = 最大值 / 该通道白参考值 for (uint8_t i = 0; i < CHANNEL_NUM; i++) { if (raw[i] > 0) { calib_coeff[i] = (float)max_ref / raw[i]; } else { calib_coeff[i] = 0.0f; } white_ref[i] = raw[i]; } } void apply_calibration(uint16_t *raw, float *out) { for (uint8_t i = 0; i < CHANNEL_NUM; i++) { out[i] = (float)raw[i] * calib_coeff[i]; } }

校准后的out[i]中,白色物体在响应最好的通道附近会接近最大值,而其他通道按比例放大。这样测不同颜色时,几个可见光通道之间的相对关系才真实反映目标物本身的光谱特性。

6.2 标准色卡校准流程

只用白平衡还不够,因为芯片每一颗都有制造差异。批量做产品时,我建议做两层校准:第一层用白色参考面做白平衡,第二层用一组标准色卡做线性校正,比如白、灰、黑、红、蓝、绿六色。对每个标准色卡采集后,记录每个通道的实测值和标准值(用分光计或者色卡出厂数据得到),建立线性映射关系y = a*x + b。资源包里没有现成的大批量标定脚本,但如果你做单机展示,白平衡已经能极大改善颜色识别的一致感。

6.3 校准系数存进EEPROM

校准只在设备出厂前做一次,因此系数需要掉电保存。STM32内部Flash可以复用,也可以外挂一颗AT24C02。每次都重新校准不现实,毕竟LED会老化、镜头会积灰。我通常在校准函数后加一个保存流程,把系数数组写成float存储。读取端在初始化时先检查EEPROM里有没有有效标志位,有就直接加载,没有就用默认系数1.0。

从那以后我每次写AS7341的Demo,都会强制走一遍“白色参考校准→保存系数→验证校准效果”的流程,哪怕只是做实验室里的一次性验证。这个习惯帮我省掉了至少三次肉眼反复对比颜色的麻烦,也让最后拿出来的光谱条形图真正能说明问题。希望这篇拆解能让你少走几步弯路,拿到资源后照着顺序跑一遍,再根据你的照明条件调一调ASTEP和时间参数,基本就能稳定输出一块让外行也能看懂的光谱图。

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

相关新闻

Agent应用开发核心架构:增强型、链式与路由式的设计与实践

Agent应用开发核心架构:增强型、链式与路由式的设计与实践

做 Agent 应用开发&#xff0c;团队里聊得最多的话题往往不是模型参数&#xff0c;也不是提示词技巧&#xff0c;而是工作流架构设计。模型能力已经够强&#xff0c;真正决定产品上限的&#xff0c;是这些能力在 Agent 之间到底怎么组织、怎么流转、怎么避免互相干扰。增强型、…

2026/10/20 21:40:43 阅读更多 →
逆向工程入门实战:从no-strings-attached题目掌握核心分析流程

逆向工程入门实战:从no-strings-attached题目掌握核心分析流程

1. 逆向入门题的整体设计思路拆解1.1 为什么这道题适合作为逆向分析的起点在逆向工程的学习路径中&#xff0c;入门阶段最怕两件事&#xff1a;一是题目过于复杂&#xff0c;导致还没摸到门道就被劝退&#xff1b;二是题目过于简单&#xff0c;做完之后什么也没学到。这道题恰好…

2026/10/20 21:40:43 阅读更多 →
SpringBoot+MyBatis琴行学生课程信息管理系统:从环境搭建到部署实战

SpringBoot+MyBatis琴行学生课程信息管理系统:从环境搭建到部署实战

1. 项目定位与业务价值这个Springboot琴行学生课程信息管理系统&#xff0c;一看名字就知道是典型的毕业设计或课程设计项目。但别小看这类项目&#xff0c;它其实是把企业级开发中最常用的一套技术组合浓缩到了一个业务场景里&#xff0c;对于正在做毕设、准备校招项目经验、或…

2026/10/20 21:40:43 阅读更多 →

最新新闻

多Agent系统架构设计与工程实践:从单Agent瓶颈到Agent蜂群

多Agent系统架构设计与工程实践:从单Agent瓶颈到Agent蜂群

1. 多Agent系统到底在解决什么问题1.1 从单Agent的瓶颈说起做过Agent项目的人大概都有这种体会&#xff1a;单个Agent在简单任务上表现还行&#xff0c;一旦任务链路变长、涉及的工具变多、需要同时处理的信息源超过三四个&#xff0c;它就开始“犯糊涂”了。具体表现包括&…

2026/10/20 22:17:20 阅读更多 →
从屏幕到物理世界:AI Agent如何通过开源SDK接管现实硬件

从屏幕到物理世界:AI Agent如何通过开源SDK接管现实硬件

Muse 登顶 App Store 免费榜那天&#xff0c;开发者群里最热闹的不是它 UI 多好看&#xff0c;而是一张截图&#xff1a;一个看起来跟普通聊天助手没什么区别的 App&#xff0c;被用户指示着自己打开外卖平台、翻出历史订单、比对优惠、完成支付&#xff0c;最后把取餐号推到表…

2026/10/20 22:17:20 阅读更多 →
Python爬虫实战:TOP250电影数据采集与可视化分析

Python爬虫实战:TOP250电影数据采集与可视化分析

简介&#xff1a;面向Python学习者与毕设学生的豆瓣TOP250电影爬虫与数据分析可视化项目&#xff0c;覆盖爬虫采集、数据清洗、数据库建表、可视化出图完整流程&#xff0c;适合作为课程设计、期末大作业或毕业设计的参考源码。资源共11个文件&#xff0c;包含3个Python程序文件…

2026/10/20 22:17:20 阅读更多 →
Agent交互设计:用心理模型与状态透明化建立用户信任

Agent交互设计:用心理模型与状态透明化建立用户信任

我前阵子盯着一个Agent产品做可用性测试&#xff0c;有个场景印象特别深&#xff1a;一位测试用户对着对话框输入“帮我把这份表格里的数据做个趋势分析&#xff0c;再生成一张图表发我”。消息发出去之后&#xff0c;界面开始转圈。用户盯着那个旋转指示器看了十几秒&#xff…

2026/10/20 22:17:20 阅读更多 →
本地部署大模型实战:Ollama 安装、配置与模型运行全攻略

本地部署大模型实战:Ollama 安装、配置与模型运行全攻略

很多人第一次听说本地跑大模型&#xff0c;第一反应是这事跟普通人有关系吗&#xff1f;老实说&#xff0c;我开始也是这么想的。直到我下决心在自己电脑上跑通一次 Ollama&#xff0c;才发现把一个大模型装进本地环境&#xff0c;已经在不知不觉中变得很像装一个普通应用——下…

2026/10/20 22:17:20 阅读更多 →
大模型与特征工程在A股量化策略中的落地实践

大模型与特征工程在A股量化策略中的落地实践

做A股量化一段时间后&#xff0c;你会发现真正决定策略能不能活下来的&#xff0c;往往不是模型本身有多高级&#xff0c;而是特征怎么构造、信号怎么合成、实盘链路怎么打通。这篇是系列的下篇&#xff0c;重点聊特征工程和大模型决策落地的完整路线。如果你还在纠结"该怎…

2026/10/20 22:16:04 阅读更多 →

日新闻

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 阅读更多 →