(2011-10-13 08:31:26) 转载
▼
分类: 数码
这些细节在STM32F4的原厂参考手册中没有说明,只是很简短的列了一下。 我是查看ST前几天刚发布的接口库才最后弄明白的,不敢独享!
1、STM32F4有3个的ADC单元,性能强劲,可以使用,也可以联合使用它们。 联合使用在参考手册中叫Interleave模式,最大的目的是加倍提升采样速度。
2、采样速度大幅提高以后,就需要使用DMA来配合提取采样结果,从而发挥STM32F4 ADC模块的最大效能。
3、ADC模块使用DMA有4种模式可选,默认模式和模式1没有什么特别之处。 最有意思的是模式2和模式3:
模式2可以选择多达3个ADC模块工作于Interleave模式,ADC速度从单一模块的 2.4Msps暴涨为7.2Msps,而且还是12-bit的分辨率!唯一的要求是每完成2次转换, 允许DMA一次性取走2个采样值。
模式3跟模式2类同,但要求ADC模块的采样率为8-bit或6-bit,由于转换时间要比 12-bit时短,所以速度更快,适用于速度要求更快,但精度要求较低的场合。 比如用2个ADC模块很容易就可以做到6Msps的速率,而且2次的结果可以存为halfword, 经由DMA取走,耗用内存也比模式2来的少。
剩下的那一个ADC模块也不用闲着,可以工作于其他设定(比如:高精度)的模式
STM32F4 TIM输入捕获(测频)【使用库函数】
在输入捕获模式下,当检测到ICx信号上升/下降边沿时,计数器的当前值被存储在捕获比较寄存器TIMx_CCRx中。
当捕获事件发生时,相应的CCxIF 标志(TIMx_SR 寄存器) 被置1。如果中断或者DMA功能被使能,就会产生中断或者DMA请求。如果捕获发生时,CCxIF标志已经被置位,这时过采样标志CCxOF就会被置位。向CCxIF写0或者读去TIM_CCRx中的数据,将清除捕获标志。CCxOF位只能通过手动写入0进行清除。
假如我设置为上升沿捕获,那么当一个上升沿到来的时候,定时器当前的计数值(TIMx_CNT)就会写入TIMx_CCRx中。我们读取这个数据。等到下一个上升沿到了时,就会有另一个计数器值TIMx_CNT记录。根据这两个数据值差,我们能算出来输入数据的周期。当然,我们还有处理定时器溢出这个问题,定时器溢出了就不准了。
如果要测占空比,就需要同时捕获上升沿和下降沿。相邻两个上升沿之间的计数是输入的周期,相邻两次捕获(一个上升沿一个下降沿)之间的时间是占或者空的时间。根据这个可以计算占空比或者PPM之类的东西。 【实验内容】
本次实验,使用TIM4产生一个1K的频率输出,用TIM1进行捕获。并测出频率计算 TIM1 的时基单元配置:关于TIM1的时基设置问题前文已经讨论过了。这里只有一点需要明确的,就是为了尽量减少更新事件,将TIM_Period设置到最大即0xFFFF。定时器时钟设置成2M,这样定时器的更新频率就是30Hz,不会造成两次捕获之间产生多次更新。 TIM1的完整配置代码如下: void TIM1_ICConfig(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); // //时基初始化
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //死区控制用。 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器方向
TIM_TimeBaseInitStructure.TIM_Prescaler = 84-1; //Timer clock = sysclock /(TIM_Prescaler+1) = 2M
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; //Period = (TIM counter clock / TIM output clock) - 1 = 40Hz
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInit(TIM1,&TIM_ICInitStructure); TIM_Cmd(TIM1,ENABLE); }
TIM4的配置就是基本的输出配置,没什么可说的。代码如下: void TIM4_OCConfig(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Prescaler = 0; TIM_TimeBaseInitStructure.TIM_RepetitionCounter =0;
TIM_TimeBaseInitStructure.TIM_Period = 42000-1; //周期:42M/(42000)= 1K
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 10000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OC1Init(TIM4,&TIM_OCInitStructure); TIM_Cmd(TIM4,ENABLE); }
这个输出频率,在示波器上可以看到的:
之后就是在主函数里边进行测量了: CaptureNumber = 0; while(1) {
if(TIM_GetFlagStatus(TIM1,TIM_FLAG_CC1)==SET) {
TIM_ClearFlag(TIM1,TIM_FLAG_CC1); if(CaptureNumber == 0) {
counter = TIM_GetCapture1(TIM1); //第一次捕获
CaptureNumber = 1; }
else if(CaptureNumber == 1) //处理第二次捕获 {
if(TIM_GetFlagStatus(TIM1,TIM_FLAG_Update) != SET)//两次捕获间没有发生溢出的处理 {
Time = TIM_GetCapture1(TIM1); Time = Time - counter; } else {
TIM_ClearFlag(TIM1,TIM_FLAG_Update); //产生了更新事件
Time = 0xFFFF - counter + TIM_GetCapture1(TIM1)+1; //如果有更新事件产生时候的计算方式 }
CaptureNumber = 0; if(Time!=0) {
freq= 2000000/Time; //计算频率 }
freq = freq; //避免变量freq被编译器优化掉 } } }
QQ:707703387
硬件平台:STM32F4-DISCORVERY 软件平台:KEIL MDK5.10
DMA知识点:直接内存访问(DMA)是用来以提供外设和内存、内存和内存之间的高速数据传输的。数据可以在没有任何CPU干预下通过的DMA进行传输。这使得CPU资源更倾重与其他操作。DMA控制器基于一个复杂的总线矩阵架构,结合了功能强大的双AHB主总线架构与的FIFO,以优化系统带宽。两个DMA控制器共有16个数据流(stream),每个数据流可以编程与规定的通道中的一个搭配。
一些ADC的细节特性在STM32F4的原厂参考手册中没有说明,只是很简短的列了一下。 这我是查看ST前几天刚发布的接口库才最后弄明白的,现在分享给大家:
1、STM32F4有3个的ADC单元,性能强劲,可以使用,也可以联合使用它们。联合使用在参考手册中叫Interleave模式,最大的目的是加倍提升采样速度。 2、采样速度大幅提高以后,就需要使用DMA来配合提取采样结果,从而发挥STM32F4ADC模块的最大效能。
3、ADC模块使用DMA有4种模式可选,默认模式和模式1没有什么特别之处,最有意思
的是模式2和模式3:
4、模式2可以选择多达3个ADC模块工作于Interleave模式,ADC速度从单一模块的2.4Msps暴涨为7.2Msps,而且还是12-bit的分辨率!唯一的要求是每完成2次转换,允许DMA一次性取走2个采样值。
5、模式3跟模式2类同,但要求ADC模块的采样率为8-bit或6-bit,由于转换时间要比12-bit时短,所以速度更快,适用于速度要求更快,但精度要求较低的场合。 比如用2个ADC模块很容易就可以做到6Msps的速率,而且2次的结果可以存为halfword,经由DMA取走,耗用内存也比模式2来的少。剩下的那一个ADC模块也不用闲着,可以工作于其他设定(比如:高精度)的模式。
This example describes how to use the ADC3 andDMA to transfer continuously converted data from ADC3 tomemory.
The ADC3 is configured to convert continuouslychannel12.
Each time an end of conversion occurs the DMAtransfers, in circular mode, the converted data from ADC3 DRregister to the ADC3ConvertedValue variable.
To get the maximum ADC performance (2.4 MSPS, at2.4V to 3.6V supply range), the ADC clock must be set to36MHz. As ADC clock is equal to APB2/2, thenAPB2 value will be 72MHz which leadto maximum AHB (System clock) at144MHz. Since the sampling time is setto 3 cycles and the conversion time to 12bit data is 12 cycles, so the totalconversion time is (12+3)/36= 0.41us(2.4Msps).
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务