使用 STM32CubeMX 配置ADC引脚,如下:
其中 IN1 和IN2 短路接在一起接1.7V左右 ,IN3和IN4短路接在一起接0.16V左右。

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

在软件中,修改通道,软件触发采样,存到数组中:
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][]数值相同。
还有另外一个对应问题,在使用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有数据

对这个对应关系搞得头大,后面项目还需要使用这个芯片,需要确认对应关系 |
这些值决定对应通道的转换关系。
看你搞了个二维数组,你是在循环改变J小标吗?
先简单点,随意选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 也是这样用,没出问题。
谢谢提醒,我看库。H 里面ADC_CHANNEL_1 用的ADCX_SQR3 -10 来定义,我试着改为 SQR-0 来,结果没有正常转换,
我按照它原来的宏定义,然后看下工作的时候 这几个寄存器的值,看看是不是有提前转换了的。
[md]我这边找到F3的开发板做了测试,任意选择4个通道,每次只转换1个通道,就这样轮流转换并通过CPU读取结果,没发现数据位置错乱的情况,我放在while循环里反复测试的。
应该再看看其他通道,如果只有SQ1的值与通道号对应,那么转换的就是当前通道结果。
另外ADC 配置后,别忘了启动一下校准函数。
再ADC初始化后,在后面接了 单端模式的校准,这个应该启动后只用校准一次吧?
[md]谢谢,我的测试思路与您的一样,
只是我这傻瓜式的都写出来,没有用循环。
我看到通道配置函数与您的不一样,我再试试。
我这个芯片用的STM32F301K8T6,32脚的,
我也怀疑过我程序写的问题,吧这个ADC配置移植到之前用的STM32F103C8T6,和STM32G431CBT6上面,通道都对应的上,这周解决不了就换G431系列了。