配置 ADC 外设
本教程将引导您完成 ADC(模数转换器)外设的芯片模板配置。ADC 外设具有多种工作模式,且模式之间存在复杂的依赖和互斥关系,正确理解这些规则是配置 ADC 的关键。
概述
ADC 外设用于将模拟信号转换为数字信号。在芯片模板中配置 ADC 时,需要理解以下核心概念:
- 扫描模式 (Scan Mode):是否依次转换多个通道
- 连续模式 (Continuous Mode):是否连续循环转换
- 断续模式 (Discontinuous Mode):是否分批转换
- 常规转换 (Regular Conversion):常规通道组
- 注入转换 (Injected Conversion):可中断常规转换的高优先级通道组
模式依赖规则
以下是 ADC 模式之间的核心互斥和依赖规则:
规则 R1:连续转换与断续转换互斥
连续模式 (ContinuousConvMode) 与 断续模式 (DiscontinuousConvMode) 不能同时启用
| 连续模式 | 断续模式 | 是否允许 |
|---|---|---|
| Enable | Enable | ❌ 不允许 |
| Enable | Disable | ✅ 允许 |
| Disable | Enable | ✅ 允许 |
| Disable | Disable | ✅ 允许 |
规则 R2:断续转换必须依赖扫描模式
启用断续模式 (DiscontinuousConvMode) 前,必须先启用扫描模式 (ScanConvMode)
规则 R3:多通道必须启用扫描模式
当 NbrOfConversion > 1 时,必须启用扫描模式
规则 R4:单通道不能启用扫描模式
当 NbrOfConversion <= 1 时,不需要扫描模式
参数配置
基础参数
// ADC 配置示例
ADC: {
// 转换通道数
NbrOfConversion: {
label: 'Number Of Conversion',
value: '1',
type: 'number',
min: 1,
max: 16
},
// 扫描模式
ScanConvMode: {
label: 'Scan Conversion Mode',
type: 'select',
options: [
{
label: 'Enable',
value: 'enable',
disabled: '@get: $root.NbrOfConversion.value <= 1' // 单通道禁用
},
{
label: 'Disable',
value: 'disable',
disabled: '@get: $root.NbrOfConversion.value > 1' // 多通道禁用
}
]
},
// 连续模式
ContinuousConvMode: {
label: 'Continuous Conversion Mode',
type: 'select',
options: [
{
label: 'Enable',
value: 'enable',
disabled: "@get: $root.DiscontinuousConvMode.value === 'enable'"
},
{
label: 'Disable',
value: 'disable'
}
]
},
// 断续模式
DiscontinuousConvMode: {
label: 'Discontinuous Conversion Mode',
type: 'select',
options: [
{
label: 'Enable',
value: 'enable',
disabled: "@get: $root.ContinuousConvMode.value === 'enable' || $root.ScanConvMode.value === 'disable'"
},
{
label: 'Disable',
value: 'disable'
}
]
}
}
参数可见性规则
某些参数只在特定条件下显示:
// 转换通道数 — 仅在启用常规转换时可见
NbrOfConversion: {
visible: "@get: $root.EnableRegularConversions.value === 'enable'"
}
// 外部触发源 — 仅在启用常规转换时可见
ExternalTrigConv: {
visible: "@get: $root.EnableRegularConversions.value === 'enable'"
}
// 断续通道数 — 仅在启用断续模式时可见
NbrOfDiscConversion: {
visible: "@get: $root.DiscontinuousConvMode.value === 'enable'"
}
通道 Rank 配置
Rank 用于定义转换通道的顺序和属性:
// Rank 示例 — 第1个转换通道
RegularRank1: {
visible: "@get: $root.EnableRegularConversions.value === 'enable' && $root.NbrOfConversion.value >= 1"
}
RegularRank2: {
visible: "@get: $root.EnableRegularConversions.value === 'enable' && $root.NbrOfConversion.value >= 2"
}
// ... Rank3 到 Rank16 同理
常见配置场景
场景 1:单通道单次采集
最基础的 ADC 使用场景,只需采集一个通道:
| 参数 | 值 | 说明 |
|---|---|---|
| EnableRegularConversions | enable | 启用常规转换 |
| NbrOfConversion | 1 | 1 个通道 |
| ScanConvMode | disable | 单通道无需扫描 |
| ContinuousConvMode | disable | 单次采集 |
| DiscontinuousConvMode | disable | 不启用 |
| RegularRank1 | Channel 0 | 配置通道 |
场景 2:多通道扫描采集
需要依次采集多个通道时:
| 参数 | 值 | 说明 |
|---|---|---|
| EnableRegularConversions | enable | 启用常规转换 |
| NbrOfConversion | 3 | 3 个通道 |
| ScanConvMode | enable | 必须启用扫描模式 |
| ContinuousConvMode | disable | 单次扫描 |
| DiscontinuousConvMode | disable | 不启用 |
| RegularRank1~3 | 3 个通道配置 | 分别配置 |
场景 3:连续转换模式
需要持续不断地采集数据:
| 参数 | 值 | 说明 |
|---|---|---|
| NbrOfConversion | 1 | 1 个通道 |
| ScanConvMode | disable | 单通道 |
| ContinuousConvMode | enable | 启用连续转换 |
| DiscontinuousConvMode | disable | 与连续模式互斥 |
场景 4:断续扫描模式
多个通道,但分批转换:
| 参数 | 值 | 说明 |
|---|---|---|
| NbrOfConversion | 4 | 4 个通道 |
| ScanConvMode | enable | 必须启用扫描 |
| ContinuousConvMode | disable | 与断续互斥 |
| DiscontinuousConvMode | enable | 启用断续模式 |
| NbrOfDiscConversion | 2 | 每次转换 2 个通道 |
| ScanConvMode | enable | 必须启用 |
模拟看门狗配置
模拟看门狗用于监控 ADC 转换结果是否在预设的阈值范围内:
// 看门狗使能
EnableWatchDog: {
label: 'Enable WatchDog',
value: false,
type: 'checkbox'
}
// 看门狗模式
WatchdogMode: {
label: 'WatchDog Mode',
type: 'select',
visible: '@get: $root.EnableWatchDog.value === true',
options: [
{ label: 'Single Channel', value: 'single' },
{ label: 'All Channels', value: 'all' }
]
}
// 高阈值
HighThreshold: {
label: 'High Threshold',
type: 'number',
visible: '@get: $root.EnableWatchDog.value === true',
value: '4095'
}
// 低阈值
LowThreshold: {
label: 'Low Threshold',
type: 'number',
visible: '@get: $root.EnableWatchDog.value === true',
value: '0'
}
注入转换配置
注入转换提供高优先级的通道组,可中断常规转换:
// 注入转换使能
EnableInjectedConversions: {
label: 'Enable Injected Conversions',
value: false,
type: 'checkbox'
}
// 注入通道数
InjectedNbrOfConversion: {
label: 'Injected Number Of Conversion',
type: 'number',
visible: "@get: $root.EnableInjectedConversions.value === 'enable'",
min: 1,
max: 4
}
// 注入转换模式
InjectedConversionMode: {
label: 'Injected Conversion Mode',
type: 'select',
visible: "@get: $root.EnableInjectedConversions.value === 'enable' && $root.InjectedNbrOfConversion.value > 0"
}
双 ADC 模式
注意
双 ADC 模式仅在芯片支持多个 ADC 实例时可用(如 GD32F103 的 ADC0 和 ADC1)。ADC2 不支持双 ADC 模式。
CommonMode: {
label: 'Dual ADC Mode',
type: 'select',
visible: "@get: $root.$name === 'ADC0' || $root.$name === 'ADC1'",
disabled: "@get: $root.$name === 'ADC1'", // ADC1 跟随 ADC0 配置
options: [
{
label: 'Independent',
value: 'independent',
visible: '@get: ADC0.enabled() && ADC1.enabled()'
},
// ... 其他双 ADC 模式选项
]
}
注意事项
- 模式互斥验证:在编写初始化脚本时,建议添加配置验证逻辑,确保不存在矛盾的配置组合
- Rank 数量匹配:Rank 的可见数量应与
NbrOfConversion一致,多余的 Rank 应隐藏 - 看门狗阈值:高阈值必须大于低阈值,建议在代码中添加范围检查
- 注入转换优先级:注入转换会中断常规转换,需注意时序要求
