使用micropython操作ads1256
本文介绍了如何在MicroPython环境下使用ESP32驱动ADS1256模数转换器模块。硬件连接包括SCLK、DIN、DOUT等信号线,并提供两种供电方案:通过ESP32的5V引脚供电(需补焊二极管)或使用外部电源。软件部分移植了C源码到Python,实现了寄存器读写、增益设置、采样率配置等功能。示例代码展示了单端和差分测量方法,如读取AIN7单端信号或AIN3-AIN4差分信号。程序通过So
·
一个小项目要使用esp32核心板操作ads1256模块,esp32上运行的是micropython环境,参考模块厂家提供的c源码,移植一份python代码,可以正常工作。
硬件接线
| esp32管脚 | ads1256管脚 | 说明 |
| gpio4 | sclk | |
| gpio5 | din | |
| gpio6 | dout | |
| 5v | 5v | 如想使用esp32直接供 电,可以连接esp32排针 的+5V引脚,同时联系 esp32核心板客服, 将缺焊的IN-OUT二极管 补焊接上去 如不使用esp32供电,则 使用外部电源给ads1256 供电 |
| gpio18 | cs | |
| gpio17 | drdy | |
| gpio8 | pdwn | |
| gnd | gnd |
程序说明
如需要修改gain和采样率,参照代码修改参数即可 如需要测量单端和差分,参考如下代码,其实主要是修改了参数
例1 需要测量AIN7单端
Adc=ads1256.ADS1256_readData(ads1256.ADS1256_MUXP_AIN7|ads1256.A DS1256_MUXN_AINCOM) Volts = Adc * 0.000000598
例2 需要测量AIN3和AIN4差分信号
Adc=ads1256.ADS1256_readData(ads1256.ADS1256_MUXP_AIN3|ads1256.A DS1256_MUXN_AIN4) Volts = Adc * 0.000000598
注意,差分时参数要一个P一个N,即: ads1256.ADS1256_MUXP_AIN3 ads1256.ADS1256_MUXN_AIN4
完整代码
from machine import Pin, SPI, SoftSPI
import time
ADS1256_MUXP_AIN0 = 0x00
ADS1256_MUXP_AIN1 = 0x10
ADS1256_MUXP_AIN2 = 0x20
ADS1256_MUXP_AIN3 = 0x30
ADS1256_MUXP_AIN4 = 0x40
ADS1256_MUXP_AIN5 = 0x50
ADS1256_MUXP_AIN6 = 0x60
ADS1256_MUXP_AIN7 = 0x70
ADS1256_MUXP_AINCOM = 0x80
ADS1256_MUXN_AIN0 = 0x00
ADS1256_MUXN_AIN1 = 0x01
ADS1256_MUXN_AIN2 = 0x02
ADS1256_MUXN_AIN3 = 0x03
ADS1256_MUXN_AIN4 = 0x04
ADS1256_MUXN_AIN5 = 0x05
ADS1256_MUXN_AIN6 = 0x06
ADS1256_MUXN_AIN7 = 0x07
ADS1256_MUXN_AINCOM = 0x08
ADS1256_CMD_WAKEUP = 0x00
ADS1256_CMD_RDATA = 0x01
ADS1256_CMD_RDATAC = 0x03
ADS1256_CMD_SDATAC = 0x0f
ADS1256_CMD_RREG = 0x10
ADS1256_CMD_WREG = 0x50
ADS1256_CMD_SELFCAL = 0xf0
ADS1256_CMD_SELFOCAL = 0xf1
ADS1256_CMD_SELFGCAL = 0xf2
ADS1256_CMD_SYSOCAL = 0xf3
ADS1256_CMD_SYSGCAL = 0xf4
ADS1256_CMD_SYNC = 0xfc
ADS1256_CMD_STANDBY = 0xfd
ADS1256_CMD_REST = 0xfe
ADS1256_STATUS = 0x00
ADS1256_MUX = 0x01
ADS1256_ADCON = 0x02
ADS1256_DRATE = 0x03
ADS1256_IO = 0x04
ADS1256_OFC0 = 0x05
ADS1256_OFC1 = 0x06
ADS1256_OFC2 = 0x07
ADS1256_FSC0 = 0x08
ADS1256_FSC1 = 0x09
ADS1256_FSC2 = 0x0A
ADS1256_GAIN_1 = 0x00
ADS1256_GAIN_2 = 0x01
ADS1256_GAIN_4 = 0x02
ADS1256_GAIN_8 = 0x03
ADS1256_GAIN_16 = 0x04
ADS1256_GAIN_32 = 0x05
ADS1256_GAIN_64 = 0x06
ADS1256_MUXN_AINCOM = 0x08
ADS1256_DRATE_30000SPS = 0xF0
ADS1256_DRATE_15000SPS = 0xE0
ADS1256_DRATE_7500SPS = 0xD0
ADS1256_DRATE_3750SPS = 0xC0
ADS1256_DRATE_2000SPS = 0xB0
ADS1256_DRATE_1000SPS = 0xA1
ADS1256_DRATE_500SPS = 0x92
ADS1256_DRATE_100SPS = 0x82
ADS1256_DRATE_60SPS = 0x72
ADS1256_DRATE_50SPS = 0x63
ADS1256_DRATE_30SPS = 0x53
ADS1256_DRATE_25SPS = 0x43
ADS1256_DRATE_15SPS = 0x33
ADS1256_DRATE_10SPS = 0x23
ADS1256_DRATE_5SPS = 0x13
ADS1256_DRATE_2_5SPS = 0x03
pdwn = Pin(8, Pin.OUT)
cs = Pin(18, Pin.OUT)
drdy = Pin(17, Pin.IN)
vspi = SoftSPI(baudrate = 100000, polarity = 0, phase = 0, sck = Pin(4), mosi = Pin(5), miso = Pin(6))
pdwn.value(0)
time.sleep_ms(1000)
pdwn.value(1)
cs.value(1)
time.sleep_ms(10)
def ADS1256_ReadReg(regId):
cs.value(0)
time.sleep_us(10)
wbuf = bytearray([ADS1256_CMD_RREG | regId, 0x00])
vspi.write(wbuf)
time.sleep_us(10)
buf = vspi.read(1)
time.sleep_us(10)
cs.value(1)
return buf[0]
def ADS1256_ReadChipID():
AD1256_waitIdle()
id = ADS1256_ReadReg(ADS1256_STATUS)
return id >> 4
def AD1256_waitIdle():
while drdy.value() == 1:
time.sleep_ms(10)
def ADS1256_writeReg(regAddr, data):
cs.value(0)
AD1256_waitIdle()
time.sleep_us(10)
buf = bytearray([ADS1256_CMD_WREG | (regAddr & 0x0F), 0x00, data])
vspi.write(buf)
time.sleep_us(10)
cs.value(1)
def ADS1256_setGain(gain_value):
AD1256_waitIdle()
ADS1256_writeReg(ADS1256_ADCON, gain_value)
def ADS1256_setDrate(rate):
AD1256_waitIdle()
ADS1256_writeReg(ADS1256_DRATE, rate)
def ADS1256_readData(channel):
sum = 0
AD1256_waitIdle()
ADS1256_writeReg(ADS1256_MUX, channel);
time.sleep_us(100)
cs.value(0)
AD1256_waitIdle()
buf = bytearray([ADS1256_CMD_SYNC, ADS1256_CMD_WAKEUP, ADS1256_CMD_RDATA])
vspi.write(buf)
time.sleep_us(10)
buf = vspi.read(3)
time.sleep_us(10)
cs.value(1)
sum |= (buf[0] << 16)
sum |= (buf[1] << 8)
sum |= buf[2]
if sum > 0x7FFFFF:
sum -= 0x1000000
return sum
def ADS1256_Init():
AD1256_waitIdle()
cs.value(0)
time.sleep_us(10)
buf = bytearray([ADS1256_CMD_SELFCAL])
vspi.write(buf)
AD1256_waitIdle()
time.sleep_us(10)
cs.value(1)
ADS1256_writeReg(ADS1256_STATUS, 0x06);
ADS1256_writeReg(ADS1256_ADCON, ADS1256_GAIN_1)
ADS1256_writeReg(ADS1256_DRATE, ADS1256_DRATE_10SPS)
ADS1256_writeReg(ADS1256_IO, 0x00)
AD1256_waitIdle()
cs.value(0)
time.sleep_us(10)
buf = bytearray([ADS1256_CMD_SELFCAL])
vspi.write(buf)
AD1256_waitIdle()
time.sleep_us(10)
cs.value(1)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)