OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17367|回复: 7

关于ADC的采样时间问题!请高手们赐教~!

[复制链接]

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-5-7
在线时间
5 小时
发表于 2012-6-2 16:06:47 | 显示全部楼层 |阅读模式
我是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


请各位高手不吝赐教!谢谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-2 16:44:34 | 显示全部楼层
这个参考我们的不完全手册。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2012-3-6
在线时间
5 小时
发表于 2012-6-2 17:46:41 | 显示全部楼层
路过,,,,,,,跟着原子的脚步走。。。。
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复 支持 反对

使用道具 举报

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2012-3-6
在线时间
5 小时
发表于 2012-6-3 13:30:31 | 显示全部楼层
跟原子走,捧原子场。。。
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-5-7
在线时间
5 小时
 楼主| 发表于 2012-6-3 16:19:13 | 显示全部楼层
回复【2楼】正点原子:
这个参考我们的不完全手册。
---------------------------------
先去看看吧!不行再来求教!
回复 支持 反对

使用道具 举报

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-2-2
在线时间
0 小时
发表于 2012-6-4 10:37:13 | 显示全部楼层
回楼主位:
我想问下,采样的周期是怎么算的
按照我个人的理解是: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 
回复 支持 反对

使用道具 举报

18

主题

100

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1196
金钱
1196
注册时间
2012-3-26
在线时间
387 小时
发表于 2012-7-11 20:12:37 | 显示全部楼层
 RCC_ADCCLKConfig(RCC_PCLK2_Div4);                       /* ADCCLK = CLK2/4 */

这样不是大于14M了吗?这个有问题吗?新手疑问
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2012-7-11 20:34:37 | 显示全部楼层
没有看到使用PLL.
LZ理解是对的.
如果ADCCLK超过手册规定值,转换精度就不能保证达到手册的值,具体表现是噪声变大,INL变大.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 17:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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