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

stm32g030 adc读取只能读到第一个参数

[复制链接]
王东丶 提问时间:2023-10-31 16:41 / 未解决
不管怎么读 都是通道10的值 ,麻烦大牛们帮忙看看函数

ADC_HandleTypeDef hadc1;

void MX_ADC1_Init(void)
{


ADC_ChannelConfTypeDef sConfig = {0};


hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.LowPowerAutoPowerOff = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 2;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;
hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;

hadc1.Init.OversamplingMode = ENABLE;

hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_256;  // 16bit
hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;

hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}


sConfig.Channel = ADC_CHANNEL_10;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}

sConfig.Channel = ADC_CHANNEL_15;
sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}

}



uint16_t ADC_Read(uint32_t Channel)
{
uint32_t value;
ADC_ChannelConfTypeDef sConfig;
sConfig.Channel = Channel;
sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;        /* 通道 */

if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
    Error_Handler();
}

HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
value = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);

return value;
}
收藏 评论3 发布时间:2023-10-31 16:41

举报

3个回答
xmshao 回答时间:2023-11-2 16:04:26
你现在2个通道,基于扫描模式查询接收,很容易只读到1个数据。你要么使用DMA或中断方式,DMA方式最佳。
你如果现在的确需要逐个通道地查询获取ADC值。


你先在CubeMx仅选择1个通道比方通道15完成配置,生成初始化工程。


然后,基于cubeMx创建的工程额外加点代码,加个基于单个通道的初始化代码。


void User_Channel_Config(uint32_t ChannelNum )

{




  ADC_ChannelConfTypeDef sConfig = {0};




  sConfig.Channel = ChannelNum;

  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;

  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

  {

    Error_Handler();

  }


}


具体操作时,需要用哪个通道就启用哪个通道。比方这样:


  while (1)

  {



    HAL_Delay(500);


    Channel_Config(ADC_CHANNEL_15 );



     HAL_ADC_Start(&hadc1);

     HAL_ADC_PollForConversion(&hadc1,0xffff);

     Adc_ch15 = HAL_ADC_GetValue(&hadc1);

     

     HAL_ADC_Stop(&hadc1);

     

     Channel_Config( ADC_CHANNEL_10 );

     HAL_ADC_Start(&hadc1);

     HAL_ADC_PollForConversion(&hadc1,0xffff);

     Adc_ch10 = HAL_ADC_GetValue(&hadc1);

     

     HAL_ADC_Stop(&hadc1);
  
  }
这样操作是可以的,我刚才验证测试过。你可以参考下。
xmshao 回答时间:2023-11-1 09:56:32
查看了下你的配置,感觉你的配置跟我这边不一样。不知你目前CubeMx版本,尽量使用最新版。老版本这个地方配置有点瑕疵。
另外,看到你代码里启动ADC后,读取一次结果就停止了ADC,现在是扫描模式的话,这样不会每次只读到1个通道的数据,第2通道数据不会丢掉?
王东丶 回答时间:2023-11-1 11:45:39

xmshao 发表于 2023-11-1 09:56
查看了下你的配置,感觉你的配置跟我这边不一样。不知你目前CubeMx版本,尽量使用最新版。老版本这个地方配 ...

大佬你好,版本号我回头看一下,我试了一下把IN10和IN15分开初始化,就是写了两个初始化函数,每次读参数的时候都重新初始化一下就没问题, 现在就是放一下初始化 ,就不行 只能读到IN10的值。麻烦告知一下怎么改是好。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版