# DAConvert **Repository Path**: KiraVerSace/daconvert ## Basic Information - **Project Name**: DAConvert - **Description**: RS485->0-10V模块 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-05 - **Last Updated**: 2025-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DAConvert ## 引脚对应关系 | 功能模块 | MCU 引脚 | 备注 | |---------------------|-----------------------|--------------------------| | RS485_TX | PA2 (USART2_TX) | Modbus RTU 发送 | | RS485_RX | PA3 (USART2_RX) | Modbus RTU 接收 | | RS485_DE | PA0 | 485 驱动发送使能 | | RS485_RE | PA1 | 485 驱动接收使能/方向 | | GP8413_SCL | PB10 (I2C2_SCL) | DAC I2C 时钟 | | GP8413_SDA | PB11 (I2C2_SDA) | DAC I2C 数据 | | RELAY_CH1 | PB4 | 继电器 CH1 控制 | | RELAY_CH2 | PB5 | 继电器 CH2 控制 | | LED_BUILTIN_G | PC0 | 状态指示灯 (低电平点亮) | | PhaseFollow_IN_A | PA8 | 三相 PWM 相 A 输入 | | PhaseFollow_IN_B | PC8 | 三相 PWM 相 B 输入 | | PhaseFollow_IN_C | PC9 | 三相 PWM 相 C 输入 | | PhaseFollow_OUT_A | PB0 | 相位跟随输出 A | | PhaseFollow_OUT_B | PB1 | 相位跟随输出 B | | PhaseFollow_OUT_C | PB2 | 相位跟随输出 C | | Debug_UART_TX | PA9 (USART1_TX) | 调试串口发送 | | Debug_UART_RX | PA10 (USART1_RX) | 调试串口接收 | 基于 STM32F103RC 的双通道 DA 转换器控制板,集成 Modbus RTU、GP8413 DAC、继电器及三相 PWM 跟随等功能,适用于现场模拟量输出和相位跟随控制场景。 > 当前固件版本:`V1.1.0`(PhaseFollow 模块已启用,继电器默认关闭) ## 目录 1. [功能特性](#功能特性) 2. [核心指标](#核心指标) 3. [项目结构](#项目结构) 4. [开发环境要求](#开发环境要求) 5. [快速上手](#快速上手) 6. [硬件连接](#硬件连接) 7. [Modbus 寄存器](#modbus-寄存器) 8. [校准流程](#校准流程) 9. [系统架构](#系统架构) 10. [调试与日志](#调试与日志) 11. [常见问题](#常见问题) 12. [相关文档](#相关文档) ## 功能特性 - **Modbus RTU 通信**:支持功能码 0x03/0x06/0x10,可配置地址、波特率、校验位和停止位。 - **双通道 0-10V 输出**:基于 GP8413(15 位)DAC,提供 11 点线性插值校准与外推能力。 - **双路继电器控制**:独立通道控制,开机默认关闭,支持保持状态持久化。 - **三相 PWM 跟随**:PhaseFollow 模块实时采集三相 PWM 输入并计算频率/占空比,用于同步输出。 - **参数持久化**:所有通信、输出、校准参数写入 EEPROM,掉电不丢失。 - **调试日志增强**:集成 ArduinoLog(xLog)Trace 级别日志,可追踪 DAC 校准插值细节。 ## 核心指标 | 指标 | 规格 | |----------------|--------------------------------------------------------------| | MCU | STM32F103RC (256 KB Flash / 48 KB RAM) | | 电源 | 3.3 V / 5 V | | DAC 输出范围 | 0 ~ 10 V(15 位,1 LSB ≈ 0.305 mV) | | 通信接口 | RS485(Modbus RTU) | | 继电器 | 2 路常开触点,最高 250 VAC / 30 VDC | | PWM 输入 | 3 路(Phase A/B/C),支持频率测量 | | 典型功耗 | < 1 W(不含外设) | ## 项目结构 ``` ├── include/ # 公共头文件(如 xCode.h、appPhaseFollow.h 等) ├── src/ # 主程序入口与任务实现 ├── lib/ # 第三方库(ArduinoLog、FreeRTOS、letterShell 等) ├── docs/ # 项目文档、Modbus 点表(MD/PDF/CSV) ├── platformio.ini # PlatformIO 项目配置 └── test/ # 单元测试或样例(预留) ``` ## 开发环境要求 - **操作系统**:Windows / macOS / Linux - **工具链**:PlatformIO Core ≥ 6.1(推荐 VS Code + PlatformIO IDE) - **Python**:3.8 及以上(PlatformIO 依赖) - **串口调试工具**:`pio device monitor` 或其它串口终端 ## 快速上手 1. **克隆仓库并初始化 PlatformIO 依赖**: ```bash git clone cd DAConvert platformio run ``` 2. **连接硬件**:将目标板通过 ST-Link/串口接入电脑,确认 `platformio.ini` 中的 `upload_port`、`monitor_port` 配置正确。 3. **编译与烧录**: ```bash platformio run --target upload ``` 4. **串口监控(115200 8N1)**: ```bash platformio device monitor ``` ## 硬件连接 ``` RS485 (USART2): PA2(TX) PA3(RX) PA0(DE) PA1(RE) I2C (GP8413): PB10(SCL) PB11(SDA) 继电器输出: PB4(CH1) PB5(CH2) PhaseFollow 输入: PA8(A) PC8(B) PC9(C) PhaseFollow 输出: PB0(A) PB1(B) PB2(C) 状态指示灯: PC0 (低点亮) 调试串口: USB ↔ UART1 (PA9/PA10) ``` ## Modbus 寄存器 常用寄存器如下,完整点表可参考 [Modbus 点表文档](#相关文档): | 地址 | 功能 | 读写 | 说明 | |------|-----------------|------|---------------------------------------| | 0 | 设备地址 | R/W | 1–247 | | 1 | 波特率 | R/W | 0:4800 ... 6:115200 | | 2 | 奇偶校验 | R/W | 0:无 1:奇 2:偶 | | 3 | 停止位 | R/W | 0:1 位 1:2 位 | | 4-6 | 默认输出参数 | R/W | 上电默认电压、继电器状态 | | 10-31| CH1/CH2 校准表 | R/W | 11 个校准点数据(单位:mV) | | 100 | CH1 实时输出 | R/W | 0–10000 mV | | 101 | CH2 实时输出 | R/W | 0–10000 mV | | 102 | 继电器控制寄存器| R/W | bit0=CH1, bit1=CH2 | **默认通信参数**:地址 `3`、波特率 `9600`、格式 `8N1`。 ### Python 示例 ```python from pymodbus.client import ModbusSerialClient client = ModbusSerialClient(port="/dev/ttyUSB0", baudrate=9600, parity="N", stopbits=1, bytesize=8) if client.connect(): # 设置 CH1 输出 5V client.write_register(address=100, value=5000, unit=3) # 读取 CH1/CH2 输出 rr = client.read_holding_registers(address=100, count=2, unit=3) print(rr.registers) # 控制继电器(同时闭合) client.write_register(address=102, value=0x03, unit=3) client.close() ``` ## 校准流程 1. **准备**:使用高精度万用表连接在 CH1/CH2 输出端;确保设备在稳定温度下。 2. **写入期望值**:通过 Modbus 将标准电压(例如 1000 mV、5000 mV)写入实时输出寄存器 `100/101`。 3. **读取实测值**:记录实际输出电压,写入对应校准寄存器(如 CH1 点 1 位于地址 11)。 4. **重复 11 点**:完成 0.1V~9.9V 的 11 个点校准,系统自动完成线性插值和外推。 5. **验证**:再次写入任意目标电压,确认输出误差在允许范围内。 > Trace 级日志会输出插值细节和上下界外推信息,便于分析。 ## 系统架构 固件基于 FreeRTOS,多任务分工如下: - `modbusSlaveTask`(优先级 2):负责串口通信、寄存器映射及 EEPROM 同步。 - `periphRunTask`(优先级 1):处理 DAC 输出、继电器控制与安全检查。 - `phaseFollowTask`(优先级 1):采集三相 PWM,执行频率/相位计算。 任务间通过消息队列与共享数据结构互通,xCommon 模块统一管理参数元数据。 ## 调试与日志 - **串口速率**:115200 8N1。 - **日志等级**:默认 INFO,可在 `ArduinoLog` 配置中打开 TRACE。 - **典型启动日志**: ``` >> System start... [72]MHz [INFO] EEPROM was initialized, load parameters... [INFO] ModbusAddress=[3] [INFO] BaudRate=[9600],Parity=[0],StopBit=[1] [TRACE] CH1 target=5000mV, cal=4996mV, code=16350 ``` ## 常见问题 | 问题 | 排查建议 | |------------------------------|----------| | PlatformIO 编译失败 | 更新依赖库,删除 `.pio` 目录后重新编译 | | 串口无输出 | 确认串口线连接及波特率 115200 | | Modbus 无响应 | 检查 RS485 A/B 极性、终端电阻、设备地址 | | DAC 输出异常 | 确认 I2C 拉线牢靠,并复位 GP8413 电源 | | PhaseFollow 数值不稳定 | 确认输入 PWM 幅值 >2.5V 且频率稳定 | ## 相关文档 - `docs/Modbus_Point_Table.md`:详细 Modbus 点表(Markdown)。 - `docs/Modbus_Point_Table.pdf`:PDF 版本,适合打印归档。 - `docs/Modbus_Point_Table_Excel.csv`:Excel 兼容 CSV,含 UTF-8 BOM,便于现场导入。 - `docs/` 目录下更多硬件接线图、调试笔记与 Wiki 草稿。 --- 由 **V-Think Development Team** 维护,如需商业定制或技术支持,请联系 `KiraVerSace@yeah.net`。