【问题标题】:STM32f3 - Multiple ADCSTM32f3 - 多个 ADC
【发布时间】:2016-04-22 00:50:18
【问题描述】:

我有 STM32f3 探索板,我正在尝试使用 4 个 ADC 通道。这是我的阅读功能:

int ADC_read(int channel)
{
    ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_7Cycles5);
    ADC_StartConversion(ADC1);
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET);
    return ADC_GetConversionValue(ADC1);    
}

一切都很顺利,直到突然程序卡在 while 循环中。有没有办法避免将 ADC_FLAG_EOC 置于循环中?或者只是让我的程序工作的其他方式?

【问题讨论】:

    标签: c stm32 stm32f4discovery adc


    【解决方案1】:

    据我了解,根据您使用的主板版本,您必须使用ADC_SoftwareStartConvCmdADC_StartConversion

    所以也许您没有正确启动 ADC 转换,请尝试以下操作:

    ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_7Cycles5);
    
    #if defined(SERIES_STM32F10x)
      ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    #elif defined(SERIES_STM32F30x)
      ADC_StartConversion(ADC1);
    #else
      ADC_SoftwareStartConv(ADC1);
    #endif
    
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    return ADC_GetConversionValue(ADC1);
    

    另外,不要忘记将您的引脚模式设置为输入:pinMode(pin, INPUT_ANALOG);

    最后,take a look at this post 的用户遇到了与您类似的问题,并通过重新启用外部触发器来解决它:

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    

    【讨论】:

    • ADC_StartConversion(ADC1);工作,我已经检查了你建议的其他东西,我仍然有问题 while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);部分。我也试过 while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOS) == RESET);但它不能正常工作。
    【解决方案2】:
    • RegularChannelConfig 不需要在每次调用时都运行,它可能没有时间完成配置,并在您启动它时挂起。 在开始之前请稍等。

      • 看例子

      • 当您可以让 DMA 为您运行 ADC 并在您需要时(它们)简单地访问内存中的值时,为什么要以这种方式使用 ADC。

    STM-Cube 会为您正确生成大部分代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-06
      • 2016-05-15
      • 2017-06-01
      • 2021-11-08
      • 2017-02-24
      • 2016-10-29
      • 1970-01-01
      • 2020-11-08
      相关资源
      最近更新 更多