li781121 发表于 2025-5-22 17:47

STM32F103 ADC 多通道采集数据不对。

STM32F103 ADC1 使用IN1,IN4做ADC输入,ADC工作在中断模式,没有用DMA,在回调函数里读出的数据不是预期数据,有时读入的数据IN1的,有时读入的数据IN4的,,请高手指点哪里出问题。
代码下:
void MX_ADC1_Init(void)
{

/* USER CODE BEGIN ADC1_Init 0 */
#include "Userinclude.h"
/* USER CODE END ADC1_Init 0 */

ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */

/* USER CODE END ADC1_Init 1 */

/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 2;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
    Error_Handler();
}

/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
    Error_Handler();
}

/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */

/* USER CODE END ADC1_Init 2 */

}

       
#define ADC1_CHANNELS    2            // ADC1通道数量       
uint16_t adc1_1value=0,adc1_2value=0; //ADC转换数据存储变量

       
        /* ADC转换完成中断回调函数 */
       
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
       
static uint16_t channelIndex=0;
uint16_t adc1_value;
if(hadc->Instance == ADC1)
{
    /* 获取通道1和通道4的转换结果 */
    adc1_value= HAL_ADC_GetValue(&hadc1); // 通道结果
                //adc1_value= HAL_ADC_GetValue(&hadc1); // 通道结果
                //LED1out(1);
    switch (channelIndex)
      {
      case 0:
      {
                                        adc1_1value=adc1_value;
                                       
      }
      break;

      case 1:
      {
                                        adc1_2value=adc1_value;
                                       
      }
      break;
                               
      default:
      {
      }
                        }
                  
    channelIndex = (channelIndex + 1) % ADC1_CHANNELS; // 切换到下一个通道
          
    if (channelIndex == 0)    //完成了所有通道的转换
                {
   // HAL_ADC_Start_IT(&hadc1); //启动ADC转换(规则组)
    }
}       
}



void ADC1_2Start(void)//启动ADC转换(规则组)
        {
               
    if(HAL_ADC_Start_IT(&hadc1) != HAL_OK)
    {
      Error_Handler(); // 错误处理
    }
               
        }

li781121 发表于 2025-5-22 23:45

有没有高手帮帮忙呀?

dffzh 发表于 2025-5-23 08:52

基于HAL库的ADC多通道数据采集,STM32的网上应该很多demo程序,你自己查下资料,会学到的更多。

cainiao518 发表于 2025-5-23 22:11

用标准库试试看

yzdel7 发表于 2025-5-23 23:35

你说的 adc1_1value 和 adc1_2value 获得的值是一样的吗。还有就是,你程序里表明是软件触发AD采样,软件在什么地方触发,还有你的ADC时钟和采样速率是多少。
页: [1]
查看完整版本: STM32F103 ADC 多通道采集数据不对。