ADC 开发参考
本文档深入介绍 ADC 外设的模式规则、参数依赖关系和配置验证方法,是 ADC 配置教程 的进阶补充。
模式互斥规则总览
规则 R1:连续转换与断续转换互斥
| 连续模式 | 断续模式 | 允许? | 说明 |
|---|---|---|---|
| Enable | Enable | ❌ | 硬件不支持同时启用 |
| Enable | Disable | ✅ | 连续扫描所有通道 |
| Disable | Enable | ✅ | 分批次转换 |
| Disable | Disable | ✅ | 单次转换 |
// 代码中的实现
ContinuousConvMode: {
options: [{
label: 'Enable',
value: 'enable',
disabled: "@get: $root.DiscontinuousConvMode.value === 'enable'"
}]
}
DiscontinuousConvMode: {
options: [{
label: 'Enable',
value: 'enable',
disabled: "@get: $root.ContinuousConvMode.value === 'enable' || " +
"$root.ScanConvMode.value === 'disable'"
}]
}
规则 R2:断续转换依赖扫描模式
断续模式 → 需要扫描模式先启用
硬件原因:断续模式每次只转换 N 个通道,然后暂停等待下一次触发。必须通过扫描模式来依次处理多个规则通道。
规则 R3:多通道必须启用扫描模式
NbrOfConversion > 1 → ScanConvMode 必须为 Enable
硬件原因:当配置了多个转换通道时,必须通过扫描模式依次转换每个通道,否则只能转换第一个通道。
规则 R4:单通道不能启用扫描模式
NbrOfConversion <= 1 → ScanConvMode 只能为 Disable
硬件原因:单个通道不需要扫描,可以直接转换。
参数依赖关系表
| 参数 | 依赖参数 | 关系 |
|---|---|---|
| ScanConvMode.Enable | NbrOfConversion > 1 | 多通道必须启用 |
| ScanConvMode.Disable | NbrOfConversion <= 1 | 单通道只能禁用 |
| ContinuousConvMode.Enable | DiscontinuousConvMode = disable | 互斥 |
| DiscontinuousConvMode.Enable | ScanConvMode = enable | 依赖扫描模式 |
| DiscontinuousConvMode.Enable | ContinuousConvMode = disable | 互斥 |
| NbrOfDiscConversion | DiscontinuousConvMode = enable | 仅在断续模式显示 |
| ExternalTrigConv | EnableRegularConversions = enable | 仅在常规转换显示 |
| AnalogWatchDogChannel | WatchdogMode = single | 仅在单通道看门狗显示 |
可见性规则汇总
// 仅在启用常规转换时可见
NbrOfConversion: visible: EnableRegularConversions === 'enable'
ExternalTrigConv: visible: EnableRegularConversions === 'enable'
All RegularRanks: visible: EnableRegularConversions === 'enable' && N >= rank
// 仅在启用注入转换时可见
InjectedNbrOfConversion: visible: EnableInjectedConversions === 'enable'
InjectedConversionMode: visible: EnableInjectedConversions === 'enable' && Nbr > 0
All InjectedRanks: visible: EnableInjectedConversions === 'enable' && N >= rank
// 仅在启用断续模式时可见
NbrOfDiscConversion: visible: DiscontinuousConvMode === 'enable'
// 仅在启用看门狗时可见
WatchdogMode: visible: EnableWatchDog === true
HighThreshold: visible: EnableWatchDog === true
LowThreshold: visible: EnableWatchDog === true
AnalogWatchDogChannel: visible: EnableWatchDog === true && WatchdogMode === single
// 双 ADC 模式
CommonMode: visible: $name === 'ADC0' || $name === 'ADC1'
常见配置场景详解
场景 1:单通道单次采集
适用场景:只需测量一个模拟信号,如温度传感器
| 参数 | 值 | UI 行为 |
|---|---|---|
| EnableRegularConversions | enable | — |
| NbrOfConversion | 1 | ScanConvMode.Enable 禁用(R4) |
| ScanConvMode | disable | 自动限制(R4) |
| ContinuousConvMode | disable | — |
| DiscontinuousConvMode | disable | 自动禁用(R2) |
| RegularRank1 | Channel X | 可见 |
| RegularRank2-16 | — | 不可见 |
场景 2:多通道扫描采集
适用场景:依次测量多个模拟信号
| 参数 | 值 | UI 行为 |
|---|---|---|
| EnableRegularConversions | enable | — |
| NbrOfConversion | 3 | ScanConvMode.Disable 禁用(R3) |
| ScanConvMode | enable | 必须启用(R3) |
| ContinuousConvMode | disable | — |
| DiscontinuousConvMode | disable | DiscontinuousConvMode.Enable 可选 |
| RegularRank1-3 | 独立通道配置 | 可见 |
| RegularRank4-16 | — | 不可见 |
场景 3:连续转换模式
适用场景:持续监控模拟信号
| 参数 | 值 | UI 行为 |
|---|---|---|
| NbrOfConversion | 1 | 单通道 |
| ScanConvMode | disable | R4 限制 |
| ContinuousConvMode | enable | DiscontinuousConvMode.Enable 禁用(R1) |
| DiscontinuousConvMode | disable | 与连续模式互斥(R1) |
场景 4:断续扫描模式
适用场景:多通道但分批转换,减少单次转换时间
| 参数 | 值 | UI 行为 |
|---|---|---|
| NbrOfConversion | 4 | 多通道 |
| ScanConvMode | enable | 必须启用(R3) |
| ContinuousConvMode | disable | 与断续互斥(R1) |
| DiscontinuousConvMode | enable | NbrOfDiscConversion 可见 |
| NbrOfDiscConversion | 2 | 每次转换 2 个通道 |
双 ADC 模式
适用范围
双 ADC 模式仅在部分芯片上支持。以 GD32F103 为例,只有 ADC0 和 ADC1 支持双 ADC 模式,ADC2 不支持。
CommonMode: {
visible: "@get: $root.$name === 'ADC0' || $root.$name === 'ADC1'",
disabled: "@get: $root.$name === 'ADC1'", // ADC1 配置跟随 ADC0
options: [
{ label: 'Independent', value: 'independent' },
{ label: 'Regular Simultaneous', value: 'reg_simult' },
{ label: 'Regular Interleaved', value: 'reg_interleaved' },
{ label: 'Injected Simultaneous', value: 'inj_simult' }
// 这些选项仅在两个 ADC 都使能时可见
// visible: '@get: ADC0.enabled() && ADC1.enabled()'
]
}
验证最佳实践
建议 1:添加用户友好的提示
// 在参数被禁用时显示原因
ScanConvMode: {
disabled: '@get: $root.NbrOfConversion.value <= 1',
hint: '单通道转换不需要扫描模式'
}
建议 2:参数联动更新
// 当 NbrOfConversion 从 1 变为 3 时,自动设置 ScanConvMode = enable
onChange: function(newValue, oldValue) {
if (newValue > 1 && this.ScanConvMode === 'disable') {
this.ScanConvMode = 'enable'
}
}
建议 3:配置验证
// 在代码生成前检查配置有效性
function validateADCConfig(config) {
const errors = []
// R1 检查
if (config.Continuous === 'enable' && config.Discontinuous === 'enable') {
errors.push('连续模式和断续模式不能同时启用')
}
// R2 检查
if (config.Discontinuous === 'enable' && config.Scan !== 'enable') {
errors.push('断续模式需要先启用扫描模式')
}
// R3 检查
if (config.NbrOfConversion > 1 && config.Scan !== 'enable') {
errors.push('多通道采集必须启用扫描模式')
}
return errors
}
