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

stm32g030c8t6 adc读值有出入 ,太奇怪了

[复制链接]
王东丶 提问时间:2022-10-20 14:43 / 未解决
问题是这样的 ,我用到了adc_in8 adc_in9 和 adc_in15 三个脚,我先是单独按照8和9的要求初始化了adc,读出来的8和9的值正常,因为模式问题,只适用adc_in 1-14,就没有读取15,,然后我又加了单独读取15的adc初始化,不读取8和9,15读出来的值正常,我就尝试 先调用8和9的adc初始化,读取8和9,再调用15的adc初始化,读取15,我发现 只能8和9的值正确,15就是不正确,求大佬帮忙解答一下,谢谢
收藏 评论9 发布时间:2022-10-20 14:43

举报

9个回答
xmshao 回答时间:2022-10-20 17:35:12
王东丶 发表于 2022-10-20 15:59
按照你的方法试了一下 ,ch8 和ch 9的值不正确,ch15正确

因为你现在要用到CH8 CH9 CH15,请把ADC扫描序列模式改为 Sequencer set to not fully configurable是应该的。


配置正确了,再来看看别的原因,是否哪里误会或忽视了。 这个ADC模块功能是没问题,包括我在内的很多


人都用了的。


别着急,一步步排查,相信你自己!
王东丶 回答时间:2022-10-20 14:46:48
    这是8和9的adc初始化
hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    hadc1.Init.LowPowerAutoWait = DISABLE;
    hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.NbrOfConversion =1;
    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.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();
    }


    /** Configure Regular Channel
    */
    sConfig.Channel = ADC_CHANNEL_8;
    sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }

    /** Configure Regular Channel
    */
    sConfig.Channel = ADC_CHANNEL_9;
    sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }




    if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
    {
        /* Calibration Error */
        Error_Handler();
    }

    /* Start ADC conversion */
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
        /* ADC conversion start error */
        Error_Handler();
    }

    /* Wait for the first ADC conversion to be completed (timeout unit: ms) */
    if (HAL_ADC_PollForConversion(&hadc1, 2) != HAL_OK)
    {
        /* ADC conversion start error */
        Error_Handler();
    }


王东丶 回答时间:2022-10-20 14:47:34
这是15的adc初始化
    hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED_BACKWARD;
    hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    hadc1.Init.LowPowerAutoWait = DISABLE;
    hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.NbrOfConversion =1;
    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.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_15;
    sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
               
    if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
    {
        /* Calibration Error */
        Error_Handler();
    }
    /* Start ADC conversion */
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
        /* ADC conversion start error */
        Error_Handler();
    }
    /* Wait for the first ADC conversion to be completed (timeout unit: ms) */
    if (HAL_ADC_PollForConversion(&hadc1, 2) != HAL_OK)
    {
        /* ADC conversion start error */
        Error_Handler();
    }

xmshao 回答时间:2022-10-20 15:13:41
我也觉得有点奇怪,奇怪的是,你的CH15怎么配置出来的,直接套用CH8  CH9的配置修改而来?


你现在要用到CH8 CH9 CH15,请把ADC扫描序列模式改为 Sequencer set to not fully configurable,这样你
就用不着做配置来回切换。你不妨用CubeMx配置下,  hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;
王东丶 回答时间:2022-10-20 15:31:50
xmshao 发表于 2022-10-20 15:13
我也觉得有点奇怪,奇怪的是,你的CH15怎么配置出来的,直接套用CH8  CH9的配置修改而来?

不瞒你说 还是真仿着ch8 ch9写的 改了一下模式
王东丶 回答时间:2022-10-20 15:59:42
xmshao 发表于 2022-10-20 15:13
我也觉得有点奇怪,奇怪的是,你的CH15怎么配置出来的,直接套用CH8  CH9的配置修改而来?

按照你的方法试了一下 ,ch8 和ch 9的值不正确,ch15正确
butterflyspring 回答时间:2022-10-20 17:42:47
是不是转换通道数设置为1, 又设置的 hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED_BACKWARD;
有可能只转换了最后的通道15 呢?
王东丶 回答时间:2022-10-21 09:44:16
butterflyspring 发表于 2022-10-20 17:42
是不是转换通道数设置为1, 又设置的 hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED_BACKWARD;
有可能只转 ...

好的 ,我去试试看看,谢谢
王东丶 回答时间:2022-10-21 09:45:44
ADC读取参数的函数是这个
uint16_t ADC_Read(uint32_t Channel)
{
    uint32_t value;
    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = Channel;                                         /* 通道 */
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, 2);
    value=HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);

    return value;
}

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