AD7606 STM32F4驱动并添加FFT功能

AD7606 STM32F4驱动并添加FFT功能

选择AD7606的原因

​ 最近在准备电赛,由于主要做的是信号题部分,所以说对ADC的运用是必不可少的了,stm32f4系列的ADC已经非常强大了,有最小0.71uS的转换时间,可选的6位,8位,10位,12位分辨率,参考电压在2.4-3.3v之间。但是作为一个单极性的ADC,在处理信号的过程中需要有额外的电路来抬升电压等。而对于模拟电路来说,越多的组件就会带来更多的噪声,并且也会给数据的处理带来麻烦,同时12位的分辨率在精度要求高的题目中显得有些不够用。所以我去找了一个16位的双极性的adc–AD7606。

​ 当然有更高精度的ADC,比如TI家的ADS1256、ADI的AD7190都是24位的ADC。但是这些ADC的采样速率都非常低,对于低频的信号采样效果非常好,但是由于我们有做FFT的需求,所以就择中选择的AD7606。

驱动移植

从标准库移植到HAL库

​ 由于之前偷懒使用HAL库对stm32进行开发,所以这次也打算用HAL库进行使用

​ AD7606的板子是在淘宝买的,但是店家的驱动程序是标准库开发的,所以我们要修改到HAL库使用。

​ 有一点很方便的是,原先店家的驱动很大一部分是使用寄存器直接操作的,所以我只需要将delay这个函数改成HAL_delay就可以了。

从F1移植到F4

​ 店家给的是STM32F103的驱动,但是我们有做FFT的需求,所以自然是自带FPU的F4系列更合胃口。

​ 前面说到了店家大多数是用寄存器进行操作的,我要修改的也就是寄存器的部分了。

​ 主要是F4和F1在设置引脚高低电平时的不同。

​ F1设置GPIO高低电平的操作是这样的

#define LED_PIN GPIO_PIN_4                      //定义GPIO引脚
#define LED_PORT GPIOA

#define SET_LOW() LEN_PORT->BRR = LED_PIN       //设置低电平
#define SET_HIGH() LED_PORT->BSRR = LED_PIN     //设置高电平

​ 这样,如果我们想要对LED进行操作,只需要调用

SET_LOW();
SET_HIGH();

​ 这两个函数就可以了,这种方式的调用也比用函数更加快捷。

​ 但是,F4的操作就有所不同,F4设置引脚高低是这样的

#define LED_PIN GPIO_PIN_4                      //定义GPIO引脚
#define LED_PORT GPIOA

#define SET_LOW() LEN_PORT->BSRR = LED_PIN << 16U      //设置低电平
#define SET_HIGH() LED_PORT->BSRR = LED_PIN            //设置高电平

​ 所以我们需要将驱动中的所有操作都改为F4的类型,具体部分如下

#define AD_CS_LOW()     		AD_CS_GPIO_PORT->BSRR = AD_CS_PIN << 16U
#define AD_CS_HIGH()     		AD_CS_GPIO_PORT->BSRR = AD_CS_PIN

#define AD_RESET_LOW()			AD_RESET_GPIO_PORT->BSRR = AD_RESET_PIN << 16U
#define AD_RESET_HIGH()			AD_RESET_GPIO_PORT->BSRR = AD_RESET_PIN

#define AD_CONVST_LOW()			AD_CONVST_GPIO_PORT->BSRR = AD_CONVST_PIN << 16U
#define AD_CONVST_HIGH()		AD_CONVST_GPIO_PORT->BSRR = AD_CONVST_PIN

#define AD_RANGE_5V()			AD_RANGE_GPIO_PORT->BSRR = AD_RANGE_PIN << 16U
#define AD_RANGE_10V()			AD_RANGE_GPIO_PORT->BSRR = AD_RANGE_PIN

#define AD_OS0_0()				AD_OS0_GPIO_PORT->BSRR = AD_OS0_PIN << 16U
#define AD_OS0_1()				AD_OS0_GPIO_PORT->BSRR = AD_OS0_PIN

