ads1115plus.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. --[[
  2. @module ads1115plus
  3. @summary ADS1115驱动
  4. 测量2次,逼近量程测量方案
  5. 可以用8种通道方式,4种差分,4种in0-in3
  6. ads1115完全驱动
  7. @version 1.0
  8. @data 2023/12/14
  9. @author 杨壮壮
  10. @usage
  11. require 'ads1115plus'
  12. sys.taskInit(function ()
  13. i2c.setup(i2cid, i2c_speed)
  14. ads1115plus.Setup(i2cid) -- 一次初始化
  15. while true do
  16. log.info("ads1115:",ads1115plus.task_read(5))
  17. sys.wait(1000)
  18. end
  19. end)
  20. ]]
  21. require 'sys'
  22. _G.sys = require ("sys")
  23. ads1115plus = {} --定义存放程序的TABLE 全局变量
  24. local i2cid=1
  25. local i2cslaveaddr = 0x48
  26. --[[
  27. ADS1115初始化
  28. @api ads1115plus.Setup(i2c_id)
  29. @number 所在的i2c总线id
  30. @return bool 成功返回true
  31. @usage
  32. i2c.setup(0, i2c_speed)
  33. ads1115plus.Setup(0)
  34. ]]
  35. function ads1115plus.Setup(i2c_id)
  36. i2cid=i2c_id
  37. i2c.writeReg(i2cid, i2cslaveaddr, 0x02, string.char(0x00, 0x00)) --给低阈值寄存器写进去值 A1高八位 A2 低八位
  38. i2c.writeReg(i2cid, i2cslaveaddr, 0x03, string.char(0xff, 0xff)) --给高阈值寄存器写进去值 A1高八位 A2 低八位
  39. log.info("ADS1115", "init_ok")
  40. return true
  41. end
  42. --[[
  43. 获取ADS1115原始数据
  44. @api ads1115plus.task_recv(MU1,FSR)
  45. @number MUX:通道选择 0-7 MUX=0 AIN0 AIN1 MUX=7 AIN3 GND
  46. MU1
  47. | | 000 : AINP = AIN0 and AINN = AIN1 (default)
  48. | | 001 : AINP = AIN0 and AINN = AIN3
  49. | | 010 : AINP = AIN1 and AINN = AIN3
  50. | | 011 : AINP = AIN2 and AINN = AIN3
  51. | | 100 : AINP = AIN0 and AINN = GND
  52. | | 101 : AINP = AIN1 and AINN = GND
  53. | | 110 : AINP = AIN2 and AINN = GND
  54. | | 111 : AINP = AIN3 and AINN = GND
  55. @number FSR:量程选择 0-7 2 2.048v
  56. -- 这个参数的选择:8.1:噪声性能
  57. FSR
  58. | | 000 : FSR = В±6.144 V
  59. | | 001 : FSR = В±4.096 V
  60. | | 010 : FSR = В±2.048 V (默认)
  61. | | 011 : FSR = В±1.024 V
  62. | | 100 : FSR = В±0.512 V
  63. | | 101 : FSR = В±0.256 V
  64. | | 110 : FSR = В±0.256 V
  65. | | 111 : FSR = В±0.256 V
  66. @return number ADC数据,若读取失败会返回nil
  67. @usage
  68. local ads1115_data = ads1115plus.task_recv(0,2)
  69. log.info("ads1115", ads1115_data)
  70. ]]
  71. function ads1115plus.task_recv( MU1,FSR )
  72. a1 = 0x80 + (MU1 * 16) + (FSR * 2) + 1 --a1为配置寄存器高八位 a2为低八位
  73. if FSR > 0x05 then --FSR大于5时,切换速率减少噪声,提高采样数据精确度
  74. a2 = (0x3 * 32) + 3 --量程超过5的时候,速率配置为64sps
  75. i2c.writeReg(i2cid, i2cslaveaddr, 0x01, string.char(a1, a2)) --给配置寄存器写进去值 A1高八位 A2 低八位
  76. sys.wait(60)
  77. else
  78. a2 = (0x4 * 32) + 3 --其他情况下速率为128sps
  79. i2c.writeReg(i2cid, i2cslaveaddr, 0x01, string.char(a1, a2)) --给配置寄存器写进去值 A1高八位 A2 低八位
  80. sys.wait(30)
  81. end
  82. -- 从转换就绪引脚读取转换好的采集数据2个字节(四个十六进制的数值)的数据
  83. local data = i2c.readReg(i2cid, i2cslaveaddr,0x00 , 2)
  84. local _,val_data_raw = pack.unpack(data, ">h")
  85. if not val_data_raw then
  86. return
  87. end
  88. if val_data_raw>=0x8000 then
  89. return ((0xffff-val_data_raw))
  90. else
  91. return (val_data_raw)
  92. end
  93. end
  94. --[[
  95. ADS1115读取mv值
  96. @api ads1115plus.task_read(MU1)
  97. @number 所在的i2c总线id
  98. @return number ADC的mv数据,若读取失败会返回nil
  99. @usage
  100. log.info("ads1115plus:",ads1115plus.task_read(5))
  101. ]]
  102. function ads1115plus.task_read(MU1)
  103. local ads = ads1115plus.task_recv(MU1,0) --先用大量程测量正负6.144去测量 逼近
  104. if ads == nil then
  105. return nil --判断采样数值是否非空
  106. end
  107. local ads_ADC=0
  108. if ads < 0 then
  109. ads_ADC = -ads
  110. else
  111. ads_ADC = ads
  112. end
  113. local mv =0
  114. if ads_ADC > 10922 then
  115. if ads_ADC>20000 then
  116. mv = ads * 0.1875
  117. else
  118. ads = ads1115plus.task_recv(MU1,1)
  119. mv = ads * 0.125
  120. end
  121. elseif ads_ADC > 5461 then
  122. ads = ads1115plus.task_recv(MU1,2)
  123. mv = ads * 0.0625
  124. elseif ads_ADC > 2730 then
  125. ads = ads1115plus.task_recv(MU1,3)
  126. mv = ads * 0.03125
  127. elseif ads_ADC > 1365 then
  128. ads = ads1115plus.task_recv(MU1,4)
  129. mv = ads * 0.015625
  130. else
  131. ads = ads1115plus.task_recv(MU1,5)
  132. mv = ads * 0.0078125
  133. end
  134. return mv --返回采集到的电压值 单位(mV)有正有负
  135. end
  136. return ads1115plus