打印

MM32F031K6T的ADC转换速率好像达不到1Msps

[复制链接]
10214|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deadphenix|  楼主 | 2022-2-26 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用库例程,时钟使用HSI,72MHz,APB2不分频;ADC_PRESCARE设置为12;
设置采样通道2个,通道采样时间在55.5周期以上,符合数据手册。但如果采样时间设置为13.5周期,却达不到111ksps,任何低于55.5周期的设置,都只能达到65ksps左右;或者ADC_PRESCARE设置为11及以下,提高ADC时钟,也都只能达到65ksps左右;请问瓶颈在哪儿?下面是ADC配置和时钟配置

//ADC配置,2个采样通道
void ADCMultiChannelInit(){
        GPIO_Config_AIN(GPIOA, GPIO_Pin_1);
  GPIO_Config_AIN(GPIOA, GPIO_Pin_3);
       
    ADC_InitTypeDef  ADC_InitStructure;
    ADC_StructInit(&ADC_InitStructure);

    //Initialize PA1 to analog input mode
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);                         //Enable ADC clock

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_12;                     //ADC prescale factor
    ADC_InitStructure.ADC_Mode = ADC_Mode_Continuous_Scan;                      //Set ADC mode to continuous conversion mode
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                      //AD data right-justified
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC, ADC_Channel_DisableAll, 0, ADC_SampleTime_13_5Cycles);//Block all channels
    ADC_RegularChannelConfig(ADC1, ADCch1, 0, ADC_SampleTime_13_5Cycles);//Enable the channel
    ADC_RegularChannelConfig(ADC1, ADCch2, 0, ADC_SampleTime_13_5Cycles);//Enable the channel

#ifdef ADC_USE_DMA               
    ADC_DMACmd(ADC1, ENABLE);                                                    //Enable ADCDMA
#else
    ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);                              //DMA interrupt initialization
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = ADC_COMP_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
#endif               
    ADC_Cmd(ADC1, ENABLE);                                                       //Enable AD conversion
}

//DMA配置
void ADC_DMAInit(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) & (ADC1->ADDATA);           //DMA transfer peripheral address
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCValue;                      //DMA transfer memory address
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                          //DMA transfer direction from peripheral to memory
    DMA_InitStructure.DMA_BufferSize = 2;                            //DMA cache size
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;            //After receiving the data, the peripheral address is forbidden to move backward
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                     //After receiving the data, the memory address is shifted backward
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //Define the peripheral data width to 16 bits
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;         //Define the memory data width to 16 bits
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                             //Cycle conversion mode
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                         //DMA priority is high
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                //M2M mode is disabled
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_Cmd(DMA1_Channel1, ENABLE);

    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);                              //DMA interrupt initialization
    NVIC_InitStruct.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
               
                ADCTrigFilterflag = 0;
}


//ADCDMA中断处理
u32 measCount;
void DMA1_Channel1_IRQHandler(void)
{
//        ADC_SoftwareStartConvCmd(ADC1, DISABLE);                                     //Stop Conversion
        DMA_ClearITPendingBit(DMA1_IT_TC1);                                          //Clear interrupt flag
        u16 chan = 0;
        measCount++;
//                ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//    ADCflag = 1;                                                                //Erected transmission complete flag

}



//72M时钟配置
void SetSysClockTo72_HSI(void)
{
    unsigned char temp = 0;
    unsigned int temp1 = 0;
    RCC->CR |= RCC_CR_HSION;
    while (!(RCC->CR & RCC_CR_HSIRDY))
        ;

    RCC->CR |= (1 << 20);

    RCC->CR &= ~(1 << 2);

    RCC->CFGR = RCC_CFGR_PPRE1_2;

    FLASH->ACR = FLASH_ACR_LATENCY_2 | FLASH_ACR_PRFTBE;
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

    /* PCLK2 = HCLK PRE2 divide*/
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    /* PCLK1 = HCLK PRE1 divide */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
    RCC->CFGR &= ~RCC_CFGR_SW;

    temp1 = *(u16 *)0x1FFFF7FA;
    if ((temp1 & 0xff) == 0xff) {
        temp1 &= 0xff00;
    } else {
        temp1 &= 0xff;
        temp1 <<= 8;
    }
    temp1 |= (RCC->CR & 0xFFFF00ff) | 0xf8;
    RCC->CR = temp1;
    RCC->CFGR |= RCC_CFGR_SW_HSI;

    while (1) {
        temp = RCC->CFGR;
        temp = temp >> 2;
        temp &= RCC_CFGR_SW;
        if(temp == RCC_CFGR_SW_HSI)
            break;
    }
}

