[STM32F0] ADC多通道无法读取数据

[复制链接]
 楼主| 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 转换。
公羊子丹 发表于 2025-4-1 07:34 | 显示全部楼层
先检查 ADC 配置,确认你是否正确设置了 ADC 的通道和扫描模式。多个通道采样需要启用扫描模式,并设置正确的 ADC_CHANNEL。
周半梅 发表于 2025-4-1 07:35 | 显示全部楼层
检查 ADC 配置时是否启用了“连续转换”,如果你用的是多通道转换,需要配置为连续模式,否则 ADC 只会转换一个通道。
帛灿灿 发表于 2025-4-1 07:36 | 显示全部楼层
回调函数里的 HAL_ADC_GetValue() 可能不是很合适,因为它每次都会读取当前正在转换的通道,试试手动管理每个通道的索引。
童雨竹 发表于 2025-4-1 07:37 | 显示全部楼层
你的代码中 if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC)) 应该在每个通道转换完成时分别检查,而不是只在最后一个通道完成时。
万图 发表于 2025-4-1 07:38 | 显示全部楼层
确认 idx 和 ADC_raw 的大小是否匹配,比如是否有足够的空间存储所有通道的转换结果。如果 ADC_raw 数组不够大,可能会覆盖导致数据错误。
Wordsworth 发表于 2025-4-1 07:39 | 显示全部楼层
使用 HAL_ADC_Start_IT() 来启用中断,并确保在每次转换后正确清除 EOC 标志并触发下一个通道的转换。
Bblythe 发表于 2025-4-1 07:39 | 显示全部楼层
检查 VREFINT_CAL_ADDR 和 TEMPSENSOR_CAL1_ADDR 等常量,这些地址是硬件相关的,确认它们的值是否符合你所使用的 MCU。
Pulitzer 发表于 2025-4-1 07:40 | 显示全部楼层
验证外部输入通道的硬件连接,比如 ADC_IN8 是否正确连接且输入稳定。如果硬件连接有问题,转换结果也会不正确。
Uriah 发表于 2025-4-1 07:41 | 显示全部楼层
中断服务程序的逻辑,建议在 ADC_FLAG_EOC 检查后直接读取 HAL_ADC_GetValue(),并确保每次读取后清除相关标志。
Clyde011 发表于 2025-4-1 07:42 | 显示全部楼层
检查 Vdd 和 temperature 的计算,Vdd 的计算需要用正确的校准值进行,而不是直接用 ADC 的输出值。查看你的 TEMPSENSOR_CAL1_ADDR 和 TEMPSENSOR_CAL2_ADDR 的数据,确保校准值是正确的。
七毛钱 发表于 2025-4-1 12:23 | 显示全部楼层
用正确的 ADC 句柄。
laocuo1142 发表于 2025-4-1 14:23 | 显示全部楼层
检查并验证校准地址和值的读取。
flycamelaaa 发表于 2025-4-1 19:00 | 显示全部楼层
检查并验证 ADC 的中断和回调配置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

43

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部