当前位置:首页 » 《随便一记》 » 正文

Arduino--数字电位器AD5252/1的使用_知之至知的博客

14 人参与  2022年05月18日 09:27  分类 : 《随便一记》  评论

点击全文阅读


目录

  • 1.AD5252简介
  • 2.使用说明
  • 3.编程说明
  • 4.实验说明
  • 5.完整的参考程序

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

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。
芯片的内部结构图:
在这里插入图片描述
芯片引脚图:
在这里插入图片描述

引脚编号引脚名称功能
3wp写入保护,高电平有效
2,11AD0,AD1设置芯片地址
4,5,6W1,B1,A1电位器1
12,13,14W3,B3,A3电位器3
7,9SDA,SCLi2c接口
1VDD电源
10,8DGND,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; 
}

点击全文阅读


本文链接:http://zhangshiyu.com/post/40347.html

设置  寄存器  电阻  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1