ADC与DAC
2025/9/8大约 7 分钟
ADC 读取电压
输入模拟电压信号,将其转化为数字信号,再将getValue()*3.3/模拟量转化为电压
分辨率表示它能够区分的最小模拟量变化






单次模式

为什么要乘以 3.3/4096?
- ADC 的读数与输入电压成正比。
- 当输入电压为 0V 时,ADC 输出 0。
- 当输入电压等于参考电压(这里是 3.3V)时,ADC 输出最大值 4095。
如果getADC1() 返回 2048(半满量程),那么:
电压 = 2048 * 3.3 / 4096 ≈ 1.65V
循环转换模式






cubeMX中参数含义

综合表格:ADC 配置总结(合并两张截图)****
| 项目 | 内容/选项 | 含义 | 标红/标黄 | 与电位器测量的关系 |
|---|---|---|---|---|
| ADC1 总模式(第一张截图) | IN1 到 IN15(Disable/Single-ended) | 选择是否启用相应通道(INx),单端模式用于测量单端模拟信号(如电位器输出)。 | 标红:IN12、IN15(Single-ended) | 这些通道已启用,可能连接电位器,需确认引脚(如 PA6、PA7)是否正确连接。 |
| IN9、IN10(Disable,标黄) | 通道未启用,但引脚可能有冲突或警告,需检查 Pinout 视图。 | 标黄:IN9、IN10 | 如果不使用这些通道,可保持禁用;若需用,需解决引脚冲突。 | |
| 其他通道(第一张截图) | Temperature Sensor、Vbat、Vrefint、VOPAMP1(未启用) | 内部信号通道,未勾选,用于测量芯片温度、电池电压等,不适用于电位器。 | 无特殊标记 | 不相关,可忽略。 |
| EXTI Conversion Trigger(第一张截图) | Disable | ADC 转换由软件或定时器触发,非外部中断触发,适合简单测量。 | 无特殊标记 | 适合电位器测量,无需外部触发。 |
| IN6 通道模式(第二张截图) | Disable | 禁用 IN6 通道,不进行任何 ADC 转换。 | 无特殊标记 | 不适合测量电位器,需启用通道。 |
| IN6 Differential | 启用 IN6 通道,以差分模式工作,测量两路信号的电压差。 | 无特殊标记 | 不适合电位器(单端信号),配置复杂且不必要。 | |
| IN6 Single-ended | 启用 IN6 通道,以单端模式工作,测量相对于地的单端信号。 | 无特殊标记 | 最适合电位器测量,简单直接,推荐使用。 |
Resolution(分辨率):
- 当前设置为 ADC 12-bit resolution(默认选中)。
- 可用选项:
- ADC 12-bit resolution(12 位分辨率)
- ADC 10-bit resolution(10 位分辨率)
- ADC 8-bit resolution(8 位分辨率)
- ADC 6-bit resolution(6 位分辨率)
- 含义:分辨率决定了 ADC 转换的精度,分辨率越高,量化精度越细,但转换时间可能稍长。12 位分辨率意味着 ADC 输出值范围为 0 到 4095(2^12 - 1),适合需要较高精度的应用。
- 参数描述:分辨率影响 ADC 转换的精度,直接关系到你能分辨的电压变化大小。例如,12 位分辨率在 3.3V 参考电压下,每步约 0.8mV(3.3V / 4096)。

