adc 采样 时间 采样周期 相关的问题

2019-07-20 15:08发布

void  DMA_config( u16 Size){
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 , ENABLE);
  DMA_InitTypeDef       DMA_InitStructure;
  DMA_InitStructure.DMA_BufferSize= 25000;      //要传输的数据量
        DMA_InitStructure.DMA_Channel=DMA_Channel_0  ;//配置传输的通道0
       
        DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
        DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_HalfFull;

        DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;//存储器突发传输配置  可选择增量
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//用来设置内存的数据长度(半字)
        DMA_InitStructure.DMA_MemoryInc= DMA_MemoryInc_Enable;//存储器增量模式
        DMA_InitStructure.DMA_Mode= DMA_Mode_Normal;//采集模式设置(单次采集)
         
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;//传输的方向,从外设到存储器
        DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)ADC1_DR_ADDRESS;//DMA外设地址
        DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&ADC1_ConvertedValue;//存储器地址
         
         
        DMA_InitStructure.DMA_PeripheralBurst= DMA_PeripheralBurst_Single;//外设突发单次传输
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设数据长度 和 内存数据长度相同
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//DMA_PeripheralInc 设置传输数据的时候外设地址是不变还是递增
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;//中等优先高
        DMA_Init(DMA2_Stream0, &DMA_InitStructure);
        //DMA_Cmd(DMA2_Stream0, ENABLE);   
  DMA_Cmd( DMA2_Stream0 , DISABLE );
        DMA_ClearITPendingBit( DMA2_Stream0 ,DMA_IT_TCIF0 );
        //DMA_ClearITPendingBit( DMA2_Stream0 ,DMA_IT_TCIF0|DMA_IT_DMEIF0|DMA_IT_TEIF0|DMA_IT_HTIF0|DMA_IT_TCIF0 );
        DMA_ITConfig( DMA2_Stream0 , DMA_IT_TC , ENABLE );

}
DMA配置如上 。 从外设到内存传输,,,外设基地址是 adc的寄存器地址(不变),内存的基地址 是一个数组的首地址(增量模式)。然后我想问的是,是不是一次采样就采回来一个数据,然后 依次保存到我的数组(假设A[0],A[1],A[2]....这样 )。。
然后还有个问题就是 关于时钟周期的,,,

        u32 MaxData;
        u16 div=1;
       
        while( (SystemCoreClock/2/Fre/div)>65535 )//168M/2/200000/div和  65535 比较
        {
                 div++;
        }
        MaxData =  SystemCoreClock/2/Fre/div - 1;   
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2 , ENABLE );                        //开启时钟
       
        /* Time base configuration */
        TIM_TimeBaseStructure.TIM_Period = MaxData ;//设置溢出的数的大小
        TIM_TimeBaseStructure.TIM_Prescaler = div-1;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit( TIM2 , &TIM_TimeBaseStructure );
       
                /* PWM1 Mode configuration: Channel2 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = MaxData/2;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC2Init( TIM2 , &TIM_OCInitStructure);
       
        TIM_OC2PreloadConfig( TIM2 , TIM_OCPreload_Enable );

        TIM_ARRPreloadConfig( TIM2 , DISABLE );
        TIM_Cmd( TIM2 , DISABLE );                                                        /* TIM2 enable counter */
        TIM_CtrlPWMOutputs( TIM2, ENABLE );
}

上面那段代码 ,我怎么觉得div 只能是1,然后分频系数就是0,,,

/* ADC Common Init **********************************************************/
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
        ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
        ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
        ADC_CommonInit( &ADC_CommonInitStructure );

        /* ADC1 Init ****************************************************************/
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfConversion = 1;
        ADC_Init( ADC1, &ADC_InitStructure );

        /* ADC3 regular channel7 configuration **************************************/
        ADC_RegularChannelConfig( ADC1 , ADC_Channel_2 , 1, ADC_SampleTime_3Cycles);  //PA2
        ADC_DMARequestAfterLastTransferCmd( ADC1 , ENABLE );
       
        ADC_DMACmd(ADC1, ENABLE);
        ADC_Cmd(ADC1, ENABLE);
        ADC_SoftwareStartConv( ADC1 );
        ADC配置是上面这样的,分频系数是2 分频 (168M/2  频率就是 84M),然后采样时间是  12.5+ (ADC_SampleTime_3Cycles)) 3 个周期,

       他说 采样周期 是5us 采样频率是 200k     这个是怎么计算,还是在哪设置了....  我始终 计算不出来


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
join
1楼-- · 2019-07-20 16:08
首先ADC的采样周期是可以设置的,有1.5 7.5 13.5 28.5 41.5 55.5 71.5 139.5几个。
还有一个公式:ADC采样频率=ADC CLOCK / (12.5+ADC配置的采样周期)
弥赛亚9
2楼-- · 2019-07-20 20:21
 精彩回答 2  元偷偷看……
弥赛亚9
3楼-- · 2019-07-21 02:05
@正点原子 ,,,,,他这样也是最佳答案??  他好像连题目都没有看清楚、。。

一周热门 更多>