打印
[STM32F0]

ADC多通道无法读取数据

[复制链接]
283|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvluoo|  楼主 | 2025-3-28 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用 STM32CubeIDE,
一个外部输入 (ADC_IN8),
内部温度作为第二个通道 (ADC_IN17),
Vdd 电压作为第三个通道。
程序读取不到数据,请问那里有错误??
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
   if (hadc->Instance == ADC1)
   {
      if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))
      {
         ADC_raw[idx] = HAL_ADC_GetValue(&hadc1);
         idx++;
      }
      if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
      {
         idx=0;
         Vdd = (*VREFINT_CAL_ADDR)/ADC_raw[2];
         temperature = (((int32_t)ADC_raw[1] * Vdd/3300)- (int32_t) *TEMPSENSOR_CAL1_ADDR );
         temperature = temperature * (int32_t)(TEMPSENSOR_CAL2_TEMP - TEMPSENSOR_CAL1_TEMP);
         temperature = temperature / (int32_t)(*TEMPSENSOR_CAL2_ADDR - *TEMPSENSOR_CAL1_ADDR);
         temperature = temperature + TEMPSENSOR_CAL1_TEMP;
         Vin = Vdd*ADC_raw[0]/4095;
}
}
}

使用特权

评论回复
沙发
stormwind123| | 2025-3-28 11:40 | 只看该作者
代码问题吧

使用特权

评论回复
板凳
香水城| | 2025-3-28 16:16 | 只看该作者
本帖最后由 香水城 于 2025-3-28 16:17 编辑

你先直接拿个例程跑跑,先确认硬件没问题。

然后再查代码方面。

硬件方面主要是电源、参考电源、VDDA脚的连接这些。

软件方面就是基本的配置,最好使用CubeMx进行配置。

查询的话,不用在调试界面打开ADC的寄存器观察窗口。

我看你到回调函数里还来查询EOC标志,估计太晚了点,ADC的DR被读过之后,它早就被清零了。

使用特权

评论回复
地板
lvuu| | 2025-3-31 22:37 | 只看该作者
你可能忘记启动多通道的 ADC 转换。

使用特权

评论回复
5
公羊子丹| | 2025-4-1 07:34 | 只看该作者
先检查 ADC 配置,确认你是否正确设置了 ADC 的通道和扫描模式。多个通道采样需要启用扫描模式,并设置正确的 ADC_CHANNEL。

使用特权

评论回复
6
周半梅| | 2025-4-1 07:35 | 只看该作者
检查 ADC 配置时是否启用了“连续转换”,如果你用的是多通道转换,需要配置为连续模式,否则 ADC 只会转换一个通道。

使用特权

评论回复
7
帛灿灿| | 2025-4-1 07:36 | 只看该作者
回调函数里的 HAL_ADC_GetValue() 可能不是很合适,因为它每次都会读取当前正在转换的通道,试试手动管理每个通道的索引。

使用特权

评论回复
8
童雨竹| | 2025-4-1 07:37 | 只看该作者
你的代码中 if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC)) 应该在每个通道转换完成时分别检查,而不是只在最后一个通道完成时。

使用特权

评论回复
9
万图| | 2025-4-1 07:38 | 只看该作者
确认 idx 和 ADC_raw 的大小是否匹配,比如是否有足够的空间存储所有通道的转换结果。如果 ADC_raw 数组不够大,可能会覆盖导致数据错误。

使用特权

评论回复
10
Wordsworth| | 2025-4-1 07:39 | 只看该作者
使用 HAL_ADC_Start_IT() 来启用中断,并确保在每次转换后正确清除 EOC 标志并触发下一个通道的转换。

使用特权

评论回复
11
Bblythe| | 2025-4-1 07:39 | 只看该作者
检查 VREFINT_CAL_ADDR 和 TEMPSENSOR_CAL1_ADDR 等常量,这些地址是硬件相关的,确认它们的值是否符合你所使用的 MCU。

使用特权

评论回复
12
Pulitzer| | 2025-4-1 07:40 | 只看该作者
验证外部输入通道的硬件连接,比如 ADC_IN8 是否正确连接且输入稳定。如果硬件连接有问题,转换结果也会不正确。

使用特权

评论回复
13
Uriah| | 2025-4-1 07:41 | 只看该作者
中断服务程序的逻辑,建议在 ADC_FLAG_EOC 检查后直接读取 HAL_ADC_GetValue(),并确保每次读取后清除相关标志。

使用特权

评论回复
14
Clyde011| | 2025-4-1 07:42 | 只看该作者
检查 Vdd 和 temperature 的计算,Vdd 的计算需要用正确的校准值进行,而不是直接用 ADC 的输出值。查看你的 TEMPSENSOR_CAL1_ADDR 和 TEMPSENSOR_CAL2_ADDR 的数据,确保校准值是正确的。

使用特权

评论回复
15
七毛钱| | 2025-4-1 12:23 | 只看该作者
用正确的 ADC 句柄。

使用特权

评论回复
16
laocuo1142| | 2025-4-1 14:23 | 只看该作者
检查并验证校准地址和值的读取。

使用特权

评论回复
17
flycamelaaa| | 2025-4-1 19:00 | 只看该作者
检查并验证 ADC 的中断和回调配置。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

10

帖子

0

粉丝