ArduinoMEGA2560驱动AD7606模块 八路同步采样AD (16位并行数据传输)

1.AD7606模块

淘宝购买的AD7606模块,如下图所示。该模块网上找了很久都没有找到例程。干脆自己写一个。

根据该模块厂家提供的pdf使用说明,可以看到需要将R18电阻拆除,R23焊接1K电阻才能使AD7606工作在并行模式下。这款模块默认是±10V量程,我也将其改为了±5V量程,只需将R17电阻拆除,R22焊接1K电阻即可。如我下面的实物图所示,移动了两个电阻。

下面介绍下该模块的引脚:

BUSY:忙碌线,AD7606在测量时该IO会高电平,测量完毕会低电平,因此接入arduino外部中断下降沿触发即可测量数据。

OS0、OS1、OS2:接000、001……111分别代表1次、2次……64次采样取平均输出,可以不接引脚,默认全低电平,也就是AD7606测量一次AD值后会直接输出,不会取平均再输出。

ST_A、ST_B:分别是1-4和5-8路AD的采样启动引脚,该引脚给上升沿时,即开始测量对应的通道AD,可以将ST_A和ST_B并联在一起,实现8路AD同步采样。

CS:片选位,SPI协议时使用,并行数据传输方案CS只需接地。

RD:给该引脚下降沿时,AD7606会将读好了的8路AD数据并行输出。

DB0~DB15:16位并行数据接口。

RST:复位引脚,模块上电后必须给一个50ns以上高电平脉冲复位,否则测量数据有概率不稳定。

FRST:可不接,信号提示作用。

时序图如下图:

首先arduino给ST_A和ST_B一个上升沿信号,AD7606会将BUSY置高电平,代表正在测量AD。随后arduino检测BUSY的下降沿,下降沿到来时,说明AD测量完毕。此时arduino可以读取AD数据了,arduino给RD引脚一个下降沿信号,随后马上读取DB0~DB15的16位数据保存,该数据为第一通道的AD1数据。读完AD1数据后将RD给回高电平,延时一段时间后RD给下降沿信号,在读取 DB0~DB15的第二通道的AD2数据。以此类推,直至读完8个通道的数据即完成。

2.ArduinoMEGA2560单片机

由于需要16个数据IO和至少6个控制IO,因此arduinoUNO R3单片机IO口不够用了。选用IO口更多的ArduinoMEGA2560。该单片机有4个外部中断,分别是引脚D2、D3、D20、D21,本次例程只用D2引脚——外部中断0。

3.接线:

AD7606——>ArduinoMEGA2560

+3.3V——>+5V(这里特别注意要接入5V供电,保持单片机和模块逻辑电平一致。只有stm32才需要接3.3V供电)

GND——>GND

BUSY——>D2

OS0——>D3(可不接)

OS1——>D4(可不接)

OS2——>D5(可不接)

ST_A、ST_B——>D6(该引脚需要同时接ST_A和ST_B)

CS——>D7(可接GND)

RD——>D8

RST——>D9

DB0——>D22

……此处省略14个接线

DB15——>D37

4.代码

//AD7606并行16位数据传输ArduinoMEGA2560例程
#define BUSY 2 //该接口接arduino外部中断IO,MEGA2560必须为D2、D3、D20、D21其中之一引脚
#define OS0 3 //用于设置采样率
#define OS1 4
#define OS2 5
#define ST_AB 6 //共同接入ST_A和ST_B中,实现1-4和5-8通道同步采样,如只用4个以下通道,可接ST_A或ST_B其中之一。
#define CS 7 //可永久接GND
#define RD 8 //读取控制数据位,下降沿时可读并行数据
#define RST 9 //复位IO
#define DB0 22 //16个数据位
#define DB1 23
#define DB2 24
#define DB3 25
#define DB4 26
#define DB5 27
#define DB6 28
#define DB7 29
#define DB8 30
#define DB9 31
#define DB10 32
#define DB11 33
#define DB12 34
#define DB13 35
#define DB14 36
#define DB15 37
//FRST可不接

//8通道AD值,short int是16位数,取值-32768~32768
short int AD[8] = {};

