2505_93777979 2025-10-17 15:12 采纳率: 0%
浏览 5

stm32adc采样时浮空但不接受数据

stm32h750 adc+tim+dma模式

一直采样不到外部输入 只是看起来悬空

但是悬空的很有规律 每次悬空具体数值不一样

本来没什么问题 把采样函数与变量封装起来就这样了

img

img

img

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-10-17 15:14
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 采用了STM32H750的ADC+TIM+DMA模式。
      - 原本能正常采样,封装采样函数与变量后出现问题,每次采样值表现为浮空且数值有规律变化但不是外部输入的正确值。
    2. 解决方案:
      - 检查引脚配置
      • 确保ADC引脚配置正确,例如使能了GPIO时钟,配置为模拟功能等。可以参考以下代码示例:
    // 使能GPIOA时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();
    // 配置PA0为模拟功能
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    • 检查ADC初始化
      • 确认ADC的初始化参数正确,包括分辨率、采样时间等。示例代码如下:
    ADC_HandleTypeDef hadc1;
    hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    hadc1.Init.ScanConvMode = DISABLE;
    hadc1.Init.ContinuousConvMode = ENABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    hadc1.Init.DMAContinuousRequests = ENABLE;
    hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
        // 初始化错误处理
    }
    
    • 检查DMA配置
      • 确保DMA配置正确,包括通道选择、数据传输方向等。例如:
    DMA_HandleTypeDef hdma_adc1;
    hdma_adc1.Instance = DMA2_Stream0;
    hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode = DMA_CIRCULAR;
    hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {
        // 初始化错误处理
    }
    __HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1);
    
    • 检查采样函数封装
      • 确认封装的采样函数中没有错误,例如变量作用域问题等。检查函数内部是否正确调用了ADC相关的HAL库函数,如启动ADC采样、获取采样值等。
        3. 不同解决方案的优缺点:
    • 全面检查硬件配置
      • 优点:能从根本上排查硬件层面的问题,避免遗漏硬件配置不当导致的错误。
      • 缺点:需要对硬件知识有一定要求,排查过程较为繁琐,可能需要较多时间。
    • 检查初始化代码
      • 优点:针对性强,能快速定位初始化参数是否有误,对代码逻辑要求相对较低。
      • 缺点:可能忽略其他潜在问题,如引脚复用冲突等。
    • 检查函数封装
      • 优点:能直接发现封装过程中引入的错误,相对较为直观。
      • 缺点:可能无法找到深层次的硬件或初始化问题。
        4. 总结:
    • 针对该问题,首先要全面检查硬件引脚配置是否正确,确保ADC引脚处于合适的状态。然后仔细核对ADC和DMA的初始化参数,保证其与设计要求一致。最后重点排查采样函数封装过程中是否存在变量作用域、函数调用等方面的错误。通过这些步骤逐步定位并解决问题,使ADC采样能正确获取外部输入数据。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月17日