AD7764

一、模块特点

  • 24位AD采集
  • SPI输出
  • 采样速率可调
  • 可通过$\overline{\rm{SYNC}}$引脚结合多个AD7764实现48、72等精度的采集
  • 提供差分输入(可以选择不用他的差分输入)
  • 超程报警(overrange引脚)

二、模块简介

  • 78.125K输出,115db信噪比。
  • 312K输出,109db信噪比。
  • 输出速率由外部时钟控制。
  • 基于奈奎斯特采样的全频带的FIR滤波器,防止出现混叠失真(采样出来的信号可以根据采样定理直接恢复成原信号) ,笔者暂时用不上此功能。
  • 提供的参考电压决定了输出范围,例如4V参考电压,输入电压范围为$\pm 3.2768V$

三、模块外部电路配置方案

  • 方案一、参考数据手册图37,将获取到的信号输入到芯片内提供的差分放大器中,再将差分放大器输出的信号输入到调制器中。
    ![参考电路](figure37.jpg)
  • 方案二、使用自己设计的差分放大器,直接输入到芯片内部的调制器中,将$V_{in}A \pm​$和$V_{out}A \pm​$引脚悬空

四、模块-STM32控制方案

  没有找到STM32的AD7764驱动,只能自己写,内心充满的崩溃,当然是选择放弃自己写了。

4.1 实现步骤

  • SPI通信配置与测试
  • DMA传输配置与测试

4.2 SPI配置和说明

  本不打算写这部分的,但是已经一年没有写程序了,还是详细介绍,熟悉一下。

4.2.1 SPI基础介绍

  SPI的总线特点:

  • 4根总线

    | 引脚 | 功能 |
    | —— | —————————————————————————————— |
    | NSS | 片选端,当一个总线上面挂多个SPI设备时,用来选择哪个设备进行通信 |
    | CLK | 时钟脚 |
    | MISO | 数据接收脚 |
    | MOSI | 数据发送脚 |

  • 4种传输模式

    | SPI_CPOL | SPI_CPHA | 说明 |
    | ———— | ———— | ————————————————————————— |
    | 0 | 0 | 时钟CLK默认高电平,低电平写数据,上升沿传输数据。 |
    | 0 | 1 | 时钟CLK默认高电平,高电平写数据,下降沿传输数据。 |
    | 1 | 0 | 时钟信号默认低电平,高电平写数据,下降沿传输数据。 |
    | 1 | 1 | 时钟信号默认低电平,低电平写数据,上升沿传输数据。 |

  • 2种传输传输方向

    1、MSB:高位在前

    2、LSB:低位在前

  • 2中模式

    1、主模式

    2、从模式

    注:像SPI、IIC、单总线都是主从模式,适合设备和模块通信。Usart无主从模式,适合两个设备间通信。

4.2.2 STM32F103的SPI配置

  以SPI 1位例,只有一个设备,多个设备的话需要软件控制NSS片选脚,这里采用硬件控制NSS,因为方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void AD7764_SPI_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTB时钟使能
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI1时钟使能

GPIO_InitStructure.GPIO_Pin = SPI1_NSS | SPI1_SCK | SPI1_MISO | SPI1_MOSI;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI1_PORT, &GPIO_InitStructure);//初始化GPIOA

GPIO_SetBits(SPI1_PORT,SPI1_NSS | SPI1_SCK | SPI1_MISO | SPI1_MOSI); //PB13/14/15上拉

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; //只有一个设备,NSS让硬件自己控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式,现在还不会生效
SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

SPI_Cmd(SPI1, ENABLE); //使能SPI外设
}

4.3 DMA配置

4.3.1 DMA简介

  前面已有介绍

4.3.2 STM32F103的DMA配置
4.3.3 在中断实现双缓存区功能

4.4 测试

4.4.1 SPI通信测试
4.4.2 SPI+DMA测试
4.4.3 双缓存区测试

4.5 总结

-------------本文结束感谢您的阅读-------------
0%