打印

菜鸟求高手解读ADC采样时间

[复制链接]
1944|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wgsxsm|  楼主 | 2012-6-2 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是STM32初学者,无奈公司要一个月内改一个老的项目!
以下是程序中关于有关ADC的配置,右边的注释都是我添加的(参照的固件库使用手册):

void Set_System(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
  /* RCC system reset(for debug purpose) */
    RCC_DeInit();                                           /*将外设 RCC 寄存器重设为缺省值 */
    RCC_HSICmd(ENABLE);                                     /*使能内部高速晶振(HSI)       */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);                 /*设置 HSI 作为系统时钟         */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);   /* 使能预取指缓存 */
    FLASH_SetLatency(FLASH_Latency_0);                        /* 设置代码延时值 FLASH_Latency_0=0延时周期*/
    RCC_HCLKConfig(RCC_SYSCLK_Div2);                        /* HCLK = SYSCLK/2 */
    //RCC_PCLK1Config(RCC_HCLK_Div1);/* PCLK1 = HCLK */
    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_PCLK2Config(RCC_HCLK_Div1);                            /* PCLK2 = HCLK */
    RCC_ADCCLKConfig(RCC_PCLK2_Div4);                       /* ADCCLK = PCLK2/4 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
}

void adciniti(void)
{
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;   //ADC1 和 ADC2 工作在独立模式
    ADC_InitStruct.ADC_ScanConvMode=DISABLE;        //规定了模数转换工作在扫描还是单次(单通道)模式
    ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;  //规定了模数转换工作在连续还是单次模式
    ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;  //转换由软件而不是外部触发启动
    ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;   //ADC 数据右对齐
    ADC_InitStruct.ADC_NbrOfChannel=0X01;   //规定了顺序进行规则转换的 ADC 通道的数目,取值1-16
    ADC_Init(ADC1,&ADC_InitStruct);         // 根据 ADC_InitStruct 中指定的参数初始化外设 ADC1 的寄存器
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);    //设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间
    ADC_Cmd(ADC1,ENABLE);
    ADC_ResetCalibration(ADC1);      //重置 ADC1 的校准寄存器               
    while (ADC_GetResetCalibrationStatus(ADC1));                                    //ADC校准寄存器选择完毕
    ADC_StartCalibration(ADC1);     //开始 ADC1 的校准状态
    while (ADC_GetCalibrationStatus(ADC1));
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能 ADC1 的软件转换启动功能
}

我想问下,采样的周期是怎么算的
按照我个人的理解是:ADCCLK=PCLK2/4=HCLK/4=SYSCLK/2 /4=8M/2/4=1M
再根据STM32参考手册里:
16.7 可编程的通道采样时间
ADC 使用若干个 ADC_CLK 周期对输入电压采样,采样周期数目可以通过
ADC_SMPR1 和 ADC_SMPR2 寄存器中的 SMP[2:0]位而更改。每个通道可以以
不同的时间采样。总转换时间如下计算:
T CONV  = 采样时间+ 12.5 个周期
例如:
当 ADCCLK=14MHz 和 1.5 周期的采样时间
T CONV  = 1.5 + 12.5 = 14 周期 = 1μs

采样时间即:55.5*1us=55.5us
总转换时间为:(55.5+12.5)*1us=68us


请各位高手不吝赐教!谢谢
沙发
wgsxsm|  楼主 | 2012-6-3 16:22 | 只看该作者
没有高手帮忙解读一下吗

使用特权

评论回复
板凳
Eric2013| | 2012-6-3 17:26 | 只看该作者
我觉得没有问题

使用特权

评论回复
地板
wgsxsm|  楼主 | 2012-6-3 21:13 | 只看该作者
还有没有异议啊?没有我就执行了。。。
谢谢楼上达达

使用特权

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

本版积分规则

34

主题

652

帖子

4

粉丝