本项目设计并实现了一款基于嵌入式系统的多功能光谱分析仪,采用M型Czerny-Turner光学架构,结合闪耀光栅分光技术与东芝TCD1304线阵CCD,实现430–630 nm波段范围内的高精度光谱检测,光学分辨率达0.5nm。通过高性能RISC-V架构单片机CH32V307完成光信号采集、处理及数字转换,构建完整的数据处理链路。传感器使用线阵ccd,芯片是东芝TCD1304.
其中tcd1234.zip文件是沁恒ch32v307vct6MCU驱动东芝TCD1304的程序 spectromete.zip是同样使用沁恒ch32v307的上位机程序,实现对CCD采集的光谱信息进行处理并进行与串口屏间的交互。串口屏型号为:淘晶驰 TJC1060X570_011C_I
该光谱仪整体框架由光学系统、电路模块(含MCU)、触控屏幕和电池供电系统四部分构成,各模块协同工作,共同完成光谱信息采集、分析、展示等功能。
待测光先通过狭缝进入光学系统,经内部元件( 1 - 9 对应光学元件,含准直镜、光栅、线阵CCD 等)完成光信号分光与光电转换;转换后的电信号传输至MCU 等电路模块,由沁恒芯片(CH32V307VCT6)进行信号处理、光谱重构等运算;电池供电系统为电路模块、触控屏幕提供电力,保障各部分运行;触控屏幕一方面接收用户操作指令(如参数设置),传递给 MCU 模块执行,另一方面实时显示 MCU 处理后的光谱数据、操作界面,实现人机交互。在供电系统的支持下,通过 “光信号采集-电信号处理-指令交互与结果呈现” 的流程,各模块相互配合,完成光谱测量。
(1)系统总体架构
应用层:数据采集、控制参数配置、数据传输
驱动层:定时器驱动 (TIM1/TIM2/TIM3/TIM4)、ADC驱动、DMA驱动、USART驱动
硬件层:CH32V307 MCU、TCD1304传感器、信号调理电路
(2)信号连接方案
TCD1304引脚--CH32V307连--信号特性
ICG--PA8 (TIM1_CH1)--负极性脉冲 2*(SH周期+10μs)
SH--PA6 (TIM3_CH1)--正极性脉冲 10μs-7.5ms可调
φM--PA0 (TIM2_CH1)--2MHz方波 50%占空比
Analog Out--PA1 (ADC1_IN1)--0.3-2.3V模拟输出
(3)通信协议
指令集:
0xA1 请求发送当前帧数据;
0xB1 设置SH周期10us;
0xB2 设置SH周期20us;
0xB3 设置SH周期50us;
0xB4 设置SH周期60us;
0xB5 设置SH周期75us;
0xB6 设置SH周期100us;
0xB7 设置SH周期500us;
0xB8 设置SH周期1.25ms;
0xB9 设置SH周期2.5ms;
0xBA 设置SH周期7.5ms;
数据帧格式:
[长度] 2字节 (小端)
[数据] 7296字节 (3648像素×2字节)
(4)关键问题与解决方案
ADC采样问题:初期测试中出现像素位置偏移
解决方案:引入硬件触发链路:TIM2→TIM4→ADC,改为主从模式并添加SH脉冲延迟补偿
数据输出问题:若将SH配置为单脉冲,按照TCD1304普通时序图配置。此时MCU像串口传输数据的时间也要算入积分时长,导致数据异常。
解决方案:将SH改为固定周期,使用TCD1304 Electronic Shutter功能
可变积分时间问题:更改SH周期时会导致ICG和SH相位不匹配,导致输出数据错误
解决方案:每次输出数据后重置产生ICG和SH的定时器,并补偿SH脉冲延迟
(1)状态机模块介绍
IDLE:检测auto_collect_flag或uart2_cmd_flag
START:发送特定起始字节(如0xAA)到ADC模块
WAIT:等待USART3 DMA完成标志 或 TIM6超时(防止死等)
PROCESS:原始数据转12位(右移4位+补码处理)
AVERAGE:累计采样达到AVG_TIMES后求均值
SEND:封装数据帧(添加0xFE头、校验和、0xFF尾)
(2)中断服务函数
TIM6_IRQHandler:1ms定时中断服务程序,仅执行sysTickCnt++和清除中断标志,确保系统时间基准的精确性。
USART2_IRQHandler:采用三状态机(头/数据/尾)解析控制指令:检测到0xFE进入数据接收状态,收满16字节后遇到0xFF置位完成标志,严格校验数据包完整性。
USART3_IRQHandler:通过空闲中断检测USART3数据帧结束,在DMA搬运完成后触发data_buffer_index更新,主循环通过该索引判断数据就绪。
(3)功能函数
ProcessReceivedData:根据adc_resolution模式转换原始数据,12位模式下每2字节合并为1个采样值,8位模式左移4位扩展,统计信息模式解析特征参数。
ProcessReceivedData1:为数据归一化处理函数,扫描数组找到最大值后,若超过阈值(0x15),则按比例压缩所有数据至0xFD以下,防止后续处理溢出。
ProcessReceivedData2:为多功能函数,对于校准功能我们设计了适用于淘晶驰屏幕的动态校准核心算法:屏幕会将传过来的数据一一显示,数据点和坐标轴有一套映射关系,比如第10个点对应的波长为431nm。通过输入的校准数据计算出实际的映射关系。最后在进行反解,该波长对应的是实际映射的第几个点,如果是小数,就用四阶龙格法拟合出他对应的值。对于基线采集功能:当启用basic_collect时记录基线噪声,delete_flag触发时执行基线消除(差分运算+0x10偏移补偿)。其内还设置了自动采集间隔、平均次数等运行参数,并通过change_data来解析USART2指令包并更新系统参数。
(4)数据收发函数:
Serial_SendByte1:功能同Serial_SendByte3,但针对USART2控制通道,用于发送响应指令或状态报告。
Serial_SendByte3:通过USART3同步发送单字节数据,阻塞等待发送完成标志(USART_FLAG_TXE),确保数据可靠传输到ADC模块。
Serial_SendString:基于Serial_SendByte1实现字符串透传,用于调试信息输出或文件数据保存时的文本格式转换。
Serial_GetRxFlag:原子化读取USART2的接收完成标志Serial_RxFlag,并在读取后自动清零,避免重复处理同一指令包。
