STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)

文章目录

  • 方案介绍
  • 图形化界面配置
    • 引脚配置
    • 定时器配置
      • 使用TIM8的原因
      • 基本配置
      • PWM的配置
    • DAM配置
  • 程序设计
    • 官方函数的修改
    • 中断回调
    • 主函数
  • 接线
  • 效果和问题
    • 波形跳变问题
    • 最大采样率

这里使用的是STM32F407,主频168M。

方案介绍

我使用的是gpio作为读取AD9226数据的外设。在一般的使用中,我们都是用CPU来控制gpio输入输出,往往忽略了gpio其本身拥有很高的读写速度。如果可以绕过CPU的控制过程,直接用定时器“指挥”GPIO读取数据,那么就可以达到很高的速度。我的大概方案是:GPIO连接AD9226的数据端口,将数据存储在GPIO的寄存器中,再通过DMA将数据传入CPU。同时用一个定时器输出两路同步的时钟信号,一路(PWM)输出到外部,作为控制AD9226的读时钟;另一路(UPDATE)给内部的DMA。这样就可以使进出GPIO数据传输速率相同,最终实现数据的高速读取。

图形化界面配置

引脚配置

这里使用GPIOD,需要注意的是,所用的引脚要来自同一个端口。
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第1张图片
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第2张图片

定时器配置

使用TIM8的原因

在STM32F4里,可以当DMA的触发源同时频率可以达到系统主频的定时器只有高级定时器(TIM8和TIM1)
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第3张图片

基本配置

让TIM8产生上溢事件的的频率为主频的十分之一。
开启PWM输出,为ADC提供时钟。
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第4张图片

PWM的配置

PWM mode2:让PWM上升沿的时候产生一次上溢事件
Pulse = 5:产生方波
Fast Mode :加快输出PWM波的引脚的电平反转速度
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第5张图片

DAM配置

STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第6张图片

程序设计

官方函数的修改

STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第7张图片
需要注意的是,这里开启DMA的函数(HAL_TIM_DMABurst_MultiReadStart)被我改过
直接用是用不了的

函数里面我改了红框的位置,那里原本放的是一个定时器的寄存器地址。
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第8张图片

中断回调

DMA中断时默认开启的
DMA中断:当内存里的目标数组装满之后触发
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第9张图片
这里用DMA中断定义一个标志位的目的是:当目标数组装满之后,停止继续读取。
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第10张图片

主函数

先检测标志位,看数据读取是否完成。若读取完成,则处理数据。数据处理完之后,再重新打开DMA,开始下一轮数据读取,同时清空自定义的标志位。
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第11张图片

接线

AD9226的D11接到STM32的D0,D10接到D1·······以此类推,单片机与ADC上的引脚倒序相接。

效果和问题

波形跳变问题

下图是用AD9226开16M的采样率采集1MHz的三角波打点的波形。
一个周期大约16~17个点,采样率达到要求
在这里插入图片描述
不过在第35个点的位置上,出现了波形跳变,不管我采几次,怎么设置频率,改数组长度,都没有用

然后我降低了采样率到1M,采集频率更低的信号
在这里插入图片描述
然后波形跳变的问题就消失了
目前还没找到原因

最大采样率

我试过将分频改为9,即采样率为168M的九分之一,依然可以工作,但偶尔会有漏采的情况。
再高就会工作不稳定。如下图
STM32F4 HAL库 GPIO+DMA 控制AD9226(采样率可达16M)_第12张图片

你可能感兴趣的:(STM32,stm32,单片机,arm)