ADS1256 24位ADC模块
【摘要】
■ 简介
ADS1256是一款 24bit ADC转换模块。 ADS1256可以通过SPI进行访问 的高精度的转换器。它的 ADS1256 数据手册 可以从 TI网站 查询到。 ...
■ 简介
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参考电压。
输出的电压计算公式如下:
假设读出的数值为: N N N,那么实际的电压值为:
V = 5.0 × N 0 x 7 F F F F F V = {{5.0 \times N} \over {0x7FFFFF}} V=0x7FFFFF5.0×N
▲ 设置电压与测量电压之间的关系
▲ 设置电压与测量电压之间的差别
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/107043377
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)