# sensor16w **Repository Path**: esd-robot/sensor16w ## Basic Information - **Project Name**: sensor16w - **Description**: 基于 TI MSPM0G3507 的自适应高速光电循迹传感器方案 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-22 - **Last Updated**: 2025-10-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SENSOR16W - 16路高速光电循迹传感器 > 基于 TI MSPM0G3507 的自适应高速传感器方案 ## 核心特性 - 🚀 **高速采样**:双ADC并行,最高1157Hz采样率 - 📊 **自适应滤波**:根据发送频率自动调整ADC平均次数(16x~128x) - 📦 **高效协议**:8字节紧凑帧格式,位图压缩16路传感器状态 - ⚙️ **动态配置**:支持UART命令调整发送频率(1-1000Hz) - 🔄 **DMA传输**:零CPU占用的高效数据传输 - 💾 **参数持久化**:阈值自动保存到EEPROM仿真区 ## 硬件连接 - 参考ti-sysconfig配置 - 参考立创EDA的原理图 ## 项目结构 - sensor 业务源码及工程目录 - bsp 板级支持包,驱动库的主要内容 - CMSIS cortex-M0+的驱动 - vendor 芯片厂商驱动库,是TI的MSPM0G3507。 ## 🔌 串口通信协议 ### ⚙️ 通信参数 | 参数 | 配置 | |------|------| | 波特率 | 115200 bps | | 数据位 | 8 bit | | 停止位 | 1 bit | | 校验位 | None | | 流控制 | None | | 帧长度 | 8 字节(固定) | | 发送频率 | 可配置 1-1000Hz(默认100Hz) | | 传输延迟 | ~0.7ms/帧 @ 115200bps | ### 📤 数据帧格式(8字节) > **设计理念**:使用位图编码压缩16路传感器状态 ![alt text](pics/实物图.jpg) 以下叙述均以此实物图方向为准(指示灯向上,光电管向下,安装孔指向自己的方向) #### 帧结构总览 ```c ['X' 'J'] [err] [bitmap_high] [bitmap_low] [checksum] // 2字节 1字节 1字节 1字节 1字节 = 6字节 ``` #### 字段详细说明 | 偏移 | 字段 | 类型 | 取值范围 | 说明 | |------|------|------|----------|------| | 0-1 | header | char[2] | "XJ" | 帧头标识,ASCII字符串 | | 2 | err | int8_t | -15 ~ +15 | 线位置误差(负=左偏,正=右偏,0=居中) | | 3 | bitmap_high | uint8_t | 0x00 ~ 0xFF | 传感器15-8状态位图 0=白 1=黑 | | 4 | bitmap_low | uint8_t | 0x00 ~ 0xFF | 传感器7-0状态位图 0=白 1=黑 | | 5 | checksum | uint8_t | 0x00 ~ 0xFF | 校验和:(err + bitmap_low + bitmap_high) & 0xFF | ### 📥 命令格式 #### 设置发送频率 **命令格式**:`ESD=XXXX` - `XXXX`:4位十进制数字,表示频率(Hz) - 范围:0001 ~ 1000 - 示例:`ESD=0100` 设置为100Hz(没有换行!) **响应格式**: | 响应 | 含义 | 说明 | |------|------|------| | `OK\n` | 成功 | 频率设置成功 | | `E1\n` | 错误码1 | 频率超出范围 [1-1000]Hz | | `E2\n` | 错误码2 | 频率格式错误(包含非数字字符) | | `E3\n` | 错误码3 | 命令头错误(非"ESD=") | 在接收到命令后,传感器会立即响应ACK,并在下一个发送周期生效。有极小可能(如果传输错误导致你只发了一个"ESD="四字节刚好会骗过TI的FIFO超时监测和软件做的帧头监测)遇到DMA定长传输冲突,导致响应丢失。建议上位机在没有接收到ACK回执时等待1ms再重试发送命令尝试。 **示例交互**: ```bash # 成功场景 发送: ESD=0500 接收: OK\n # 设置为500Hz成功 # 失败场景 发送: ESD=2000 接收: E1\n # 超出最大频率1000Hz 发送: ESD=ABC0 接收: E2\n # 包含非数字字符 发送: XXX=0100 接收: E3\n # 命令头错误 ``` ### 📊 数据处理建议 1. **误差值 (err)**: - 范围:-15 到 +15(int8_t) - 计算方式:`err = 15 - leftedge - rightedge` - 用途:PID控制的核心输入 - 物理意义: - `err < 0`:线偏左,需向右转 - `err > 0`:线偏右,需向左转 - `err = 0`:完美居中或无线检测 - 处理:直接用于PID控制,无跳变沿时返回0(需上位机判断丢线) 2. **传感器位图 (bitmap)**: - 编码方式:二进制位图 - `bit = 1`:检测到黑线(阳性) - `bit = 0`:检测到白色背景(阴性) - 阈值判断:`raw[i] > threshold[i] ? 1 : 0` - 通过K1按键校准阈值(自动计算max/min中值) - 处理:根据位图计算线位置,或直接显示16路状态 3. **校验和 (checksum)**: - 算法:`(err + bitmap_low + bitmap_high) & 0xFF` - 用途:检测传输错误 - 处理:校验失败应丢弃该帧 - 注意:不包含header和tail