ad5241数字电位器手册_arduino用电位器控制流水灯「建议收藏」

ad5241数字电位器手册_arduino用电位器控制流水灯「建议收藏」目录1.AD5252简介1.AD5252简介AD5252/1是ADI公司出品的数字电位器,同时带有非易失性存储器(NVM),其使用i2c通信

致谢:感谢宫同学为本次实验提供器件和意见。

1.AD5252简介

AD5252/1是ADI公司出品的数字电位器,同时带有非易失性存储器(NVM),其使用i2c通信。这个系列的芯片有两个型号:

  1. AD5251: 双电位器,64位。
  2. 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引脚(Arduino的模拟采样口),这主要是用分压法计算电位器调节的电阻。

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; 
}

注:有人整篇搬运本文至柚子社区,请大家注意甄别。
本人的博客会在实践中不断更新,有问题请指正。
作者:CSDN知之至知
如需转载,请标明出处。

今天的文章ad5241数字电位器手册_arduino用电位器控制流水灯「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87405.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注