diff --git a/doc/SL_MWYT_SERV24_V22_250917.pdf b/doc/SL_MWYT_SERV24_V22_250917.pdf new file mode 100644 index 0000000..f06340b Binary files /dev/null and b/doc/SL_MWYT_SERV24_V22_250917.pdf differ diff --git a/doc/hy_mwyt_3s24_v20_221118.pdf b/doc/hy_mwyt_3s24_v20_221118.pdf new file mode 100644 index 0000000..1e11854 Binary files /dev/null and b/doc/hy_mwyt_3s24_v20_221118.pdf differ diff --git a/doc/sl_mwyt_serv24_v22_250728.pdf b/doc/sl_mwyt_serv24_v22_250728.pdf new file mode 100644 index 0000000..595b608 Binary files /dev/null and b/doc/sl_mwyt_serv24_v22_250728.pdf differ diff --git a/drivers/readme.md b/drivers/readme.md index 9c0ac11..e414db0 100644 --- a/drivers/readme.md +++ b/drivers/readme.md @@ -1,3 +1,7 @@ +## ADC原理说明 + + + GD32F4系列搭载了高性能的12位逐次逼近型(SAR)ADC,提供了非常灵活和强大的数据采集功能。其采集方式可以从**操作模式**和**数据转移方式**两个维度来理解。 ### 一、按操作模式划分 @@ -184,6 +188,8 @@ C1 -->|读取注入组
有专用寄存器| A2 三者协同工作,共同构成了一个高效、可靠且响应及时的数据采集系统。 +## `adc_routine_channel_config`函数说明 + 在GD32微控制器的ADC驱动库中,`adc_routine_channel_config`函数用于配置规则组(常规序列)的通道序列。 ### 🧾 函数原型 @@ -222,15 +228,13 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann 函数的作用就是将特定的物理通道(`channel`)安排到规则组转换序列中的指定位置(`rank`)上。 - --- - - +## ADC程序模式说明 这几种ADC模式是STM32中常见的配置组合,主要区别在于**转换组别、转换方式、数据采集方式**等方面。让我详细解释每种模式: -## ADC_MODE_0 - 基础单次转换模式 +### ADC_MODE_0 - 基础单次转换模式 ```c // 规则组、单次转换、非扫描 @@ -253,7 +257,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann 触发 → 转换通道1 → 停止 → 等待下次触发 ``` -## ADC_MODE_1 - 注入组扫描模式 +### ADC_MODE_1 - 注入组扫描模式 ```c // 注入组、单次转换、扫描、转换结束标志位采集 @@ -276,7 +280,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann 触发 → 转换通道1 → 转换通道2 → 设置EOC标志 → 读取数据 ``` -## ADC_MODE 2 - 中断方式注入组扫描 +### ADC_MODE 2 - 中断方式注入组扫描 ```c // 注入组、单次转换、扫描、中断转换结束标志位采集 @@ -299,7 +303,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann 触发 → 转换通道1 → 转换通道2 → 产生中断 → 在ISR中读取数据 ``` -## ADC_MODE 3 - DMA连续采集模式 +### ADC_MODE 3 - DMA连续采集模式 ```c // 规则组、连续转换、扫描、DMA采集 @@ -324,9 +328,9 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann ↑_____________________________循环___________________________↑ ``` -## 关键概念对比 +### 关键概念对比 -### 1. 规则组 vs 注入组 +#### 1. 规则组 vs 注入组 | 特性 | 规则组 | 注入组 | | ------ | -------- | ------------------ | @@ -334,7 +338,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann | 通道数 | 最多16个 | 最多4个 | | 应用 | 常规测量 | 紧急或同步测量 | -### 2. 单次 vs 连续转换 +#### 2. 单次 vs 连续转换 | 特性 | 单次转换 | 连续转换 | | -------- | ---------------- | ------------ | @@ -342,7 +346,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann | CPU占用 | 低 | 需要管理数据 | | 适用场景 | 低速采样 | 高速连续采样 | -### 3. 数据获取方式对比 +#### 3. 数据获取方式对比 | 方式 | 查询标志位 | 中断方式 | DMA方式 | | ------- | ---------------- | ------------------- | -------- | @@ -350,9 +354,9 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann | 实时性 | 一般 | 好 | 最好 | | 复杂度 | 简单 | 中等 | 复杂 | -## 实际应用建议 +### 实际应用建议 -### 选择指南: +#### 选择指南: - **简单单通道读取** → MODE_0 - **紧急多通道测量** → MODE_1或MODE_2 @@ -360,10 +364,174 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann - **需要实时响应** → MODE_2(中断) - **需要低CPU占用** → MODE_3(DMA) -### 性能考虑: +#### 性能考虑: - DMA模式适合采样率>10Ksps的场景 - 中断模式适合1-10Ksps的中等速率 - 查询模式适合<1Ksps的低速应用 这些模式覆盖了从简单到复杂的各种ADC应用场景,可以根据具体需求灵活选择。 + +--- + +| 事件 | 断电保护 | 电压过高保护 | 过流保护 | 一般温度(10℃以下)故障 | 极限温度(10℃以上)故障 | 光电开关遮挡 | +| :--: | :----------: | :----------: | :------: | :----------------------: | :----------------------: | -------------------- | +| 响应 | 检测掉电存储 | 断电 | 电机停转 | -(仅故障回传) | 电机停转 | 同时累计遮挡电机停转 | +| | | | | | | | +| | | | | | | | + +# 高精度转台/云台嵌入式软件故障上报与响应规范 + +## 概述 + +此文档定义了高精度转台(云台)嵌入式软件中的故障上报与响应机制。涵盖的主要故障类型包括电源异常(过电压、过流)、温度异常、光电挡板(限位传感器)异常、掉电保护等。 + +### 大概故障分类 + +按紧急程度分为P0(致命)、P1(高)、P2(中)、P3(低)四类故障。 + +| 故障类型 | 定义 | 响应 | +| ------------- | ------------------------------------ | -------------------------------------- | +| P0 致命 | 严重电流过载、电压过高、温度过高 | 立即停机、断电、报警,并持久化故障状态 | +| P1 高 | 光电挡板遮挡、电流持续过流、电压过低 | 停机、限流、恢复模式,报警上报 | +| P2 中 | 温度接近限制、传感器异常 | 限速、报警上报 | +| P3 低(可不用) | 通信错误、较小的传感器波动 | 记录日志,便于后续诊断 | + +## 关键设计原则 + +- **快速检测,安全响应**:利用硬件中断和软件冗余检测保障故障发生时的最短响应时间。 +- **可恢复优先,不能恢复则安全停机**:在无法恢复的情况下紧急停机并持久化关键故障信息。 +- **掉电保护**:确保在掉电时能够正确保存系统状态,以便恢复。 + +## 主要模块 + +### 电压监测 + +- **硬件设计**:利用ADC模块(或者电压比较器)监测主电源电压。 +- **故障响应**:过电压和欠电压将触发报警,并在满足条件时进行电机断电、停机。 + +### 电流监测 + +- **硬件设计**:使用霍尔传感器或分流电阻监测电机电流。 +- **故障响应**:持续过流时,电机停止工作,并切断PWM驱动或者发送停转电机指令。 + +### 温度监测 + +- **硬件设计**:通过温度传感器(如NTC热敏电阻或者TMP75)进行监测。 +- **故障响应**:超过设定温度阈值时,限制负载和转速,或停机保护。 + +### 光电挡板(限位)监测 + +- **硬件设计**:使用光电传感器或光耦监测挡板状态。 +- **故障响应**:检测到遮挡时,立即停机,避免碰撞。 + +### 掉电保护 + +- **硬件设计**:通过监测电源电压下降,并使用电容保证在掉电瞬间写入系统状态。 +- **故障响应**:在掉电事件前保存关键状态数据。 + +## 故障上报 + +错误代码使用统一格式进行上报,确保与上位机的兼容性。 + +| 错误码 | 错误描述 | 优先级 | 模块 | +| ---------- | -------------------- | ------ | ---------- | +| 0x01010001 | 主电源过压 | P1 | 电源 | +| 0x01010002 | 主电源欠压 | P1 | 电源 | +| 0x02020001 | 电机A持续过流 | P0 | 电流 | +| 0x02020002 | 电机B短路 | P0 | 电流 | +| 0x03030001 | 驱动模块过温 | P1 | 温度 | +| 0x04040001 | 光电挡板左侧遮挡异常 | P1 | 限位传感器 | +| 0x04040002 | 光电挡板右侧开路 | P2 | 限位传感器 | +| 0x05050001 | 编码器错位 | P2 | 传感器 | + + +## 测试与验收 + +### 单元测试 + +* 电压检测:模拟电压过高/过低,验证响应动作。 +* 电流检测:模拟过流,验证驱动停止和故障上报。 +* 温度检测:模拟温度过高,验证系统限速和停机保护。 + +### 集成测试 + +* 多故障并发:模拟电流过载和电压不稳,检查故障优先级和响应动作。 +* 长时间压力测试:测试系统长时间稳定运行,模拟逐渐升温。 + +### 验收标准 + +* 掉电保护成功率:99.9%(断电前成功写入状态) +* 电流/电压/温度监测反应时间:≤5ms +* 故障上报与记录符合协议,信息完整且准确。 + +**示例上报报文格式** : + +```json +{ + "error_code": "0x01020005", + "severity": "P1", + "timestamp": "2025-09-30T11:32:14Z", + "voltage_v": 28.3, + "current_a": 1.3, + "temp_c": 52.4, + "encoder_deg": 12.345, + "message": "motor B continuous overcurrent", + //"firmware": "v1.2.3", + "cmd_id": "PT-001" + "mac": "PT-001" +} + +``` + +## C示例代码 + +```c +// 电流监测中断处理示例 +void OVERCURRENT_IRQHandler(void) { + // 立即切断驱动使能 + Motor_DisableDriver(MOTOR_B); + + // 读取电流并记录 + float current = adc_read(CURRENT_B); + log_error(ERROR_CODE_OVERCURRENT(MOTOR_B), "Overcurrent detected", current); + + // 上报错误至上位机 + ReportErrorToHost(ERROR_CODE_OVERCURRENT(MOTOR_B)); + + // 进入等待人工复位模式 + EnterSafeLoop(); +} + +// 掉电ISR 保存最小状态 +volatile bool power_failing = false; + +void POWER_FALL_IRQHandler(void) { + if (power_failing) return; + power_failing = true; + + // 禁止新动作,立即切断PWM + Motor_StopAllPWMImmediate(); + + // 采集快照 + Snapshot_t snap; + snap.magic = SNAP_MAGIC; + snap.timestamp = rtc_get_time(); + snap.voltage = adc_read(VOLTAGE_CHANNEL); + snap.current = adc_read(CURRENT_CHANNEL); + snap.temp = adc_read(TEMP_CHANNEL); + snap.encoder_pos = encoder_get_position(); + snap.error_flags = global_error_flags; + + // 计算CRC并保存 + snap.crc = crc32((uint8_t*)&snap, sizeof(snap) - sizeof(snap.crc)); + FRAM_Write(SNAPSHOT_ADDR, (uint8_t*)&snap, sizeof(snap)); + + // 启动刹车机制 + Hardware_EnableBrake(); + + // 进入安全循环 + EnterSafeLoop(); +} + +```