void setup() {
  Serial.begin(9600);
  pinMode(BUSY,INPUT);
  attachInterrupt(0,ReadAD7606,FALLING);//pin2
  pinMode(OS0,OUTPUT);
  pinMode(OS1,OUTPUT);
  pinMode(OS2,OUTPUT);
  pinMode(ST_AB,OUTPUT);
  pinMode(CS,OUTPUT);
  pinMode(RD,OUTPUT);
  pinMode(RST,OUTPUT);
  digitalWrite(RST,HIGH);delay(1);digitalWrite(RST,LOW);
  pinMode(DB0,INPUT);pinMode(DB1,INPUT);pinMode(DB2,INPUT);pinMode(DB3,INPUT);
  pinMode(DB4,INPUT);pinMode(DB5,INPUT);pinMode(DB6,INPUT);pinMode(DB7,INPUT);
  pinMode(DB8,INPUT);pinMode(DB9,INPUT);pinMode(DB10,INPUT);pinMode(DB11,INPUT);
  pinMode(DB12,INPUT);pinMode(DB13,INPUT);pinMode(DB14,INPUT);pinMode(DB15,INPUT);
  digitalWrite(OS0,LOW); //设置为1次平均采样
  digitalWrite(OS1,LOW);
  digitalWrite(OS2,LOW);
  digitalWrite(CS,LOW); //永久低电平
  digitalWrite(RD,HIGH); //默认高电平,不读数据
  digitalWrite(ST_AB,HIGH); //默认高电平,上升沿开启测量AD
}

void ReadAD7606(void) //读取AD值中断服务函数
{
  for(int i=0;i<8;i++) //需要更高的采样速度时,此处可以不用for,将for循环里的内容自行复制多7个,改i的值为0到7即可。
  {
    digitalWrite(RD,LOW); //拉低RD,开始读数据
    delayMicroseconds(1);
            AD[i]=digitalRead(DB15)*32768+digitalRead(DB14)*16384+digitalRead(DB13)*8192+digitalRead(DB12)*4096+digitalRead(DB11)*2048+digitalRead(DB10)*1024+digitalRead(DB9)*512+digitalRead(DB8)*256+digitalRead(DB7)*128+digitalRead(DB6)*64+digitalRead(DB5)*32+digitalRead(DB4)*16+digitalRead(DB3)*8+digitalRead(DB2)*4+digitalRead(DB1)*2+digitalRead(DB0);

    digitalWrite(RD,HIGH); //第一通道数据读取完毕,拉高RD,随后拉低读第二通道数据
    delayMicroseconds(1);
  }
}

void loop() {
  digitalWrite(ST_AB,LOW); //低电平,为上升沿信号做准备
  delay(1); //200KHZ采样模式下,此处必须大于25ns,ATmega系列单片机时钟速度无法支持该采样速度
  digitalWrite(ST_AB,HIGH); //产生上升沿,等待BUSY下降沿进入中断读取数据
  for(int i=0;i<8;i++)
  {
    Serial.print((float)AD[i]*5.0/32767.0); //-32768~32768对应-5V~5V
    Serial.print("V,");
  }
  Serial.println();
  delay(100);
}

5、运行结果

按顺序连接好杜邦线后,代码烧录进单片机,随后打开arduinoIDE自带的串口监视器,即可看见发送来的测量数据,频率为一秒一次(可更改loop函数内的delay(1000);来实现更高速度测量)。这里只测试了5V、3.3V和0V的测量结果,数据都比较精准。但条件原因没有测试负压。

该例程仅初步验证,目前没有发现其他问题,有问题可以评论留言哦~

实物接线图
实物接线图
运行结果

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
AD7606是一款高分辨率数据采集芯片,具有16并行输入通道,适用于各种测量应用。FPGA是一种可编程逻辑器件,可以实现数字电路中的逻辑功能。在AD7606数据读取过程中,可以利用FPGA进行并行数据读取。 AD7606与FPGA的连接可以采用并行通信方式。当进行数据读取时,AD7606通过其16个通道同时传输数据到FPGA。FPGA通过对这些数据进行并行读取,并进行进一步处理和存储。 在使用FPGA进行AD7606数据读取的Verilog代码中,需要定义AD7606与FPGA之间的通信接口。这可以通过FPGA上的GPIO引脚与AD7606的控制引脚相连来实现。在代码中,需要定义适当的信号协议和数据处理算法。 首先,需要对AD7606进行初始化,并设置相应的工作模式和采样率。然后,在读取数据之前,需要发送读取命令到AD7606,并通过GPIO引脚将其与FPGA进行连接。 接下来,需要在FPGA中设计一个状态机来控制数据的读取过程。通过适当的时序控制,可以确保在AD7606数据有效时,FPGA能够准确地读取并存储数据。FPGA可以通过并行读取数据,并通过FIFO缓存或存储器来存储这些数据。 同时,还需要设计适当的数据处理算法,对AD7606采集到的数据进行处理和分析。这可以根据具体应用来确定,例如进行数字滤波、数据压缩、错误检测等。 总的来说,AD7606-FPGA并行数据读取可以通过合适的Verilog代码实现。这种方式可以充分利用AD7606并行数据传输特性,并通过FPGA对数据进行进一步处理和存储,实现高效的数据采集应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Angle恋影

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

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

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

打赏作者

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

抵扣说明:

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

余额充值