STM32F407VG模数转换精准采样速率的设计
2012-12-17华北电力大学陈邵权范寒柏
华北电力大学 陈邵权 王 涛 范寒柏 王 磊
1.引言
对模拟信号进行频谱分析时,一般需要对信号进行AD采样,并确定采样速率。而对频率分辨率较高的场合,对采样速率要求较为准确,但一般的模数转换器并不能保证准确的采样速率。由此,本文以STM32F407VG为模数转换器,介绍其设定出准确的采样速率的方案[1][2]。
2.STM32F407VG资源
(1)STM32F407VG数模转换器
STM32F407VG数模转换器简称ADC,是12位逐次逼近模拟数字转换器,拥有多个通道,每个通道可以单次、连续、扫描或间接模式进行模数转换。转换又可分为规则转换和注入转换,这两种转换均可以由外部触发。在72MHz工作频率下,一次的模数转换的时间时间仅为1.17us。
(2)STM32F407VG直接存储器
STM32F407VG直接存储器简称DMA,DMA用来在外设和存储器之间或者存储器之间的高速数据传输。数据可以通过DMA快速移动,无须CPU干预,节省了CPU资源。拥有两个DMA控制器,DMA1有七个通道,DMA2有5个通道,每个通道专门原来管理来自于一个或多个外设对存储器访问的请求。同时还有一个仲裁器来协调各个DMA请求的优先权。
(3)STM32F407VG高级控制定时器
STM32F407VG高级控制定时器有两个,为别为TIM1和TIM8。这两个高级定时器由一个16位能够向上、向下、向上向下自动装载计数器组成,并由一个可编程的预分频器驱动,预分频系数可以从1~65535之间的任意数值,他们是完全独立的,不共享任何资源。在主要功能中,可以作为ADC注入触发的事件。
3.ADC定时采样设计思路
由上面的介绍可知,STM32F407VG的ADC可以进行注入转换,注入转换可以由定时器产生,ADC转换之后的结果可以通过DMA通道快速转移。由此,ADC精准采样的工作思路如图1所示。
由转换图知,只要保证了定时器的触发速度不大于ADC的转换速度,那么定时器的注入触发ADC转换就能够及时的采样数据,并保证了每次采样的间隔同时,也即能够由定时器的定时触发设定出精准的采样速率。
4.软件设计
(1)ADC初始化设定
ADC转换需要基准源、输入信号、转换时钟、转换方式、转换速率、转换的分辨率、转换结果数据对齐方式等,由此选择ADC基准源设定了内部基准源,接着设定输入信号的通道,开启转换的时钟,转换方式为定时器触发的注入的转换方式,并设定了定时器内部PWM上升沿触发,转换速率设定了转换时钟的二分频,转换分辨率设定为12位,数据对齐方式为右对齐。
(2)定时器初始化设定
定时器初始化需要时钟、计数方式、内部Trig频率及咱空比等,这里我们只需要内部PWM的频率以及上升沿能够有效触发ADC转换即可,并且PWM的频率可以随时修改。
(3)DMA初始化设定
DMA数据转移涉及DMA通道的选择、数据的转移地址、数据缓存大小等,这里只要选对相应的ADC对应的DMA通道即可。
程序流程见图2。
ADC定时采样ADC初始化设置代码如下:
ADC_InitTypeDef ADC_ACCInit;
//定义结构体参数ADC_ACCInit
ADC_ACCInit.ADC_Resolution=ADC_Resolution_12b;
//设置ADC分辨率为12位;
ADC_ACCInit.ADC_ScanConvMode=DISABLE;
//ADC非扫描模式
ADC_ACCInit.ADC_ContinuousConv-Mode=DISABLE;
//ADC非连续转换
ADC_ACCInit.ADC_ExternalTrigConv-Edge=ADC_ExternalTrigConvEdge_Rising;
//ADC转换由Trig上升沿触发,也即定时器触发的
ADC_ACCInit.ADC_ExternalTrigConv=
ADC_ExternalTrigConv_T8_CC1;
//设置Trig产生的源为定时器8通道1
图1 注入转换图
图2 程序设计流程
ADC_ACCInit.ADC_DataAlign=ADC_DataAlign_Right;
//ADC转换数据对齐方式为右对齐
ADC_Init(ADC3,&ADC_ACCInit);
//初始化ADC参数
ADC_RegularChannelConfig(ADC3,ADC_Channel_12,1,ADC_SampleTime_3Cycles);
//选择ADC信号输入通道
ADC_DMARequestAfterLastTransferC md(ADC3,ENABLE);
//使能DMA数据快速转移
ADC_DMACmd(ADC3,ENABLE);
//使能ADC转换数据的DMA请求
ADC_ExternalTrigInjectedConvConf ig(ADC3,ENABLE);
//使能外部Trig触发源
ADC_ExternalTrigInjectedConvEdge Config(ADC3,ENABLE);
//使能外部Trig边沿触发
ADC_InjectedDiscModeCmd(ADC3,ENA BLE);
//使能ADC为注入转换模式
ADC_Cmd(ADC3,ENABLE);
//使能ADC
定时器初始化以及DMA初始化比较简单就不一一列出。
5.结语
STM32F407VG模数转换器ADC具有的注入转换方式,可以配合自身的定时器TIM和快速数据转移的DMA请求进行精准的信号采样。本文对这三个资源进行分析的基础上给出了实现模数转换的精准采样的方案。为需要精准采样速率的数字信号处理过程提供了可靠保证。
[1]STM3240G-MCU2.RM0090 Reference manual.2011.
[2]STM32F10xxx参考手册.2009.