资讯专栏INFORMATION COLUMN

Arduino--数字电位器AD5252/1的使用

HelKyle / 1099人阅读

摘要:目录简介使用说明编程说明实验说明完整的参考程序致谢感谢宫同学为本次实验提供器件和意见。简介是公司出品的数字电位器,同时带有非易失性存储器,其使用通信。


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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124047.html

相关文章

  • 第一课:超级hello Arduino.使用多种知识串联一个入门小项目,很适合初学第一课哟.

    摘要:开关旋钮电位器的实验视频已经购买开发版的同学开始上课来一场紧张刺激的之旅吧前言开发工具的下载安装使用都很简单我这里就不赘述了附上官方的说明跟着步骤来十分钟搞定相关连接下载官方为什么成为开发函数 ...

    philadelphia 评论0 收藏0
  • 物联网应用技术课程设计————宿舍升降机模型

    摘要:综合诸多考虑与相应调研,我们希望能够制作出一款宿舍升降机为同学们提供更方便安全的上下床方式。摘要本设计采用开发板作为主控,结合压力传感器红外避障传感器电机驱动模块实现了一个可以自动升降自动停止自动调速的宿舍升降机模型系统。 (第一次写博客,记录下自己大一时做的一个课设,如有不妥之处,还望多...

    Caicloud 评论0 收藏0
  • 【物联网】14.物联网设备控制器选择 - MCU(单片机)

    摘要:这部分就是我之前分享过很多的单片机部分,具体可以参考专栏物联网设备的控制单元核心就是,也就是常说的单片机。对于物联网设备,根据开发环境想制造的设备以及经验的不同,选择不同的控制芯片也就至关重要。 这部分就是我之前分享过很多的单片机部分,具体可以参考专栏 https://blog.csdn.n...

    UCloud 评论0 收藏0
  • 单片机入门指南

    摘要:单片机入门指南本文基于常神文章基础上将单片机入门部分进行细化尽可能细节做到可实施性先引用一下常神的文章首先假设大家已经对高中物理的电路部分有所了解。单片机,如,是一种根据程序控制引脚高低电平的可编程器件,有些场合又将这种行为称作嵌入式。 ...

    nevermind 评论0 收藏0
  • Arduino(五)——呼吸灯

    摘要:这节的主要内容为模拟输出,内容是比较简单的,我们只要注意一个函数也就是数字口输出函数,数字口标注了的口可使用该函数,表示,,,,,,表示为。这么我们有什么用呢我们可以把他用于电机调速或者音乐播放。 这节的主要内容为AO模拟输出,内容是比较简单的,我们只要注意一个函数 也就是 analogWr...

    RobinTang 评论0 收藏0

发表评论

0条评论

HelKyle

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<