芯片是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转换器
- }
复制代码
|
这个不知道是不是Y版本和V版本的问题 可以看看这一篇文章
STM32H743/H750的Y版和V版芯片ADC的主频区别 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)