为什么ADC的一个元素周期表前20个最少采集20个点

博客访问: 304716
博文数量: 97
博客积分: 1431
博客等级: 上尉
技术积分: 1006
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
ADCCLK PCLK2(APB2 )CLK ADC
(2) 一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
15:14 ADCPREADC
00PCLK2 2ADC
01PCLK2 4ADC
10PCLK2 6ADC
11PCLK2 8ADC
&&/* ADCCLK = PCLK2/4 */
时钟使能设置
& &RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 |
RCC_APB2Periph_GPIOC, ENABLE);
)16.7 可编程的通道采样时间
ADC ADC_CLK
ADC_SMPR1 ADC_SMPR2 SMP[2:0]
SMPx[2:0]:选择通道x的采样时间
这些位用于独立地选择每个通道的采样时间。在采样周期中通道选择位必须保持不变。
000:1.5周期 100:41.5周期
001:7.5周期 101:55.5周期
010:13.5周期 110:71.5周期
011:28.5周期 111:239.5周期
– ADC1的模拟输入通道16和通道17在芯片内部分别连到了温度传感器和VREFINT。
– ADC2的模拟输入通道16和通道17在芯片内部连到了VSS。
)我们的输入信号是50Hz (周期为20ms),初步定为1周期200个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为 20ms /200 = 100 us
周期,则 ADC采样周期一周期大小为
时钟频率为 1/66us =15 KHz。
&ADC周期,则 ADC采样周期一周期大小为
) 。 ADC 时钟频率为 7.15MHz。
)接下来我们要确定系统时钟:我们 用的是 8M Hz 的外部晶振做时钟源(HSE),估计得 经过 PLL倍频 PLL 倍频系数分别为2的整数倍,最大72 MHz。为了 提高数据 计算效率,我们把系统时钟定为72MHz,(PLL 9倍频)。则 PCLK2=72MHz,PCLK1=36MHz;
ADC 转换时间:
STM32F103xx 增强型产品:ADC 时钟为56MHz 时为1μs(ADC 时钟为72MHz 为1.17μs)
)由以上分析可知:不太对应,我们重新对以上中 内容调整,提出如下两套方案:
(周期为20ms),初步定为1周期2500个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为 20ms /2500 = 8 us
周期,则 ADC采样周期一周期大小为
时钟频率约为 9 MHz。
(周期为20ms),初步定为1周期1000个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为 20ms /1000= 20 us
周期,则 ADC采样周期一周期大小为
时钟频率约为 12 MHz。
阅读(8628) | 评论(2) | 转发(2) |
相关热门文章
给主人留下些什么吧!~~
STM32 手册 中相关内容:
16.7可编程的通道采样时间
ADC 使用若干个ADC_CLK 周期对输入电压采样,采样周期数目可以通过
ADC_SMPR1 和ADC_SMPR2 寄存器中的SMP[2:0]位而更改。每个通道可以以
不同的时间采样。总转换时间如下计算:
TCONV = 采样时间+ 12.5 个周期
当ADCCLK=14MHz 和1.5 周期的采样时间
TCONV = 1.5 + 12.5 = 14 周期 = 1μs
其中关于 12.5 个周期的问题 还真是不太清楚,希望 明白的人指点一下,博文中的内容是一点学习心得,不敢保证是对的。
你的计算为什么都没有考虑到“12.5个周期”的问题呢?
请登录后评论。扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
当信号频率趋近于采样率的一半时是否会发生失真?一个完整的波形,只用两个点就可以恢复出来吗?如上,比如某个信号包含一个100Hz的正弦波信号,现采用200Hz的采样频率,这样的话,一个完整的正弦波里只有两个采样点,那么把所有的点连起来,会出现这么几种情况,第一种情况,一个采样点在波峰,一个采样点在波谷,这样把这些点依次连起来,将会是个三角波,第二中情况,采样点都在幅值为零的地方,那么这些点连起来,就是一条直线;第三种情况,就是介于第一和第二种情况之间,也是一个三角波,只不过是随两采样点的位置不同,陡平程度不一样而已.如果是这样的话,我想知道根据奈奎斯特定律,是如何能让信号完全保真的?如果是这样的话,信号失真度不是会很高?如果是这样的话是不是要求采样率是信号最高频率的10倍甚至20倍才可以比较真实的反应原信号?自己可以画个正弦波隔相同的时间间距取一个点画一下,看看是不是要高于10倍才能比较真实的反应原始信号.粘贴复制来的的不相关的大理论就不要回答了.另外我在网上也搜到了,说要大于两倍,那么好,就算四倍吧.一个周期也才四个采样点.也不能很好的反应原始波形.还有人说一个周期的两个点就包含了信号的所有信息?我表示不赞同,因为对于单个的完整波形来说,采样的时候记录的只是时间点和幅值大小,并不能知道采样点得相位信息,就连知道信号由哪些的频率的波组成各自幅值多达也是通过采集了很多个周期,通过数学处理算出来的.
palnewmanm5414
扫二维码下载作业帮
3亿+用户的选择
理论上讲,大于2倍就可以了,实际上,为了得到比较光滑的图形,至少8倍以上.工程上一般采用16、32或64倍.
那也就是说,按照这个理论,其实无论采样频率是信号频率的多少倍,都会有失真,是吗?模拟信号到数字信号会有失真,再从数字信号可以还原回以前没有失真的模拟信号吗?
都有失真。
为您推荐:
其他类似问题
扫描下载二维码在MCU系统中如何利用ADC技术进行数据采集 (2)_物联网在线你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
再次写写stm32cubemx中AD采集的问题,这次不用while里面的查询,也不用中断采样了,直接用DMA
先说下用DMA的好处:无论是中断采样还是查询采样,都需要在主程序中占用好多时间出来,嗯,你可以这样理解
那种采样都需要调用HAL_ADC_GetValue()这个函数,,,就是要取得转换后的值,中断还好点,要是查询的话,有可能会丢失数据啊. 用dma就可以避免了
DMA用的事总线时间,无线cpu干预,额,这种说法貌似有点问题.管它呢
在AD转换结束的时候自动连接你准备存取的变量的地址,数据一步到位.额,省了多少事..
使用stm32cubemx对AD的配置
然后对她的DMA配置,并开启DMA的中断
然后生成代码吧
打开main.c文件,在这个地方添加代码
/[i] USER CODE BEGIN 0 [/i]/
__IO uint16_t uhADCxConvertedValue = 0;
/[i] USER CODE END 0 [/i]/
在main()函数里添加
/[i] USER CODE BEGIN 2 [/i]/
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&uhADCxConvertedValue, 1);
/[i] USER CODE END 2 [/i]/
意思是开启dma传输,传送一个字的数据到uhADCxConvertedValue这个变量里面
然后再文件的末尾处添加
/[i] USER CODE BEGIN 4 [/i]/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
/[i] Turn LED1 on: Transfer process is correct [/i]/
// BSP_LED_On(LED1);
HAL_GPIO_WritePin (GPIOF,GPIO_PIN_6,GPIO_PIN_SET );
/[i] USER CODE END 4 [/i]/
意思是AD转换完成调用这个函数,哈数里使能led
也许,你会问,为毛是HAL_ADC_ConvCpltCallback()这个函数啊,这个函数不是当开启AD的中断的时候才调用的吗?
嗯,对,这个函数是这样的,但是你仔细去分析下开启AD的DMA中断函数里面,就会发现这个函数也在啊
如下图.进入HAL_ADC_Start_DMA函数里面,看到
在进入到图中的ADC_DMAConvCplt函数里面看到
OK,疑问解决,
以后用到AD就可以直接调用这个CALL了,不要纠结了.
计算下整个AD的时间,系统时钟是168M,APB2是84M,那么AD二分频是42M,采样用了3个周期,AD转换用15个周期,那么总的时间就是
(15+3)/42M = 0.428us 就是说整个一次AD转换要话费0.42us时间,那么你用求平均法做的话,10次就是4us,就是说取得一次可用的AD值要4个us
要是多通道同时采集的话,那么就要充分利用
HAL_ADC_ConvCpltCallback这个函数了
函数了进行分离标记
谢谢你的笔记,对我很有帮助,看了好多天,都没理解,你一段话就使人豁然开朗,谢谢,请继续你伟大的分享。
怎么设置才能自动 ADC_DMAConvCplt() 这个函数呢? 不需要设置吗?
图上面所说的自动是硬件自动调用吗?还是也需要到其他中断中调用该函数。新手,请解释下
是硬件自动,无需干预,只要你上面开启并使能了DMA
仔细查询了下,准确的说不能说是硬件自动调用ADC_DMAConvCplt()函数。
在HAL_ADC_Start_DMA() 中设置了ADC_DMAConvCplt,是为了在DMA的中断中使用的。
在HAL_DMA_IRQHandler函数中
需要开启DMA中断才能调用。
用DMA直接将外设的数据传到内存里,怎么读取内存里的这些数据呢?
还有请问如何直接生成timer.c timer.h dma.c dam.h等这些文件啊?是需要在哪里设置吗?求解答!
由cubemx生成project之前设置,选中“生成所有.c和.h文件”选项即可,不生成也不影响只不过所有代码都会放在main.c里面
建议你不需要开DMA中断,因为你设置的是DMA连续ADC采集,这样也就是每0.428us 就生产一次DMA完成中断,太过频繁的中断会经常阻塞其他程序的执行。
正常的用法是屏蔽DMA的ADC通道中断,然后在你要获取ADC数据的时候直接读取uhADCxConvertedValue变量就可以了。也不需要调用HAL_ADC_ConvCpltCallback。
但在CUBEMX 4.11的版本里,不能禁用DMA中断,所以需要手动修改dma.c文件里的设置,取消DMA的ADC通道中断。
楼主的例子是采样一次的例子,如果需要连续采样10个。那么将uhADCxConvertedValue变成数组,将HAL_ADC_Start_DMA函数最后一个次数设置成10就OK。
就在回调函数里面处理你的数据就可以了
我想问一下 那个HAL_ADC_Start_DMA函数最后一个次数设置成20,为什么出不来了?
版主您好,我想请教您个问题,关于这句hadc-&DMA_Handle-&XferCpltCallback = ADC_DMAConvC 这句话应该是给这个hadc-&DMA_Handle-&XferCpltCallback函数指针赋值(即让这个hadc-&DMA_Handle-&XferCpltCallback指针指向这个ADC_DMAConvCplt函数),并没有出现调用这个ADC_DMAConvCplt的语句,(因为要是调用函数,函数后面的括号不能省吧),这里我很不理解他是怎么调用的,还望版主指教。
要回复文章请先或您当前的位置:&>&&>&&>&
STM32 ADC采样时间、采样周期、采样频率计算方法
&ADC转换就是输入模拟的信号量,单片机转换成数字量。读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期。采样周期一般来说=转换时间+读取时间
。而转换时间=采样时间+12.5个时钟周期。采样时间是你通过寄存器告诉采样模拟量的时间,设置越长越精确
ADC采样频率的确定
1. :先看一些资料,确定一下ADC的时钟:
(1),由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。CLK控制器为ADC时钟提供一个专用的可编程预分频器。
(2) 一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
(3)在时钟配置寄存器(RCC_CFGR) 中 有 为ADC时钟提供一个专用的可编程预分器
位15:14 ADCPRE:ADC预分频
由软件设置来确定ADC时钟频率
00:PCLK2 2分频后作为ADC时钟
01:PCLK2 4分频后作为ADC时钟
10:PCLK2 6分频后作为ADC时钟
11:PCLK2 8分频后作为ADC时钟
我们可对其进行设置 例如:
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
另外 还有 ADC 时钟使能设置
/* Enable ADC1, ADC2 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 |
RCC_APB2Periph_GPIOC, ENABLE);
(4)16.7 可编程的通道采样时间
ADC 使用若干个ADC_CLK
周期对输入电压采样,采样周期数目可以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位而更改。每个通道可以以不同的时间采样。
总转换时间如下计算:
TCONV(转换时间) = 采样时间+ 12.5 个周期
当ADCCLK=14MHz 和 1.5周期的采样时间:
TCONV = 1.5 + 12.5 = 14周期= 1&s
SMPx[2:0]:选择通道x的采样时间
这些位用于独立地选择每个通道的采样时间。在采样周期中通道选择位必须保持不变。
000:1.5周期100:41.5周期
001:7.5周期101:55.5周期
010:13.5周期110:71.5周期
011:28.5周期111:239.5周期
& ADC1的模拟输入通道16和通道17在芯片内部分别连到了温度传感器和VREFINT。
& ADC2的模拟输入通道16和通道17在芯片内部连到了VSS。
2. 具体分析如下:
(1)我们的输入信号是50Hz (周期为20ms),初步定为1周期200个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为
20ms /200 = 100 us
ADC可编程的通道采样时间 我们选最小的 1.5 周期,则 ADC采样周期一周期大小为
100us /1.5=66us 。 ADC 时钟频率为 1/66us =15 KHz。
ADC可编程的通道采样时间 我们选71.5 周期,则 ADC采样周期一周期大小为
(100us /71.5) 。 ADC 时钟频率为 7.15MHz。
(2)接下来我们要确定系统时钟:我们 用的是 8M Hz 的外部晶振做时钟源(HSE),估计得 经过 PLL倍频 PLL
倍频系数分别为2的整数倍,最大72 MHz。为了 提高数据 计算效率,我们把系统时钟定为72MHz,(PLL
9倍频)。则PCLK2=72MHz,PCLK1=36MHz;
我们通过设置时钟配置寄存器(RCC_CFGR) 中 有 为ADC时钟提供一个专用的可编程预分器,将PCLK2 8 分频后作为ADC 的时钟,则可知ADC
时钟频率为 9MHz
从手册可知: ADC 转换时间:
STM32F103xx增强型产品:ADC时钟为56MHz时为1&s(ADC时钟为72MHz为1.17&s)
(3)由以上分析可知:不太对应,我们重新对以上中 内容调整,提出如下两套方案:
方案一:我们的输入信号是50Hz
(周期为20ms),初步定为1周期2500个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为 20ms /2500 = 8
ADC可编程的通道采样时间 我们选71.5周期,则 ADC采样周期一周期大小为
8us /71.5 。 ADC时钟频率约为 9 MHz。
将PCLK2 8 分频后作为ADC 的时钟,则可知ADC 时钟频率为 9MHz
方案二:我们的输入信号是50Hz
(周期为20ms),初步定为1周期1000个采样点,(注:一周期最少采20个点,即采样率最少为1k) ,每2个 采样点间隔为 20ms /1000= 20
ADC可编程的通道采样时间 我们选239.5周期,则 ADC采样周期一周期大小为
20us /239.5 。 ADC时钟频率约为 12 MHz。
将PCLK2 6 分频后作为ADC 的时钟,则可知ADC 时钟频率为 12MHz

我要回帖

更多关于 zabbix采集周期 的文章

 

随机推荐