ADC 配置总结(ADCs_Common_Settings 和 ADC_Settings)
| 项目 | 内容/选项 | 含义 | 当前设置 | 与电位器测量的关系 | 建议调整(若需) |
|---|---|---|---|---|---|
| Mode | Independent mode | 每个 ADC 实例独立工作,不与其它 ADC 同步。适合简单单路测量。 | Independent mode | 适合电位器测量,无需同步,保持默认。 | 无需调整,除非需要多 ADC 同步。 |
| Clock Prescaler | Synchronous clock mode divided by 2 | ADC 时钟来源于系统时钟或 APB2 时钟,分频 2 后提供给 ADC。 | Synchronous clock mode divided by 2 | 适合低频信号(如电位器),但需确保时钟不超过最大限制(通常 14MHz)。 | 若系统时钟高(如 72MHz),可尝试分频 4 或 8。 |
| Resolution | ADC 12-bit/10-bit/8-bit/6-bit resolution | 确定 ADC 转换的精度,12 位最高(0 | ADC 12-bit resolution | 12 位提供最高精度,适合电位器微小变化测量,保持默认。 | 保持 12 位,除非需要更快转换(牺牲精度)。 |
| Data Alignment | Right alignment/Left alignment | 转换结果的对齐方式,右对齐(低位在低地址)或左对齐(高位在低地址)。 | Right alignment | 右对齐是标准设置,适合大多数应用,保持默认。 | 无需调整,除非特殊需求。 |
| Gain Compensation | 0 (or adjustable) | 校正 ADC 增益误差,通常默认值为 0,无需调整。 | 0 | 不影响电位器测量,保持默认。 | 无需调整,除非有校准需求。 |
| Scan Conversion Mode | Enabled/Disabled | 启用扫描模式时,连续转换多个通道;禁用时,仅转换单一通道。 | Disabled | 电位器单路测量,无需扫描,保持默认。 | 保持禁用,除非需要多通道测量。 |
| End Of Conversion Selection | End of single conversion/End of sequence | 选择转换结束中断触发点,单次转换或序列结束。 | End of single conversion | 适合单路电位器测量,保持默认。 | 无需调整,除非使用多通道。 |
| Low Power Auto Wait | Enabled/Disabled | 低功耗模式,减少功耗但可能影响性能。 | Disabled | 不影响电位器测量,保持默认。 | 无需调整,除非关注功耗优化。 |
| Continuous Conversion Mode | Enabled/Disabled | 启用后,ADC 连续转换;禁用后,每次需手动或触发启动。 | Disabled | 电位器通常为低频信号,单次转换即可,保持默认。 | 保持禁用,除非需要连续采样(如实时监控)。 |
| Discontinuous Conversion Mode | Enabled/Disabled | 启用后,按组分段转换多个通道;禁用后,连续或单次转换。 | Disabled | 不适用电位器单路测量,保持默认。 | 无需调整,除非多通道分组转换。 |
| DMA Continuous Requests | Enabled/Disabled | 启用 DMA 后,ADC 数据自动传输到内存;禁用后,手动读取。 | Disabled | 电位器单路测量,无需 DMA,保持默认。 | 保持禁用,除非需要高速多通道数据传输。 |
| Overrun behaviour | Overrun data preserved/Overrun data replaced | 超限行为,保留或替换超限数据。 | Overrun data preserved | 不常见于电位器测量,保持默认。 | 无需调整,除非高速采样出现数据溢出。 |
| Enable Regular Conversions | Enabled/Disabled | 启用常规转换模式,用于标准 ADC 测量。 | Enabled | 必须启用以测量电位器,保持默认。 | 保持启用。 |
| Enable Regular Oversampling | Enabled/Disabled | 启用过采样以提高精度,但增加转换时间。 | Disabled | 电位器测量通常无需过采样,保持默认。 | 保持禁用,除非需要更高精度。 |
| Number Of Conversion | 1 (or more) | 指定常规转换的通道数。 | 1 | 电位器单路测量,只需 1 个通道,保持默认。 | 保持 1,除非多通道测量。 |
| External Trigger Conversion Source | Regular Conversion launched by software/Other triggers | 选择转换触发源,软件触发或外部/定时器触发。 | Regular Conversion launched by software | 适合手动控制电位器测量,保持默认。 | 保持软件触发,除非需要定时或外部触发。 |
| External Trigger Conversion Edge | None/Rising/Falling/Both | 触发边沿选择(上升沿、下降沿或双边沿)。 | None | 无需外部触发,保持默认。 | 无需调整,除非使用外部触发。 |
| Rank | 1 (or other rank) | 转换顺序,指定通道在序列中的优先级。 | 1 | 电位器单通道,保持默认。 | 保持 1,除非多通道排序。 |
| Enable Injected Conversions | Enabled/Disabled | 启用注入转换模式,用于高优先级中断式测量。 | Disabled | 不适用电位器常规测量,保持默认。 | 保持禁用,除非需要高优先级测量。 |
DAC 生成电压
检测到数字信号,将其转化为模拟电压(0-3.3V)
根据设置的分辨率,开启检测,得到符合分辨率范围的数字信号
最后再HAL_DAC_getValue()
/* IO operation functions *****************************************************/
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel); //开启DAC输出
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel); //关闭DAC输出
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启 //开启DAC的DMA输出
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); //关闭DAC的DMA输出
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); //设置DAC输出值
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); //获取DAC输出值

