目录
- 1.AD5252简介
- 2.使用说明
- 3.编程说明
- 4.实验说明
- 5.完整的参考程序
致谢:感谢宫同学为本次实验提供器件和意见。
1.AD5252简介
AD5252/1是ADI公司出品的数字电位器,同时带有非易失性存储器(NVM),其使用i2c通信。这个系列的芯片有两个型号:
- AD5251: 双电位器,64位。
- AD5252: 双电位器,256位。
AD5251只支持50 kΩ。 AD5252有1 kΩ, 10 kΩ, 50 kΩ, 100 kΩ可选。
AD5252/1:
单电源供电: 2.7 V to 5.5 V 。
双电源供电: ±2.25 V to ±2.75 V。
使用环境: –40°C to +105°C。
芯片的内部结构图:
芯片引脚图:
引脚编号 | 引脚名称 | 功能 |
---|---|---|
3 | wp | 写入保护,高电平有效 |
2,11 | AD0,AD1 | 设置芯片地址 |
4,5,6 | W1,B1,A1 | 电位器1 |
12,13,14 | W3,B3,A3 | 电位器3 |
7,9 | SDA,SCL | i2c接口 |
1 | VDD | 电源 |
10,8 | DGND,VSS | 数字地,模拟地,一般把它连到一起 |
2.使用说明
在使用时最需要注意的是AD5252系列的芯片需要在SDA,SCL接上拉电阻才可以正常通信,我使用的测试电路图如下:
SDA,SCL接Arduino uno 的i2c接口,wp接13脚,A0,A1,接对应的A0,A1引脚。
3.编程说明
首先设置ad5252的地址:
AD0,AD1设置地址,HIGH对应1.LOW对应0。在这两个引脚悬空时的默认地址为0x2D。
在执行写入操作时,wp要置高。
写操作指令:
读操作指令:
主要API
void res_set(int date, int chal); //设置电阻值
unsigned int red_res(int chal); //读取设置电阻值
unsigned int red_eem(int chal); //读寄存器
void set_eem(int date, int chal); //写寄存器
4.实验说明
实验采用1K的AD5252
这个程序可以通过串口设置电阻值,将串口设置的值同时赋值给两个电位器,同时将设置值写入EEMEM4(对应程序的1)。
res_1是读取的设置值,resl_read是通过AD采样计算的电阻,相当于实际测的电阻。设置值和真实值大约会有75欧的差值,这个差值是滑片的电阻,这里差了60欧。
5.完整的参考程序
#include<Wire.h>
#define Addr 0x2D //AD5252默认地址
#define wp 13 //写入接保护引脚
#define AD5252_EE_RDAC (1 << 5) //读写emm辅助计算
void res_set(int date, int chal);
unsigned int red_res(int chal);
unsigned int red_eem(int chal);
void set_eem(int date, int chal);
void setup()
{
//i2c接口初始化
Wire.begin();
//串口初始化,波特率9600
Serial.begin(9600);
res_set(0, 1);
delay(100);
res_set(0, 2);
set_eem(128, 1);
set_eem(64, 11);
}
void loop()
{
if (Serial.available() > 0)
{
int value = Serial.parseInt(); //获取串口输入的整数
if ( value > 0 && value < 256)
{
Serial.print("set value: ");Serial.println(value);
res_set(value, 1);
delay(100);
res_set(value, 2);
set_eem(value, 1);
}
else
{
if(value != 0)
Serial.println("设置值错误,设置的值大于0小于256");
}
}
float res_1 = (red_res(1) / 256.0 );
float res_2 = (red_res(2) / 256.0 );
unsigned int res1_read=analogRead(A0);
unsigned int res2_read=analogRead(A1);
double b1 = 0.0049*res1_read; //测到的电压
double res1_real = 3.2-(11/b1) ; //计算电阻
double b2 = 0.0049*res2_read; //测到的电压
double res2_real = 3.2-(11/b2) ; //计算电阻
// Output data to serial monitor
unsigned int red_eem1 = red_eem(1);
unsigned int red_eem11 = red_eem(11);
Serial.print("eem1: ");Serial.println(red_eem1);
Serial.print("eem11: ");Serial.println(red_eem11);
Serial.print("res_1: ");Serial.print(res_1);Serial.print(" K;");Serial.print("res1_read: ");Serial.print(res1_real);Serial.println(" K");
Serial.print("res_2: ");Serial.print(res_2);Serial.print(" K;");Serial.print("res1_read: ");Serial.print(res2_real);Serial.println(" K");
delay(1000);
}
/*
功能: ad5252电阻设置函数
输出参数: date设置的电阻值 0 -- 255
chal = 1 --> RDAC1
chal = 2 --> RDAC3
*/
void res_set(int date, int chal)
{
int channel;
if (chal == 1)
{
channel = 0x01;
}
if (chal == 2)
{
channel = 0x03;
}
digitalWrite(wp,HIGH); //pin2 always low
delay(100);
// 开始i2c传输
Wire.beginTransmission(Addr);
// 设置通道
Wire.write(channel);
// Input resistance value, 0x80(128)
Wire.write(date);
// 停止i2c传输
Wire.endTransmission();
delay(100);
digitalWrite(wp,LOW);
}
/*
功能: ad5252电阻设置值读取函数
输出参数:
chal = 1 --> RDAC1
chal = 2 --> RDAC3
*/
unsigned int red_res(int chal)
{
unsigned int data;
int channel;
if (chal == 1)
{
channel = 0x01;
}
if (chal == 2)
{
channel = 0x03;
}
//开始i2c传输
Wire.beginTransmission(Addr);
//选择寄存器
Wire.write(channel);
//停止i2c通信
Wire.endTransmission();
//传输1位读命令
Wire.requestFrom(Addr, 1);
// Read 1 byte of data
if (Wire.available() == 1)
{
data = Wire.read();
}
return data;
}
/*
功能: 写入数据到寄存器
输出参数:
date ——> 数据
chal 1到11 对应 eem4到eem15
*/
void set_eem(int date, int chal)
{
int channel;
switch(chal)
{
case 1: channel = 0x04;break;
case 2: channel = 0x05;break;
case 3: channel = 0x06;break;
case 4: channel = 0x07;break;
case 5: channel = 0x08;break;
case 6: channel = 0x0A;break;
case 7: channel = 0x0B;break;
case 8: channel = 0x0C;break;
case 9: channel = 0x0D;break;
case 10: channel = 0x0E;break;
case 11: channel = 0x0F;
}
digitalWrite(wp,HIGH); //pin2 always low
delay(100);
//开始i2c传输
Wire.beginTransmission(Addr);
//设置寄存器
Wire.write(AD5252_EE_RDAC|channel);
Wire.write(date);
//停止i2c
delay(100);
Wire.endTransmission();
delay(100);
digitalWrite(wp,LOW);
}
/*
功能: 读寄存器数据
输出参数:
chal 1到11 对应 eem4到eem15
*/
unsigned int red_eem(int chal)
{
unsigned int data;
int channel;
switch(chal)
{
case 1: channel = 0x04;break;
case 2: channel = 0x05;break;
case 3: channel = 0x06;break;
case 4: channel = 0x07;break;
case 5: channel = 0x08;break;
case 6: channel = 0x0A;break;
case 7: channel = 0x0B;break;
case 8: channel = 0x0C;break;
case 9: channel = 0x0D;break;
case 10: channel = 0x0E;break;
case 11: channel = 0x0F;
}
//开始i2c
Wire.beginTransmission(Addr);
//选择寄存器
Wire.write(AD5252_EE_RDAC|channel);
//停止i2c通信
Wire.endTransmission();
Wire.requestFrom(Addr, 1);
if (Wire.available() == 1)
{
data = Wire.read();
}
return data;
}