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

本文介绍了使用STM32F4通过GPIO、定时器TIM8和DMA高速读取AD9226数据的方法。通过配置GPIO、定时器和DMA,实现数据的高速读取,同时利用PWM和UPDATE信号同步读取过程。然而,在实际应用中,发现当采样率较高时存在波形跳变问题,降低采样率后问题消失。最高稳定采样率受限于系统配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

方案介绍

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

图形化界面配置

引脚配置

这里使用GPIOD,需要注意的是,所用的引脚要来自同一个端口。
在这里插入图片描述
在这里插入图片描述

定时器配置

使用TIM8的原因

在STM32F4里,可以当DMA的触发源同时频率可以达到系统主频的定时器只有高级定时器(TIM8和TIM1)
在这里插入图片描述

基本配置

让TIM8产生上溢事件的的频率为主频的十分之一。
开启PWM输出,为ADC提供时钟。
在这里插入图片描述

PWM的配置

PWM mode2:让PWM上升沿的时候产生一次上溢事件
Pulse = 5:产生方波
Fast Mode :加快输出PWM波的引脚的电平反转速度
在这里插入图片描述

DAM配置

在这里插入图片描述

程序设计

官方函数的修改

在这里插入图片描述
需要注意的是,这里开启DMA的函数(HAL_TIM_DMABurst_MultiReadStart)被我改过
直接用是用不了的

函数里面我改了红框的位置,那里原本放的是一个定时器的寄存器地址。
在这里插入图片描述

中断回调

DMA中断时默认开启的
DMA中断:当内存里的目标数组装满之后触发
在这里插入图片描述
这里用DMA中断定义一个标志位的目的是:当目标数组装满之后,停止继续读取。
在这里插入图片描述

主函数

先检测标志位,看数据读取是否完成。若读取完成,则处理数据。数据处理完之后,再重新打开DMA,开始下一轮数据读取,同时清空自定义的标志位。
在这里插入图片描述

接线

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

效果和问题

波形跳变问题

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

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

最大采样率

我试过将分频改为9,即采样率为168M的九分之一,依然可以工作,但偶尔会有漏采的情况。
再高就会工作不稳定。如下图
在这里插入图片描述

AD9226是一款高性能、低功耗的模拟到数字转换器(A/D转换器),它由Analog Devices生产。这款器件特别适用于需要高分辨率、快速转换速度以及低噪声特性的应用,例如数据采集系统、无线通信设备等。 ### AD9226的主要特点: 1. **转换精度**:AD9226提供14位分辨率,可以精确捕捉微小的信号变化。 2. **转换速度**:它的转换时间为20μs,在采样率高达2 MSPS(每秒兆次)的情况下依然保持高质量的数据转换。 3. **电源效率**:该器件设计有低功耗模式,能够在不影响性能的前提下降低功耗。 4. **温度稳定性**:内置了温度补偿机制,能够保证在不同工作环境下的稳定性能。 5. **灵活性**:支持多种输入配置选项,包括单端和差分输入,适应各种应用场景需求。 ### AD9226STM32的集成: 在将AD9226与基于STM32的微控制器结合使用时,通常会采用I2C或SPI总线接口进行通信。STM32拥有丰富的外设资源,如I2C、SPI等,可以直接连接到AD9226控制其操作。 #### 集成步骤示例: 1. **硬件连接**:通过SPI总线将AD9226连接到STM32,包括数据线(MOSI)、时钟线(SCK)、片选线(CS)和复位线(SSR)等。 2. **初始化配置**:编写STM32固件程序,设置SPI总线的操作模式、波特率等参数,并通过命令或寄存器配置AD9226的工作状态,比如选择转换速率、触发模式等。 3. **读取数据**:程序控制STM32发送指令给AD9226启动转换过程,并等待转换完成。之后通过指定的地址从ADC中读取出转换后的数字数据。 4. **数据分析**:将读取到的数字数据转化为实际的电压值或其他所需的信息,进行进一步处理或显示。 ### 应用场景: - 数据采集系统:在传感器网络、工业自动化等领域收集并数字化物理世界的信号。 - 无线通信设备:用于接收和解码无线信号,进行信道检测、信号分析等工作。 ### 相关问题: 1. **如何优化AD9226STM32之间的通信延迟?** 2. **在哪些条件下选择使用SPI而非I2C接口与AD9226通信?** 3. **遇到数据错误或异常情况时,如何调试AD9226STM32系统的交互?**
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森林344

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值