local ads1220 = {}
--[[ ADS12x0 Register 0 (CONFIG0) definition
-----------------------------------------------------------------------------------------
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
-----------------------------------------------------------------------------------------
| MUX[3:0] | GAIN[2:0] |PGA_BYPASS|
-----------------------------------------------------------------------------------------]]
REG_ADDR_CONFIG0 = 0x00 -- Register Address
CONFIG0_DEFAULT = 0x00 -- Default (reset) Value
-- Define PGA_BYPASS
ADS_PGA_BYPASS_POS = 0x0
ADS_PGA_BYPASS_MASK = bit.lshift(1, ADS_PGA_BYPASS_POS)
ADS_PGA_ENABLED = 0x00 -- PGA enabled
ADS_PGA_BYPASSED = 0x01 -- PGA disabled
-- Define GAIN
ADS_GAIN_POS = 0x1
ADS_GAIN_MASK = bit.lshift(0x7, ADS_GAIN_POS)
ADS_GAIN_1 = bit.lshift(0x00, ADS_GAIN_POS) -- Gain = 1
ADS_GAIN_2 = bit.lshift(0x01, ADS_GAIN_POS) -- Gain = 2
ADS_GAIN_4 = bit.lshift(0x02, ADS_GAIN_POS) -- Gain = 4
ADS_GAIN_8 = bit.lshift(0x03, ADS_GAIN_POS) -- Gain = 8
ADS_GAIN_16 = bit.lshift(0x04, ADS_GAIN_POS) -- Gain = 16
ADS_GAIN_32 = bit.lshift(0x05, ADS_GAIN_POS) -- Gain = 32
ADS_GAIN_64 = bit.lshift(0x06, ADS_GAIN_POS) -- Gain = 64
ADS_GAIN_128 = bit.lshift(0x07, ADS_GAIN_POS) -- Gain = 128
-- Define the ADC input channels (MUX)
ADS_MUX_POS = 0x4
ADS_MUX_MASK = bit.lshift(0x0F, ADS_MUX_POS)
ADS_MUX_P_AIN0_N_AIN1 = bit.lshift(0x00, ADS_MUX_POS) -- AINP = AIN0, AINN = AIN1
ADS_MUX_P_AIN0_N_AIN2 = bit.lshift(0x01, ADS_MUX_POS) -- AINP = AIN0, AINN = AIN2
ADS_MUX_P_AIN0_N_AIN3 = bit.lshift(0x02, ADS_MUX_POS) -- AINP = AIN0, AINN = AIN3
ADS_MUX_P_AIN1_N_AIN2 = bit.lshift(0x03, ADS_MUX_POS) -- AINP = AIN1, AINN = AIN2
ADS_MUX_P_AIN1_N_AIN3 = bit.lshift(0x04, ADS_MUX_POS) -- AINP = AIN1, AINN = AIN3
ADS_MUX_P_AIN2_N_AIN3 = bit.lshift(0x05, ADS_MUX_POS) -- AINP = AIN2, AINN = AIN3
ADS_MUX_P_AIN1_N_AIN0 = bit.lshift(0x06, ADS_MUX_POS) -- AINP = AIN1, AINN = AIN0
ADS_MUX_P_AIN3_N_AIN2 = bit.lshift(0x07, ADS_MUX_POS) -- AINP = AIN3, AINN = AIN2
ADS_MUX_P_AIN0_N_AVSS = bit.lshift(0x08, ADS_MUX_POS) -- AINP = AIN0, AINN = AVSS
ADS_MUX_P_AIN1_N_AVSS = bit.lshift(0x09, ADS_MUX_POS) -- AINP = AIN1, AINN = AVSS
ADS_MUX_P_AIN2_N_AVSS = bit.lshift(0x0A, ADS_MUX_POS) -- AINP = AIN2, AINN = AVSS
ADS_MUX_P_AIN3_N_AVSS = bit.lshift(0x0B, ADS_MUX_POS) -- AINP = AIN3, AINN = AVSS
ADS_MUX_P_VREFP_N_VREFN = bit.lshift(0x0C, ADS_MUX_POS) -- (V(REFPx) – V(REFNx)) / 4 monitor (PGA bypassed)
ADS_MUX_P_AVDD_N_AVSS = bit.lshift(0x0D, ADS_MUX_POS) -- (AVDD – AVSS) / 4 monitor (PGA bypassed)
ADS_MUX_AVDD_AVSS = bit.lshift(0x0E, ADS_MUX_POS) -- AINP and AINN shorted to (AVDD + AVSS) / 2
ADS_MUX_RESERVED = bit.lshift(0x0F, ADS_MUX_POS) -- Reserved
--[[ ADS12x0 Register 0x1 (CONFIG1) Definition
-----------------------------------------------------------------------------------------
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
-----------------------------------------------------------------------------------------
| DR[2:0] | MODE[1:0] | CM | TS | BCS |
-----------------------------------------------------------------------------------------]]
REG_ADDR_CONFIG1 = 0x01 -- Register Address
CONFIG1_DEFAULT = 0x00 -- Default (reset) Value
-- Define BCS (burn out current)
ADS_BCS_POS = 0x00
ADS_BCS_MASK = bit.lshift(0x01, ADS_BCS_POS)
ADS_BCS_DISABLED = bit.lshift(0x00, ADS_BCS_POS) -- Current sources off
ADS_BCS_ENABLED = bit.lshift(0x01, ADS_BCS_POS) -- Current sources on
-- Define TS (temperature sensor mode)
ADS_TS_POS = 0x01
ADS_TS_MASK = bit.lshift(0x01, ADS_TS_POS)
ADS_TS_DISABLED = bit.lshift(0x00, ADS_TS_POS) -- Disables temperature sensor
ADS_TS_ENABLED = bit.lshift(0x01, ADS_TS_POS) -- Enables temperature sensor
-- Define CM (conversion mode)
ADS_CM_POS = 0x2
ADS_CM_MASK = bit.lshift(0x01, ADS_CM_POS)
ADS_CM_SINGLE_SHOT = bit.lshift(0x00, ADS_CM_POS) -- Single-shot mod
ADS_CM_CONTINOUS = bit.lshift(0x01, ADS_CM_POS) -- Continuous conversion mode
-- Define operating MODE
ADS_MODE_POS = 0x3
ADS_MODE_MASK = bit.lshift(0x03, ADS_MODE_POS)
ADS_MODE_NORMAL = bit.lshift(0x00, ADS_MODE_POS) -- Normal mode (256-kHz modulator clock, default)
ADS_MODE_DUTY_CYCLE = bit.lshift(0x01, ADS_MODE_POS) -- Duty-cycle mode (internal duty cycle of 1:4)
ADS_MODE_TURBO = bit.lshift(0x02, ADS_MODE_POS) -- Turbo mode (512-kHz modulator clock)
ADS_MODE_RESERVED = bit.lshift(0x03, ADS_MODE_POS) -- Reserved
-- Define DR (data rate)
ADS_DR_POS = 0x5
ADS_DR_MASK = bit.lshift(0x07, ADS_DR_POS)
ADS_DR_20 = bit.lshift(0x00, ADS_DR_POS) -- 20 SPS
ADS_DR_45 = bit.lshift(0x01, ADS_DR_POS) -- 45 SPS
ADS_DR_90 = bit.lshift(0x02, ADS_DR_POS) -- 90 SPS
ADS_DR_175 = bit.lshift(0x03, ADS_DR_POS) -- 175 SPS
ADS_DR_330 = bit.lshift(0x04, ADS_DR_POS) -- 330 SPS
ADS_DR_600 = bit.lshift(0x05, ADS_DR_POS) -- 600 SPS
ADS_DR_1000 = bit.lshift(0x06, ADS_DR_POS) -- 1000 SPS
ADS_DR_RESERVED = bit.lshift(0x07, ADS_DR_POS) -- Reserved
--[[ ADS12x0 Register 0x2 (CONFIG2) Definition
-----------------------------------------------------------------------------------------
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
-----------------------------------------------------------------------------------------
| VREF[1:0] | 50/60[1:0] | PSW | IDAC[2:0] |
-----------------------------------------------------------------------------------------]]
REG_ADDR_CONFIG2 = 0x02 -- Register Address
CONFIG2_DEFAULT = 0x00 -- Default (reset) Value
--Define IDAC=
ADS_IDAC_POS = 0x0
ADS_IDAC_MASK = bit.lshift(0x07, ADS_IDAC_POS)
ADS_IDACMAG_OFF = bit.lshift(0x00, ADS_IDAC_POS) -- Off
ADS_IDAC_10UA = bit.lshift(0x01, ADS_IDAC_POS) -- 10 μA
ADS_IDAC_50UA = bit.lshift(0x02, ADS_IDAC_POS) -- 50 μA
ADS_IDAC_100UA = bit.lshift(0x03, ADS_IDAC_POS) -- 100 μA
ADS_IDAC_250UA = bit.lshift(0x04, ADS_IDAC_POS) -- 250 μA
ADS_IDAC_500UA = bit.lshift(0x05, ADS_IDAC_POS) -- 500 μA
ADS_IDAC_1000UA = bit.lshift(0x06, ADS_IDAC_POS) -- 1000 μA
ADS_IDAC_1500UA = bit.lshift(0x07, ADS_IDAC_POS) -- 1500 μA
--Define PSW
ADS_PSW_POS = 0x3
ADS_PSW_MASK = bit.lshift(0x01, ADS_PSW_POS)
ADS_PSW_OPEN = bit.lshift(0x00, ADS_PSW_POS) -- Switch is always open
ADS_PSW_AUTO_CLOSE = bit.lshift(0x01, ADS_PSW_POS) -- Switch automatically closes when the START/SYNC command is sent and opens when the POWERDOWN command is issued
--DefinFIR_e 50/60 (FIR filter configuration)
ADS_FIR_50_60_POS = 0x4
ADS_FIR_50_60_MASK = bit.lshift(0x03, ADS_FIR_50_60_POS)
ADS_FIR_50_60_DISABLED = bit.lshift(0x00, ADS_FIR_50_60_POS) -- No 50-Hz or 60-Hz rejection
ADS_FIR_50_60_50_60HZ = bit.lshift(0x01, ADS_FIR_50_60_POS) -- Simultaneous 50-Hz and 60-Hz rejection
ADS_FIR_50_60_50HZ = bit.lshift(0x02, ADS_FIR_50_60_POS) -- 50-Hz rejection only
ADS_FIR_50_60_60HZ = bit.lshift(0x03, ADS_FIR_50_60_POS) -- 60-Hz rejection only
--Define VREF (voltage reference selection)
ADS_VREF_POS = 0x6
ADS_VREF_MASK = bit.lshift(0x03, ADS_VREF_POS)
ADS_VREF_INTERNAL = bit.lshift(0x00, ADS_VREF_POS) -- Internal 2.048-V reference selected
ADS_VREF_EXTERNAL_REFP0_REFN0 = bit.lshift(0x01, ADS_VREF_POS) -- External reference selected using dedicated REFP0 and REFN0 inputs
ADS_VREF_EXTERNAL_REFP1_REFN1 = bit.lshift(0x02, ADS_VREF_POS) -- External reference selected using AIN0/REFP1 and AIN3/REFN1 inputs
ADS_VREF_EXTERNAL_AVDD_AVSS = bit.lshift(0x03, ADS_VREF_POS) -- Analog supply (AVDD – AVSS) used as reference
--[[ ADS12x0 Register 0x3 (CONFIG3) Definition
-----------------------------------------------------------------------------------------
| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
-----------------------------------------------------------------------------------------
| I1MUX[2:0] | I2MUX[2:0] | DRDYM | 0 |
-----------------------------------------------------------------------------------------]]
REG_ADDR_CONFIG3 = 0x03 -- Register Address
CONFIG3_DEFAULT = 0x00 -- Default (reset) Value
--Define DRDYM
ADS_DRDYM_POS = 0x1
ADS_DRDYM_MASK = bit.lshift(0x01, ADS_DRDYM_POS)
ADS_DRDYM_DRDY = bit.lshift(0x00, ADS_DRDYM_POS) -- Only the dedicated DRDY pin is used to indicate when data are ready
ADS_DRDYM_DRDY_DOUT = bit.lshift(0x01, ADS_DRDYM_POS) -- Data ready is indicated simultaneously on DOUT/DRDY and DRDY
--Define I2MUX (IDAC2 ruting configuration)
ADS_I2MUX_POS = 0x2
ADS_I2MUX_MASK = bit.lshift(0x07, ADS_I2MUX_POS)
ADS_I2MUX_DISABLED = bit.lshift(0x00, ADS_I2MUX_POS) --IDAC2 disabled
ADS_I2MUX_AIN0 = bit.lshift(0x01, ADS_I2MUX_POS) --IDAC2 connected to AIN0/REFP1
ADS_I2MUX_AIN1 = bit.lshift(0x02, ADS_I2MUX_POS) --DAC2 connected to AIN1
ADS_I2MUX_AIN2 = bit.lshift(0x03, ADS_I2MUX_POS) --IDAC2 connected to AIN2
ADS_I2MUX_AIN3 = bit.lshift(0x04, ADS_I2MUX_POS) --IDAC2 connected to AIN3/REFN1
ADS_I2MUX_REFP0 = bit.lshift(0x05, ADS_I2MUX_POS) --IDAC2 connected to REFP0
ADS_I2MUX_REFN0 = bit.lshift(0x06, ADS_I2MUX_POS) --IDAC2 connected to REFN0
ADS_I2MUX_RESERVED = bit.lshift(0x07, ADS_I2MUX_POS) --Reserved
--Define I1MUX (IDAC1 ruting configuration)
ADS_I1MUX_POS = 0x5
ADS_I1MUX_MASK = bit.lshift(0x07, ADS_I1MUX_POS)
ADS_I1MUX_DISABLED = bit.lshift(0x00, ADS_I1MUX_POS) -- IDAC1 disabled
ADS_I1MUX_AIN0 = bit.lshift(0x01, ADS_I1MUX_POS) -- IDAC1 connected to AIN0/REFP1
ADS_I1MUX_AIN1 = bit.lshift(0x02, ADS_I1MUX_POS) -- IDAC1 connected to AIN1
ADS_I1MUX_AIN2 = bit.lshift(0x03, ADS_I1MUX_POS) -- IDAC1 connected to AIN2
ADS_I1MUX_AIN3 = bit.lshift(0x04, ADS_I1MUX_POS) -- IDAC1 connected to AIN3/REFN1
ADS_I1MUX_REFP0 = bit.lshift(0x05, ADS_I1MUX_POS) -- IDAC1 connected to REFP0
ADS_I1MUX_REFN0 = bit.lshift(0x06, ADS_I1MUX_POS) -- IDAC1 connected to REFN0
ADS_I1MUX_RESERVED = bit.lshift(0x07, ADS_I1MUX_POS) --Reserved
local cspin = gpio.setup(8, 1) -- 配置CS引脚为输出
local drdypin = gpio.setup(16, nil, gpio.PULLUP) -- 配置DRDY引脚为上拉输入
--ADS1120选择通道
function select_chn(chn)
cspin(0)
spi.send(0, string.char(0x40))
if chn==0 then
--log.info("切换通道0")
spi.send(0, string.char(bit.bor(ADS_PGA_ENABLED, ADS_GAIN_1, ADS_MUX_P_AIN0_N_AVSS)))
elseif chn==1 then
--log.info("切换通道1")
spi.send(0, string.char(bit.bor(ADS_PGA_ENABLED, ADS_GAIN_1, ADS_MUX_P_AIN1_N_AVSS)))
elseif chn==2 then
--log.info("切换通道2")
spi.send(0, string.char(bit.bor(ADS_PGA_ENABLED, ADS_GAIN_1, ADS_MUX_P_AIN2_N_AVSS)))
elseif chn==3 then
--log.info("切换通道3")
spi.send(0, string.char(bit.bor(ADS_PGA_ENABLED, ADS_GAIN_1, ADS_MUX_P_AIN3_N_AVSS)))
end
cspin(1)
end
--ADS1220读取数据
function getdata(chn)
select_chn(chn) -- 旋转通道
sys.wait(1)
cspin(0)
spi.send(0, string.char(0x08)) --开启转换
--sys.wait(200)
while gpio.get(16)==gpio.HIGH do sys.wait(5) end
local data = spi.recv(0, 3)
if data:len()~=3 then
return 0
end
local value = data:byte(1)*0xFFFF + data:byte(2)*0xFF + data:byte(3)
cspin(1)
if bit.band(value, 0x800000) > 0 then bit.bor(value, 0xff000000) end
return value
end
function ads1220.ads1220_run()
--ADS1120初始化
log.info("启动ADS1120")
local result = spi.setup(0, nil, 1, 0, 8, 100000, spi.MSB, 1, 1)
print("spi 打开结果:", result)
if result ~= 0 then
print("spi 打开失败",result)
return result
end
--设置寄存器
cspin(0)
spi.send(0, string.char(0x43))
spi.send(0, string.char(ADS_PGA_ENABLED|ADS_GAIN_1|ADS_MUX_P_AIN0_N_AVSS))
spi.send(0, string.char(ADS_BCS_DISABLED|ADS_TS_DISABLED|ADS_CM_SINGLE_SHOT|ADS_MODE_NORMAL|ADS_DR_45))
spi.send(0, string.char(ADS_IDACMAG_OFF|ADS_PSW_OPEN|ADS_FIR_50_60_DISABLED|ADS_VREF_INTERNAL))
spi.send(0, string.char(ADS_DRDYM_DRDY|ADS_I2MUX_DISABLED|ADS_I1MUX_DISABLED))
cspin(1)
sys.wait(10)
--读取寄存器
cspin(0)
spi.send(0, string.char(0x23))
local reg = spi.recv(0, 4)
cspin(1)
if reg:len()==4 then
print("读取到寄存器:", string.format("0x%02X", reg:byte(1)),
string.format("0x%02X", reg:byte(2)),
string.format("0x%02X", reg:byte(3)),
string.format("0x%02X", reg:byte(4)))
end
while true do
local val0 = getdata(0)
local val1 = getdata(1)
local val2 = getdata(2)
local val3 = getdata(3)
log.info("读取通道0:",val0," 电压:", string.format("%0.2f", val0*2.048/8388608))
log.info("读取通道1:",val1," 电压:", string.format("%0.2f", val1*2.048/8388608))
log.info("读取通道2:",val2," 电压:", string.format("%0.2f", val2*2.048/8388608))
log.info("读取通道3:",val3," 电压:", string.format("%0.2f", val3*2.048/8388608))
sys.wait(1000)
end
end
return ads1220
12-30
1168

06-14
1168

08-02
579

04-09