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

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

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

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

举报

9个回答
butterflyspring 回答时间:2025-8-25 11:30:24
可以检查一下 ADCx_SQR1,ADCx_SQR2,ADCx_SQR3,ADCx_SQR4,对应的值是多少。

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




xmshao 回答时间:2025-8-25 12:57:47

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

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

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

lj-liujun 回答时间:2025-8-25 17:08:59

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 回答时间:2025-8-25 17:12:49

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 回答时间:2025-8-25 22:22:28

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

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

xmshao 回答时间:2025-8-26 11:02:06

lj-liujun 发表于 2025-8-25 22:22
![图片.png](data/attachment/forum/202508/25/222046zv6saotwo5b6hvvs.png?imageMogr2/auto-orient/ ...

[md]我这边找到F3的开发板做了测试,任意选择4个通道,每次只转换1个通道,就这样轮流转换并通过CPU读取结果,没发现数据位置错乱的情况,我放在while循环里反复测试的。

image.png

butterflyspring 回答时间:2025-8-26 11:02:59
lj-liujun 发表于 2025-8-25 22:22
[md]![图片.png](data/attachment/forum/202508/25/222046zv6saotwo5b6hvvs.png?imageMogr2/auto-orient/ ...

应该再看看其他通道,如果只有SQ1的值与通道号对应,那么转换的就是当前通道结果。

另外ADC 配置后,别忘了启动一下校准函数。


lj-liujun 回答时间:2025-8-26 11:19:44

butterflyspring 发表于 2025-8-26 11:02
应该再看看其他通道,如果只有SQ1的值与通道号对应,那么转换的就是当前通道结果。</p>
<p>另外ADC 配置后,别忘 ...

再ADC初始化后,在后面接了 单端模式的校准,这个应该启动后只用校准一次吧?

lj-liujun 回答时间:2025-8-26 11:25:32

xmshao 发表于 2025-8-26 11:02
我这边找到F3的开发板做了测试,任意选择4个通道,每次只转换1个通道,就这样轮流转换并通过CPU读取 ...

[md]谢谢,我的测试思路与您的一样,

只是我这傻瓜式的都写出来,没有用循环。

我看到通道配置函数与您的不一样,我再试试。

我这个芯片用的STM32F301K8T6,32脚的,

我也怀疑过我程序写的问题,吧这个ADC配置移植到之前用的STM32F103C8T6,和STM32G431CBT6上面,通道都对应的上,这周解决不了就换G431系列了。

所属标签

相似问题

官网相关资源

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