#define AD_OS1_0()				AD_OS1_GPIO_PORT->BSRR = AD_OS1_PIN << 16U
#define AD_OS1_1()				AD_OS1_GPIO_PORT->BSRR = AD_OS1_PIN

#define AD_OS2_0()				AD_OS2_GPIO_PORT->BSRR = AD_OS2_PIN << 16U
#define AD_OS2_1()				AD_OS2_GPIO_PORT->BSRR = AD_OS2_PIN

#define AD_MISO_LOW()		AD_SPI_MISO_GPIO_PORT->BSRR  = AD_SPI_MISO_PIN << 16U
#define AD_MISO_HIGH()	    AD_SPI_MISO_GPIO_PORT->BSRR = AD_SPI_MISO_PIN

#define AD_SCK_LOW()		AD_SPI_SCK_GPIO_PORT->BSRR  = AD_SPI_SCK_PIN << 16U
#define AD_CSK_HIGH()		AD_SPI_SCK_GPIO_PORT->BSRR = AD_SPI_SCK_PIN

总结

​ 至此,对驱动的修改就完成了,总的来说,AD7606的驱动修改还算轻松,没有很多的坑,操作也非常方便。相比较AD7606,AD9910的坑要大的多,整了半天才搞明白为什么错了,后面文章也会介绍AD9910的驱动移植。

​ 能使用ADC只是第一步,对采集到的数据进行处理才是关键,后面也会有一片专门的文章介绍如何对AD7606采集到的数据用FFT来进行分析,欢迎大家连续关注啦。

​ 如果有写的不好的地方或者其他问题,欢迎在评论区指正

​ 谢谢观看~

具体的代码我放在了自己的github上,有兴趣的同学可以去下载看看,这个工程里面包括了之后会有的AD9910驱动的移植和FFT处理数据的部分。
工程源码 github

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于AD9959的STM32F407的HAL驱动程序,你可以参考以下步骤进行配置和使用: 1. 确保你已经安装了STM32CubeMX和STM32CubeF4软件包。 2. 打开STM32CubeMX并创建一个新的工程。 3. 在"Pinout & Configuration"选项卡中选择你的MCU型号(STM32F407)并配置引脚。 4. 在"Middleware"选项卡中找到SPI外设,并使能它。 5. 在"Configuration"选项卡中配置SPI外设的参数,包括时钟极性、时钟相位、数据位宽等。 6. 保存配置并生成代码。 7. 打开生成的工程,在"Core"文件夹下找到"stm32f4xx_hal_msp.c"文件,添加以下代码以初始化SPI外设: ```c void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hspi->Instance==SPIx) // SPIx为你使用的SPI外设,如SPI1、SPI2等 { /* 配置SPI引脚 */ SPIx_CLK_ENABLE(); SPIx_SCK_GPIO_CLK_ENABLE(); SPIx_MISO_GPIO_CLK_ENABLE(); SPIx_MOSI_GPIO_CLK_ENABLE(); GPIO_InitStruct.Pin = SPIx_SCK_PIN | SPIx_MISO_PIN | SPIx_MOSI_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = SPIx_AF; HAL_GPIO_Init(SPIx_GPIO_PORT, &GPIO_InitStruct); } } ``` 8. 在需要使用AD9959的文件中,包含"stm32f4xx_hal.h"头文件,并添加以下代码以初始化AD9959: ```c #define AD9959_SPI_HANDLE hspi1 // 替换hspi1为你使用的SPI外设的句柄 void AD9959_Init() { // 在这里编写AD9959的初始化代码 } ``` 9. 根据AD9959的数据手册,编写相应的初始化代码,包括发送配置命令、设置频率、相位等。 10. 调用`AD9959_Init()`函数进行初始化,然后就可以使用AD9959了。 这是一个大致的步骤,具体的配置和代码实现可能会根据你的具体需求和硬件连接方式有所不同。希望这些信息能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值