■ 簡介
ADS1256是一款 24bit ADC轉換模塊。 ADS1256可以通過SPI進行訪問 的高精度的轉換器。它的 ADS1256 數據手冊 可以從 TI網站 查詢到。
▲ ADS1256 24bitADC模塊
下面給出了ADS1256的接口。根據ADS1256的數據手冊介紹,其中:
- 用於MCU接口的SPI接口可以包含有/CS, SCLK, DIN, DOUT
- D0 ~ D3 可以用於對外控制的數據接口。
- SYNC可以用於數據同步作用。
▲ ADS1256 的接口定義
爲了便於後期的MCU製作,製作一個6PIN的外部接口,包括有:
序號 | 符號 | 功能描述 |
---|---|---|
1 | +5V | 工作電源 |
2 | GND | 電源地 |
3 | CS | ADS1256片選端 |
4 | SCK | ADS1256時鐘 |
5 | DIN | ADS1256SPI數據入 |
6 | DOUT | ADS1256SPI數據出 |
01接口電路板1
1. 設計接口電路
使用基於STC8G1K08(SOP8)作爲控制ADS1256的與PC之間的SPI-UART的接口芯片。
▲ 實驗電路的原理圖
▲ 實驗接口電路的PCB
2.單片機軟件2
將AD1256連接到單片機STC8G1k。
▲ 將AD1256連接到單片機
-
缺省情況下D0輸出AD1256的時鐘信號
時鐘的頻率爲: 7.68MHz。
▲ AD1256輸出CLK波形
02軟件命令
UART串口命令可以參見SerialTXT的解釋子程序:
if(strcmp("hello", (char *)STD_ARG[0]) == 0)
printf("%s is ready !\r\n", VERSION_STRING);
else IFARG0("rra") {
AD1256ReadReg(0x0, 11, ucDim);
for(i = 0; i < 11; i ++) {
printf("%02bx ", ucDim[i]);
}
printf("\r\n");
} else IFARG0("setc") {
sscanf(SDA(1), "%d", &nNumber);
AD1256SetChannel((unsigned char)nNumber);
} else IFARG0("sets") {
sscanf(SDA(1), "%x", &nNumber);
AD1256SetSPS((unsigned char)nNumber);
} else IFARG0("writer") {
sscanf(SDA(1), "%x", &nNumber);
i = (unsigned char)nNumber;
sscanf(SDA(2), "%x", &nNumber);
ucByte = (unsigned char)nNumber;
AD1256WriteRegByte(i, ucByte);
} else IFARG0("rdata") {
SendChar(0);
nWaitTime = 100;
if(STD_NUM == 1) {
printf("%ld\r\n", AD1256ReadData());
} else {
sscanf(SDA(1), "%d", &nNumber);
if(STD_NUM > 2) {
sscanf(SDA(2), "%d", &nWaitTime);
}
for(j = 0; j < nNumber; j ++) {
printf("%ld ", AD1256ReadData());
if(nNumber > 1)
WaitTime(nWaitTime);
}
printf("\r\n");
}
} else IFARG0("setb") {
sscanf(SDA(1), "%x", &nNumber);
AD1256SetDIO((unsigned char)nNumber);
} else IFARG0("reset") {
AD1256Reset();
} else IFARG0("init") {
AD1256Init();
} else IFARG0("scrd") {
sscanf(SDA(1), "%x", &nNumber);
AD1256SetChannel(nNumber);
AD1256ReadData();
for(nNumber = 0; nNumber < 1000; nNumber ++) {
WaitTime(2);
if((AD1256ReadRegByte(0) & 0x1) == 0) break;
}
SendChar(0);
printf("%ld\r\n", AD1256ReadData());
}
scrd : Change Channel and read new data
rdata: Read the current channel data
03測試結果
▲ 設置電壓與AD1256輸出結果
▲ 設置電壓與AD1256輸出結果
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2020-06-30
#
# Note:
#============================================================
from headm import *
from tsmodule.tsvisa import *
from tsmodule.tsstm32 import *
dp1308open()
#------------------------------------------------------------
dp1308p25v(0)
dp1308n25v(0)
stm32cmd('reset')
time.sleep(.1)
stm32cmd('init')
setv = linspace(-5, 0, 5)
setdim = []
outdim = []
for v in setv:
if v >= 0:
dp1308p25v(v)
dp1308n25v(0)
else:
dp1308p25v(0)
dp1308n25v(-v)
time.sleep(1)
meter = meterval()
stm32cmd('rdata')
time.sleep(.05)
data = stm32memo(1)
val = data[0]
printf(val, meter)
outdim.append(val)
setdim.append(meter[0])
plt.plot(setdim, outdim)
plt.xlabel("Set(V)")
plt.ylabel("Data")
plt.grid(True)
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
※ 結論
AD1256模塊現在配置下,只能測量0~5V的電壓。其內部有2.5V參考電壓。
輸出的電壓計算公式如下:
假設讀出的數值爲:,那麼實際的電壓值爲:
▲ 設置電壓與測量電壓之間的關係
▲ 設置電壓與測量電壓之間的差別