发 帖  
原厂入驻New
[问答] ADC的采样时间是怎么计算的?
74 adc
分享
我是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
请各位高手不吝赐教!谢谢
0
2020-8-28 08:00:16   评论 分享淘帖 邀请回答
7个回答
这个参考我们的不完全手册。
2020-8-28 07:31:12 评论

举报

路过,,,,,,,跟着原子的脚步走。。。。
2020-8-28 07:47:09 评论

举报

跟原子走,捧原子场。。。
2020-8-28 07:53:57 评论

举报

先去看看吧!不行再来求教!
2020-8-28 08:01:41 评论

举报

回楼主位:
我想问下,采样的周期是怎么算的
按照我个人的理解是:ADCCLK=PCLK2/4=HCLK/4=SYSCLK/2 /4=8M/2/4=1M
这样算是不对的。
首先你要确定你的系统时钟是多少,SYSCLK是8的倍频,一般为72MHZ,但要想adc工作在最大的时钟下,SYSCLK是8的7倍频 = 56MHZ, 
ADCCLK=PCLK2/4=HCLK/4=SYSCLK /4 =14MHZ,这样adc,在采样周期1.5个周期是,可以接近 1M 
2020-8-28 08:21:15 评论

举报

 RCC_ADCCLKConfig(RCC_PCLK2_Div4);                       /* ADCCLK =&nbspCLK2/4 */
这样不是大于14M了吗?这个有问题吗?新手疑问
2020-8-28 08:35:42 评论

举报

没有看到使用PLL.
LZ理解是对的.
如果ADCCLK超过手册规定值,转换精度就不能保证达到手册的值,具体表现是噪声变大,INL变大.
2020-8-28 08:54:26 评论

举报

只有小组成员才能发言,加入小组>>

83个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表