摘要:目錄簡介使用說明編程說明實驗說明完整的參考程序致謝感謝宮同學為本次實驗提供器件和意見。簡介是公司出品的數字電位器,同時帶有非易失性存儲器,其使用通信。
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; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/124047.html
摘要:開關旋鈕電位器的實驗視頻已經購買開發版的同學開始上課來一場緊張刺激的之旅吧前言開發工具的下載安裝使用都很簡單我這里就不贅述了附上官方的說明跟著步驟來十分鐘搞定相關連接下載官方為什么成為開發函數 ...
摘要:綜合諸多考慮與相應調研,我們希望能夠制作出一款宿舍升降機為同學們提供更方便安全的上下床方式。摘要本設計采用開發板作為主控,結合壓力傳感器紅外避障傳感器電機驅動模塊實現了一個可以自動升降自動停止自動調速的宿舍升降機模型系統。 (第一次寫博客,記錄下自己大一時做的一個課設,如有不妥之處,還望多...
摘要:這部分就是我之前分享過很多的單片機部分,具體可以參考專欄物聯網設備的控制單元核心就是,也就是常說的單片機。對于物聯網設備,根據開發環境想制造的設備以及經驗的不同,選擇不同的控制芯片也就至關重要。 這部分就是我之前分享過很多的單片機部分,具體可以參考專欄 https://blog.csdn.n...
閱讀 1382·2021-11-22 09:34
閱讀 2587·2021-11-12 10:36
閱讀 1119·2021-11-11 16:55
閱讀 2332·2020-06-22 14:43
閱讀 1473·2019-08-30 15:55
閱讀 1986·2019-08-30 15:53
閱讀 1771·2019-08-30 10:50
閱讀 1229·2019-08-29 12:15