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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版