赫兹豆 发表于 2025-9-5 16:51:15

ADC_DMA数据不对

////////////////////////////////////////
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    u16 i, a;
    // 在此添加用户主函数初始化代码
    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
      // printf_usb("Hello World !\r\n");
      i = ADC_Convert(15);
      printf_usb("%d\r\n",(int) pu8ADCDMABuffer);

      printf_usb("%d\r\n",(int) pu8ADCDMABuffer);
      printf_usb("%d\r\n",(int) pu8ADCDMABuffer); //通道数
       // printf_usb("%d\r\n", (int)a);
      printf_usb("%d\r\n",(int) i);
      delay_ms(1000);
      // 接收数据原样返回,用于测试usb OUT done();
      // 当使用査询方式 if(bUsbOutReady),查询调用 USB 库函数时,在数据处理完成后,//必须调用一次“usb OUT done0;”,这样才能接收下一包数据。
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}   ADC_DMA ,接收的数据和通道号不对,实际采地15通道,


国芯人工智能 发表于 2025-9-5 16:53:00

ADCDMA数据不对的问题可能由多个因素引起,包括但不限于DMA配置错误、ADC通道配置不正确、数据缓冲区未正确初始化或读取方式不当。以下是对该问题的详细分析及建议。

首先,检查ADCDMA是否已正确配置。确保DMA通道与ADC通道对应,并且DMA传输模式设置为循环模式(Circular Mode),以保证持续采集数据。同时,确认DMA中断是否被正确使能,以便在数据到达时触发处理逻辑。

其次,检查ADC通道配置是否正确。根据您的描述,实际采样的是通道15,但代码中可能存在通道选择错误。请确认ADCConvert(15)调用是否正确,以及ADC通道是否已正确配置为使用通道15。此外,还需检查ADC的采样时间、分辨率等参数是否符合要求。

接下来,检查DMA缓冲区的初始化和使用是否正确。确保pu8ADCDMABuffer是一个足够大的数组,能够存储所有采集的数据。如果缓冲区大小不足,可能导致数据覆盖或读取错误。此外,确认DMA传输完成后是否及时更新了缓冲区指针,以避免读取到旧数据。

最后,检查数据读取方式是否正确。在代码中,您直接通过pu8ADCDMABuffer、pu8ADCDMABuffer等访问DMA缓冲区的数据。请确保这些索引对应的通道数据确实存在,并且没有发生数据错位。如果使用的是多通道ADC,需确保每个通道的数据在缓冲区中的位置正确。

综上所述,建议逐一检查上述各部分配置,确保ADC、DMA及数据处理逻辑均正确无误。若问题仍未解决,可进一步检查硬件连接及时钟配置,以排除外部因素导致的数据异常。

[本文内容由国芯人工智能辅助生成,仅供参考]

乘风飞扬 发表于 2025-9-5 18:09:12

描述问题时最好提供完整信息,例如使用什么型号的单片机,上传能够复现问题的测试项目。

kaily 发表于 2025-9-6 09:45:20

既然是使能了ADC的DMA功能
就必须使用DMA_ADC_Trigger();函数自动触发ADC转换
不能使用ADC_Convert(15);
页: [1]
查看完整版本: ADC_DMA数据不对