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的测量结果,数据都比较精准。但条件原因没有测试负压。
该例程仅初步验证,目前没有发现其他问题,有问题可以评论留言哦~