打印
[STM32F1]

ADC转换时间为什么不能达到1us

[复制链接]
1963|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
迷宫|  楼主 | 2014-8-22 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
直接上程序  时钟已经是56M   
void ADC_Configuration(void)
{
  
    /* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_InitTypeDef DMA_InitStructure;
  
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 2;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  DMA_Cmd(DMA1_Channel1, ENABLE);
        /* 定义 ADC 初始化结构体 ADC_InitStructure */
        ADC_InitTypeDef ADC_InitStructure;

        /*       
        *        独立工作模式;
        *        多通道扫描模式;
        *        连续模数转换模式;
        *        转换触发方式:转换由软件触发启动;
        *        ADC 数据右对齐 ;
        *        进行规则转换的 ADC 通道的数目为1;
        */
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 2;
        ADC_Init(ADC1, &ADC_InitStructure);
        /*配置ADC时钟,为PCLK2的8分频,即8MHz*/
        RCC_ADCCLKConfig(RCC_PCLK2_Div4);
        
        /* 设置 ADC1 使用8转换通道,采样时间为 55.5 周期 */
        //ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_55Cycles5);
       // ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);
        ADC_DMACmd(ADC1, ENABLE);
        
         ADC_InjectedSequencerLengthConfig(ADC1, 1);
         ADC_InjectedChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_1Cycles5);
         
         ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
         ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4);//设置注入通道T1比较4中断触发
           /* Enable JEOC interupt */
         ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);
         RCC_ADCCLKConfig(RCC_PCLK2_Div4);
        /* 使能 ADC1 */
        ADC_Cmd(ADC1, ENABLE);
       
        /* 复位 ADC1 的校准寄存器 */   
        ADC_ResetCalibration(ADC1);
        /* 等待 ADC1 校准寄存器复位完成 */
        while(ADC_GetResetCalibrationStatus(ADC1));
       
        /* 开始 ADC1 校准 */
        ADC_StartCalibration(ADC1);
        /* 等待 ADC1 校准完成 */
        while(ADC_GetCalibrationStatus(ADC1));
         
        /* 启动 ADC1 转换 */
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);       
}
沙发
迷宫|  楼主 | 2014-8-22 10:03 | 只看该作者
然后是注入通道的中断程序
void ADC1_2_IRQHandler(void)
{
  GPIO_WriteBit(GPIOA, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_3)));//取反
  //ADC_Injectre = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
  ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
}  

使用特权

评论回复
板凳
迷宫|  楼主 | 2014-8-22 10:04 | 只看该作者
我在通道阻断里面 测试a3口led灯的上升沿  和定时器1比较4输出信号  发现两个上升沿的间隔是2us以上  和理论上的1us差了很多  为什么?

使用特权

评论回复
地板
IJK| | 2014-8-22 10:13 | 只看该作者
如果没记错,要达到1M采样率,时钟需要14M的整数倍,此外采样时间需要是 1.5 周期。采样时间为 55.5 周期,无法达到1M采样率。

使用特权

评论回复
5
迷宫|  楼主 | 2014-8-22 10:25 | 只看该作者
后面我一向 是不是因为中断响应 还有语句执行需要时间的原因导致我的这个情况??

使用特权

评论回复
6
picasso101| | 2014-9-25 16:13 | 只看该作者
时钟以及采样周期配置问题吧

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