parent
cc7696c5ac
commit
521b2be597
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,3 +1,7 @@
|
||||||
|
## ADC原理说明
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GD32F4系列搭载了高性能的12位逐次逼近型(SAR)ADC,提供了非常灵活和强大的数据采集功能。其采集方式可以从**操作模式**和**数据转移方式**两个维度来理解。
|
GD32F4系列搭载了高性能的12位逐次逼近型(SAR)ADC,提供了非常灵活和强大的数据采集功能。其采集方式可以从**操作模式**和**数据转移方式**两个维度来理解。
|
||||||
|
|
||||||
### 一、按操作模式划分
|
### 一、按操作模式划分
|
||||||
|
@ -184,6 +188,8 @@ C1 -->|读取注入组<br>有专用寄存器| A2
|
||||||
|
|
||||||
三者协同工作,共同构成了一个高效、可靠且响应及时的数据采集系统。
|
三者协同工作,共同构成了一个高效、可靠且响应及时的数据采集系统。
|
||||||
|
|
||||||
|
## `adc_routine_channel_config`函数说明
|
||||||
|
|
||||||
在GD32微控制器的ADC驱动库中,`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`)上。
|
函数的作用就是将特定的物理通道(`channel`)安排到规则组转换序列中的指定位置(`rank`)上。
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## ADC程序模式说明
|
||||||
|
|
||||||
|
|
||||||
这几种ADC模式是STM32中常见的配置组合,主要区别在于**转换组别、转换方式、数据采集方式**等方面。让我详细解释每种模式:
|
这几种ADC模式是STM32中常见的配置组合,主要区别在于**转换组别、转换方式、数据采集方式**等方面。让我详细解释每种模式:
|
||||||
|
|
||||||
## ADC_MODE_0 - 基础单次转换模式
|
### ADC_MODE_0 - 基础单次转换模式
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// 规则组、单次转换、非扫描
|
// 规则组、单次转换、非扫描
|
||||||
|
@ -253,7 +257,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann
|
||||||
触发 → 转换通道1 → 停止 → 等待下次触发
|
触发 → 转换通道1 → 停止 → 等待下次触发
|
||||||
```
|
```
|
||||||
|
|
||||||
## ADC_MODE_1 - 注入组扫描模式
|
### ADC_MODE_1 - 注入组扫描模式
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// 注入组、单次转换、扫描、转换结束标志位采集
|
// 注入组、单次转换、扫描、转换结束标志位采集
|
||||||
|
@ -276,7 +280,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann
|
||||||
触发 → 转换通道1 → 转换通道2 → 设置EOC标志 → 读取数据
|
触发 → 转换通道1 → 转换通道2 → 设置EOC标志 → 读取数据
|
||||||
```
|
```
|
||||||
|
|
||||||
## ADC_MODE 2 - 中断方式注入组扫描
|
### ADC_MODE 2 - 中断方式注入组扫描
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// 注入组、单次转换、扫描、中断转换结束标志位采集
|
// 注入组、单次转换、扫描、中断转换结束标志位采集
|
||||||
|
@ -299,7 +303,7 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann
|
||||||
触发 → 转换通道1 → 转换通道2 → 产生中断 → 在ISR中读取数据
|
触发 → 转换通道1 → 转换通道2 → 产生中断 → 在ISR中读取数据
|
||||||
```
|
```
|
||||||
|
|
||||||
## ADC_MODE 3 - DMA连续采集模式
|
### ADC_MODE 3 - DMA连续采集模式
|
||||||
|
|
||||||
```c
|
```c
|
||||||
// 规则组、连续转换、扫描、DMA采集
|
// 规则组、连续转换、扫描、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个 |
|
| 通道数 | 最多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占用 | 低 | 需要管理数据 |
|
| CPU占用 | 低 | 需要管理数据 |
|
||||||
| 适用场景 | 低速采样 | 高速连续采样 |
|
| 适用场景 | 低速采样 | 高速连续采样 |
|
||||||
|
|
||||||
### 3. 数据获取方式对比
|
#### 3. 数据获取方式对比
|
||||||
|
|
||||||
| 方式 | 查询标志位 | 中断方式 | DMA方式 |
|
| 方式 | 查询标志位 | 中断方式 | DMA方式 |
|
||||||
| ------- | ---------------- | ------------------- | -------- |
|
| ------- | ---------------- | ------------------- | -------- |
|
||||||
|
@ -350,9 +354,9 @@ void adc_routine_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t chann
|
||||||
| 实时性 | 一般 | 好 | 最好 |
|
| 实时性 | 一般 | 好 | 最好 |
|
||||||
| 复杂度 | 简单 | 中等 | 复杂 |
|
| 复杂度 | 简单 | 中等 | 复杂 |
|
||||||
|
|
||||||
## 实际应用建议
|
### 实际应用建议
|
||||||
|
|
||||||
### 选择指南:
|
#### 选择指南:
|
||||||
|
|
||||||
- **简单单通道读取** → MODE_0
|
- **简单单通道读取** → MODE_0
|
||||||
- **紧急多通道测量** → MODE_1或MODE_2
|
- **紧急多通道测量** → 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(中断)
|
- **需要实时响应** → MODE_2(中断)
|
||||||
- **需要低CPU占用** → MODE_3(DMA)
|
- **需要低CPU占用** → MODE_3(DMA)
|
||||||
|
|
||||||
### 性能考虑:
|
#### 性能考虑:
|
||||||
|
|
||||||
- DMA模式适合采样率>10Ksps的场景
|
- DMA模式适合采样率>10Ksps的场景
|
||||||
- 中断模式适合1-10Ksps的中等速率
|
- 中断模式适合1-10Ksps的中等速率
|
||||||
- 查询模式适合<1Ksps的低速应用
|
- 查询模式适合<1Ksps的低速应用
|
||||||
|
|
||||||
这些模式覆盖了从简单到复杂的各种ADC应用场景,可以根据具体需求灵活选择。
|
这些模式覆盖了从简单到复杂的各种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();
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in New Issue