STM32
直播中

吕珠峰

10年用户 782经验值
擅长:可编程逻辑
私信 关注
[问答]

求助,关于STM32H750的AD采样问题求解

芯片是STM32H750VB,100脚LQFP,查看官方资料,ADC1快速通道最快19MHZ,采样率16位最快1.9M。
我设置ADC为连续采样模式,DMA循环,频率16MHZ,1.5个采样周期(总共就是1.5加8.5=10个)
DMA设置为双缓存。
使用定时器3,计数CNT,测试ADC采样率。
计数4万个查看一次,结果发现ADC采样率位0.8M,按照数值计算,不是应该1.6M吗?
继续修改采样率,ADC频率32MHZ,最后ADC采样率1.6M
ADC频率64M,ADC采样率3.2M
为什么差了1倍?

  • //初始化ADC
  • //这里我们仅以规则通道为例
  • //我们默认仅开启ADC1_CH3P
  • //16位转换时间位:采样周期+8.5个ADC周期
  • void  Adc_Init(void)
  • {
  •         //先初始化IO口
  •          RCC->AHB1ENR|=1<<5;                    //使能ADC1/2时钟
  •         RCC->AHB4ENR|=1<<0;                    //使能PORTA时钟
  •         GPIO_Set(GPIOA,PIN6,GPIO_MODE_AIN,0,0,GPIO_PUPD_NONE);//PA6,模拟输入,不带上下拉

  •         RCC->AHB1RSTR|=1<<5;                   //ADC1/2复位
  •         RCC->AHB1RSTR =~(1<<5);                //复位结束
  •         RCC->D3CCIPR =~(3<<16);                //ADCSEL[1:0]清零
  •         RCC->D3CCIPR|=2<<16;                //ADCSEL[1:0]=2,per_ck作为ADC时钟源,默认选择hsi_ker_ck作为per_ck,频率:64Mhz
  •         ADC12_COMMON->CCR|=1<<18;        //PRESC[3:0]=1,输入时钟2分频,即adc_ker_ck=per_ck/2=64/2=32Mhz(不能超过36Mhz)

  •         ADC1->CR=0;                                   //CR寄存器清零,DEEPPWD清零,从深度睡眠唤醒.
  •         ADC1->CR|=1<<28;                          //ADVREGEN=1,使能ADC稳压器
  •         delay_ms(10);                                //等待稳压器启动完成,约10us,这里延时大一点,没关系.
  •         ADC1->CR|=1<<8;                          //BOOST=0,ADC禁止工作在boost模式(ADC频率小于20M的时候,不能设置boost位)
  •         ADC1->CFGR |=(0<<17);                //
  •         ADC1->CFGR  =~(1<<16);                //DISCEN=0,禁止常规通道的不连续模式
  •         ADC1->CFGR |=(1<<13);                //CONT=1,连续转换模式
  •         ADC1->CFGR|=1<<12;                        //OVRMOD=1,复写模式(DR寄存器可被复写)
  •         ADC1->CFGR =~(3<<10);                //EXTEN[1:0]=0,软件触发
  •         ADC1->CFGR =~(7<<2);                //RES[2:0]位清零
  •         ADC1->CFGR|=0<<2;                        //RES[2:0]=0,16位分辨率(0,16位;1,14位;2,12位;3,10位;4,8位.)
  •         ADC1->CFGR|=3<<0;                        //选择 DMA 循环模式

  •         ADC1->CFGR2 =~((u32)15<<28);//LSHIFT[3:0]=0,不左移,数据右对齐.
  •         ADC1->CFGR2 =~((u32)0X3FF<<16);//OSR[9:0]=0,不使用过采样


  •         ADC1->CR =~((u32)1<<30);        //ADCALDIF=0,校准单端转换通道
  •         ADC1->CR|=1<<16;                        //ADCALLIN=1,线性校准
  •         ADC1->CR|=(u32)1<<31;                //开启校准
  •         while(ADC1->CR ((u32)1<<31));//等待校准完成

  •         ADC1->SQR1 =~(0XF<<0);                //L[3:0]清零
  •         ADC1->SQR1|=0<<0;                     //L[3:0]=0,1个转换在规则序列中 也就是只转换规则序列1

  •         //设置通道19的采样时间
  • //        ADC1->SMPR2 =~(7<<(3*9));        //通道3采样时间清空
  • //         ADC1->SMPR2|=0<<(3*9);                 //通道3 1.5个周期,
  •          ADC1->CR|=1<<0;                                   //开启AD转换器
  • }


回帖(1)

李斌

2024-7-26 17:18:51
首先,我们需要了解一下STM32H750的ADC性能和相关参数。根据您提供的信息,ADC1快速通道最快19MHz,16位采样率最快1.9M。接下来,我们将分析您的问题。

1. 您设置的ADC频率为16MHz,按照理论计算,采样率应该是1.6M。但实际上,您测得的采样率为0.8M。这可能是因为在实际应用中,ADC的采样率受到多种因素的影响,例如ADC的启动时间、转换时间、DMA传输时间等。这些因素可能导致实际采样率低于理论值。

2. 当您将ADC频率提高到32MHz时,采样率提高到1.6M,这与理论值相符。这说明在32MHz的频率下,ADC的性能达到了预期。

3. 当您将ADC频率提高到64MHz时,采样率提高到3.2M,与理论值相差1倍。这可能是因为在更高的频率下,ADC的采样周期和DMA传输时间等因素对采样率的影响更加明显。此外,STM32H750的ADC性能可能在高频率下受到限制。

为了解决这个问题,您可以尝试以下方法:

1. 检查您的代码,确保没有其他因素影响ADC的采样率,例如错误的初始化设置或者不必要的延时。

2. 优化DMA设置,确保DMA传输时间尽可能短,以减少对采样率的影响。

3. 如果可能的话,尝试使用其他ADC通道或者不同的ADC配置,看看是否能提高采样率。

4. 考虑使用外部ADC芯片,以获得更高的采样率和更好的性能。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分