久芯网

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

avatar 王东丶 提问时间: 2023-07-14 10:39:55 / 未解决
问题是这样的 ,我用到了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就是不正确,求大佬帮忙解答一下,谢谢

如需获得 stm32g030c8t6 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

9个回答
  • avatar xmshao
    回答时间: 2023-07-14 11:06:28
    王东丶 发表于 2022-10-20 15:59
    按照你的方法试了一下 ,ch8 和ch 9的值不正确,ch15正确

    因为你现在要用到CH8 CH9 CH15,请把ADC扫描序列模式改为 Sequencer set to not fully configurable是应该的。 配置正确了,再来看看别的原因,是否哪里误会或忽视了。 这个ADC模块功能是没问题,包括我在内的很多 人都用了的。 别着急,一步步排查,相信你自己!

  • avatar 王东丶
    回答时间: 2023-07-14 11:35:24

    这是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(); }

  • avatar 王东丶
    回答时间: 2023-07-14 11:52:36

    这是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(); }

  • avatar xmshao
    回答时间: 2023-07-14 12:23:44

    我也觉得有点奇怪,奇怪的是,你的CH15怎么配置出来的,直接套用CH8 CH9的配置修改而来? 你现在要用到CH8 CH9 CH15,请把ADC扫描序列模式改为 Sequencer set to not fully configurable,这样你 就用不着做配置来回切换。你不妨用CubeMx配置下, hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED;

  • avatar 王东丶
    回答时间: 2023-07-14 12:53:57
    xmshao 发表于 2022-10-20 15:13
    我也觉得有点奇怪,奇怪的是,你的CH15怎么配置出来的,直接套用CH8 CH9的配置修改而来?

    不瞒你说 还是真仿着ch8 ch9写的 改了一下模式

  • avatar 王东丶
    回答时间: 2023-07-14 13:26:44
    xmshao 发表于 2022-10-20 15:13
    我也觉得有点奇怪,奇怪的是,你的CH15怎么配置出来的,直接套用CH8 CH9的配置修改而来?

    按照你的方法试了一下 ,ch8 和ch 9的值不正确,ch15正确

  • avatar butterflyspring
    回答时间: 2023-07-14 13:47:03

    是不是转换通道数设置为1, 又设置的 hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED_BACKWARD; 有可能只转换了最后的通道15 呢?

  • avatar 王东丶
    回答时间: 2023-07-14 14:11:57
    butterflyspring 发表于 2022-10-20 17:42
    是不是转换通道数设置为1, 又设置的 hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED_BACKWARD; 有可能只转 ...

    好的 ,我去试试看看,谢谢

  • avatar 王东丶
    回答时间: 2023-07-14 14:28:47

    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; }

会员中心 微信客服
客服
回到顶部