使用特权

评论回复
沙发
deadphenix|  楼主 | 2022-2-28 10:15 | 只看该作者
本帖最后由 deadphenix 于 2022-2-28 10:22 编辑

发现不是ADC的问题,而是PWM的问题,我在ADCDMA转换中设置了TIM的比较寄存器CCR1,这个突然占用了很大的开销。如果在ADC的DMA中断中屏蔽掉“TIM_SetCompare1(TIM1, 200);“,则ADC转换时间是正常的,但加上该句之后,就很耗时了,按理这个应该很快才对,为什么TIM1->CCR1的设置会很耗时呢?

void DMA1_Channel1_IRQHandler(void)
{
//        ADC_SoftwareStartConvCmd(ADC1, DISABLE);                                     //Stop Conversion
        DMA_ClearITPendingBit(DMA1_IT_TC1);                                          //Clear interrupt flag
        u16 chan = 0;
        measCount++;
        TIM_SetCompare1(TIM1, 200);
//                ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//    ADCflag = 1;                                                                //Erected transmission complete flag

}


void PWM_TIM1_ConfigInit()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                   //TIM1_CH1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                             
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 400;                                    
    TIM_TimeBaseStructure.TIM_Prescaler = 6;                                 
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                              
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;               
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                           

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 100;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM1, ENABLE);
    TIM_Cmd(TIM1, ENABLE);

    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

使用特权

评论回复
板凳
tpgf| | 2022-3-4 20:23 | 只看该作者
楼主同时运行pwm程序了吗

使用特权

评论回复
地板
drer| | 2022-3-4 21:10 | 只看该作者
如果跑系统的话会有所改善吗

使用特权

评论回复
5
tfqi| | 2022-3-4 21:18 | 只看该作者
然后就能达到了是吗

使用特权

评论回复
6
zljiu| | 2022-3-4 21:29 | 只看该作者
提高优先级能解决问题吗

使用特权

评论回复
7
kxsi| | 2022-3-4 21:42 | 只看该作者
应该能同时都满足要求的

使用特权

评论回复
8
wiba| | 2022-3-4 21:58 | 只看该作者
估计要用dma或者上系统了

使用特权

评论回复
9
ulystronglll| | 2022-3-16 20:54 | 只看该作者
转换以后有问题吗

使用特权

评论回复
10
zerorobert| | 2022-3-16 21:03 | 只看该作者
手册里面可以达到的。

使用特权

评论回复
11
fengm| | 2022-3-16 21:17 | 只看该作者
不是可以达到2M吗

使用特权

评论回复
12
beacherblack| | 2022-4-1 12:36 | 只看该作者
是信号失真了吗  

使用特权

评论回复
13
chenci2013| | 2022-4-1 12:45 | 只看该作者
MM32F031K6T性能还可以的 。

使用特权

评论回复
14
qindaotang| | 2023-2-19 22:00 | 只看该作者
我用感觉他的ADC5us改变不了,无法调慢也无法调快

使用特权

评论回复
15
qindaotang| | 2023-2-20 18:18 | 只看该作者
实测能达到

使用特权

评论回复
16
Undshing| | 2023-3-9 22:09 | 只看该作者
转换以后有什么问题吗?

使用特权

评论回复
17
Jacquetry| | 2023-3-12 22:00 | 只看该作者
提高优先级试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