你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F301 ADC 通道错位问题

[复制链接]
lj-liujun 提问时间:2025-8-24 11:17 / 未解决

使用 STM32CubeMX 配置ADC引脚,如下:

其中 IN1 和IN2 短路接在一起接1.7V左右 ,IN3和IN4短路接在一起接0.16V左右。

图片.png

ADC 配置为单端,软件触发ADC采样,用来一个一个采样验证问题:

图片.png

在软件中,修改通道,软件触发采样,存到数组中:

sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
//Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[0][j]=HAL_ADC_GetValue(&hadc1);
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[1][j]=HAL_ADC_GetValue(&hadc1);sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[2][j]=HAL_ADC_GetValue(&hadc1);sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[3][j]=HAL_ADC_GetValue(&hadc1);sConfig.Channel = ADC_CHANNEL_5;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[4][j]=HAL_ADC_GetValue(&hadc1);

测试发现,data[0][ ],没有数值,data[1][]与data[2][]数值相同,data[3][]与data[4][]数值相同。图片.png

还有另外一个对应问题,在使用INA 15和INA11中,相同的操作: 其中INA15 接0.85V,INA11接近0V

sConfig.Channel = ADC_CHANNEL_11;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[10][j]=HAL_ADC_GetValue(&hadc1);sConfig.Channel = ADC_CHANNEL_12;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[11][j]=HAL_ADC_GetValue(&hadc1);sConfig.Channel = ADC_CHANNEL_13;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[12][j]=HAL_ADC_GetValue(&hadc1);sConfig.Channel = ADC_CHANNEL_14;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[13][j]=HAL_ADC_GetValue(&hadc1);sConfig.Channel = ADC_CHANNEL_15;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
data[14][j]=HAL_ADC_GetValue(&hadc1);`

结果显示ina11有数据

图片.png

对这个对应关系搞得头大,后面项目还需要使用这个芯片,需要确认对应关系

收藏 评论5 发布时间:2025-8-24 11:17

举报

5个回答
butterflyspring 回答时间:昨天 11:30
可以检查一下 ADCx_SQR1,ADCx_SQR2,ADCx_SQR3,ADCx_SQR4,对应的值是多少。

这些值决定对应通道的转换关系。




xmshao 回答时间:昨天 12:57

看你搞了个二维数组,你是在循环改变J小标吗?

先简单点,随意选3个通道,验证下ADC操作有无问题。

不过,我更倾向怀疑代码逻辑方面是否有问题。

lj-liujun 回答时间:昨天 17:08

xmshao 发表于 2025-8-25 12:57
看你搞了个二维数组,你是在循环改变J小标吗?</p>
<p>先简单点,随意选3个通道,验证下ADC操作有无问题。

[md]sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.SamplingTime = ADC_SAMPLETIME_61CYCLES_5; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { //Error_Handler(); } HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 10); data[0][j]=HAL_ADC_GetValue(&hadc1);

这个软件触发逻辑还是比较简单的把:

把INA1 连接到RANK-1->配置->等待配置完成->启动转换->等待转换换成->读取数据。

之前STM32F103C8T6 也是这样用,没出问题。

lj-liujun 回答时间:昨天 17:12

butterflyspring 发表于 2025-8-25 11:30
可以检查一下 ADCx_SQR1,ADCx_SQR2,ADCx_SQR3,ADCx_SQR4,对应的值是多少。</p>
<p>这些值决定对应通道的转换 ...

谢谢提醒,我看库。H 里面ADC_CHANNEL_1 用的ADCX_SQR3 -10 来定义,我试着改为 SQR-0 来,结果没有正常转换,

我按照它原来的宏定义,然后看下工作的时候 这几个寄存器的值,看看是不是有提前转换了的。

lj-liujun 回答时间:昨天 22:22

butterflyspring 发表于 2025-8-25 11:30
可以检查一下 ADCx_SQR1,ADCx_SQR2,ADCx_SQR3,ADCx_SQR4,对应的值是多少。</p>
<p>这些值决定对应通道的转换 ...

图片.png卡断点看了下, 通道切换的时候,SQR 寄存器赋值没有问题, 先切换再采样的顺序也是对的。通道采样对应不上

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版