摘要:目录简介使用说明编程说明实验说明完整的参考程序致谢感谢宫同学为本次实验提供器件和意见。简介是公司出品的数字电位器,同时带有非易失性存储器,其使用通信。
AD5252/1是ADI公司出品的数字电位器,同时带有非易失性存储器(NVM),其使用i2c通信。这个系列的芯片有两个型号:
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 | 数字地,模拟地,一般把它连到一起 |
在使用时最需要注意的是AD5252系列的芯片需要在SDA,SCL接上拉电阻才可以正常通信,我使用的测试电路图如下:
SDA,SCL接Arduino uno 的i2c接口,wp接13脚,A0,A1,接对应的A0,A1引脚。
首先设置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); //写寄存器
实验采用1K的AD5252
这个程序可以通过串口设置电阻值,将串口设置的值同时赋值给两个电位器,同时将设置值写入EEMEM4(对应程序的1)。
res_1是读取的设置值,resl_read是通过AD采样计算的电阻,相当于实际测的电阻。设置值和真实值大约会有75欧的差值,这个差值是滑片的电阻,这里差了60欧。
#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
摘要:开关旋钮电位器的实验视频已经购买开发版的同学开始上课来一场紧张刺激的之旅吧前言开发工具的下载安装使用都很简单我这里就不赘述了附上官方的说明跟着步骤来十分钟搞定相关连接下载官方为什么成为开发函数 ...
摘要:综合诸多考虑与相应调研,我们希望能够制作出一款宿舍升降机为同学们提供更方便安全的上下床方式。摘要本设计采用开发板作为主控,结合压力传感器红外避障传感器电机驱动模块实现了一个可以自动升降自动停止自动调速的宿舍升降机模型系统。 (第一次写博客,记录下自己大一时做的一个课设,如有不妥之处,还望多...
摘要:这部分就是我之前分享过很多的单片机部分,具体可以参考专栏物联网设备的控制单元核心就是,也就是常说的单片机。对于物联网设备,根据开发环境想制造的设备以及经验的不同,选择不同的控制芯片也就至关重要。 这部分就是我之前分享过很多的单片机部分,具体可以参考专栏 https://blog.csdn.n...
阅读 1312·2021-11-22 09:34
阅读 2508·2021-11-12 10:36
阅读 1057·2021-11-11 16:55
阅读 2277·2020-06-22 14:43
阅读 1422·2019-08-30 15:55
阅读 1924·2019-08-30 15:53
阅读 1723·2019-08-30 10:50
阅读 1189·2019-08-29 12:15