ADS1256 24位ADC模塊

 

■ 簡介


ADS1256是一款 24bit ADC轉換模塊。 ADS1256可以通過SPI進行訪問 的高精度的轉換器。它的 ADS1256 數據手冊 可以從 TI網站 查詢到。

▲ ADS1256 24bitADC模塊

▲ ADS1256 24bitADC模塊

下面給出了ADS1256的接口。根據ADS1256的數據手冊介紹,其中:

  • 用於MCU接口的SPI接口可以包含有/CS, SCLK, DIN, DOUT
  • D0 ~ D3 可以用於對外控制的數據接口。
  • SYNC可以用於數據同步作用。

▲ ADS1256 的接口定義

▲ 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

▲ 實驗接口電路的PCB

2.單片機軟件2

將AD1256連接到單片機STC8G1k。

▲ 將AD1256連接到單片機

▲ 將AD1256連接到單片機

  • 缺省情況下D0輸出AD1256的時鐘信號
    時鐘的頻率爲: 7.68MHz。

▲ AD1256輸出CLK波形

▲ 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輸出結果

▲ 設置電壓與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參考電壓。

輸出的電壓計算公式如下:
假設讀出的數值爲:NN,那麼實際的電壓值爲:

V=5.0×N0x7FFFFFV = {{5.0 \times N} \over {0x7FFFFF}}

▲ 設置電壓與測量電壓之間的關係

▲ 設置電壓與測量電壓之間的關係

▲ 設置電壓與測量電壓之間的差別

▲ 設置電壓與測量電壓之間的差別


  1. AD工程文件:AD\Test\2020\AD1256\TestAS1256STC8G.SchDoc * ↩︎

  2. C51工程文件:C51\STC\Test\2020\AD1256\TestAD1259\TestAD1256STC8G.uvproj ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章