ads1115.lua 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. --[[
  2. @module ads1115
  3. @summary ads1115 模数转换器
  4. @version 1.0
  5. @date 2022.03.18
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. --注意:ads1115的配置需按照项目需求配置,您需要按照配置寄存器说明重新配置 ADS1115_CONF_HCMD 和 ADS1115_CONF_LCMD !!!
  10. -- 用法实例
  11. local ads1115 = require "ads1115"
  12. i2cid = 0
  13. i2c_speed = i2c.FAST
  14. sys.taskInit(function()
  15. i2c.setup(i2cid,i2c_speed)
  16. ads1115.init(i2cid)--初始化,传入i2c_id
  17. while 1 do
  18. local ads1115_data = ads1115.get_val()
  19. log.info("ads1115", ads1115_data)
  20. sys.wait(1000)
  21. end
  22. end)
  23. ]]
  24. local ads1115 = {}
  25. local sys = require "sys"
  26. local i2cid
  27. local i2cslaveaddr
  28. local ADS1115_ADDRESS_AD0_LOW = 0x48 -- address pin low (GND), default for InvenSense evaluation board
  29. local ADS1115_ADDRESS_AD0_HIGH = 0x49 -- address pin high (VCC)
  30. local ADS1115_ADDRESS_AD0_SDA = 0x4A
  31. local ADS1115_ADDRESS_AD0_SCL = 0x4B
  32. -- ADS1115 registers define
  33. local ADS1115_DATA_REG = 0x00 --转换寄存器
  34. local ADS1115_CONF_REG = 0x01 --配置寄存器
  35. local ADS1115_LOTH_REG = 0x02 --阈值比较器高字节寄存器
  36. local ADS1115_HITH_REG = 0x03 --阈值比较器低字节寄存器
  37. --[[
  38. 配置寄存器说明
  39. config register
  40. -----------------------------------------------------------------------------------
  41. CRH[15:8](R/W)
  42. BIT 15 14 13 12 11 10 9 8
  43. NAME OS MUX2 MUX1 MUX0 PGA2 PGA1 PGA0 MODE
  44. -----------------------------------------------------------------------------------
  45. L[7:0] (R/W)
  46. BIT 7 6 5 4 3 2 1 0
  47. NAME DR0 DR1 DR0 COM_MODE COM_POL COM_LAT COM_QUE1 COM_QUE0
  48. -----------------------------------------------------------------------------------
  49. 15 | OS | 运行状态和单次转换开始
  50. | | 写时:
  51. | | 0 : 无效
  52. | | 1 : 开始单次转换(处于掉电状态时)
  53. | | 读时:
  54. | | 0 : 正在转换
  55. | | 1 : 未执行转换
  56. -----------------------------------------------------------------------------------
  57. 14:12 | MUX [2:0] | 输入复用多路配置
  58. | | 000 : AINP = AIN0 and AINN = AIN1 (default)
  59. | | 001 : AINP = AIN0 and AINN = AIN3
  60. | | 010 : AINP = AIN1 and AINN = AIN3
  61. | | 011 : AINP = AIN2 and AINN = AIN3
  62. | | 100 : AINP = AIN0 and AINN = GND
  63. | | 101 : AINP = AIN1 and AINN = GND
  64. | | 110 : AINP = AIN2 and AINN = GND
  65. | | 111 : AINP = AIN3 and AINN = GND
  66. -----------------------------------------------------------------------------------
  67. 11:9 | PGA [2:0] | 可编程增益放大器配置(FSR full scale range)
  68. | | 000 : FSR = В±6.144 V
  69. | | 001 : FSR = В±4.096 V
  70. | | 010 : FSR = В±2.048 V (默认)
  71. | | 011 : FSR = В±1.024 V
  72. | | 100 : FSR = В±0.512 V
  73. | | 101 : FSR = В±0.256 V
  74. | | 110 : FSR = В±0.256 V
  75. | | 111 : FSR = В±0.256 V
  76. -----------------------------------------------------------------------------------
  77. 8 | MODE | 工作模式
  78. | | 0 : 连续转换
  79. | | 1 : 单次转换
  80. -----------------------------------------------------------------------------------
  81. 7:5 | DR [2:0] | 采样频率
  82. | | 000 : 8 SPS
  83. | | 001 : 16 SPS
  84. | | 010 : 32 SPS
  85. | | 011 : 64 SPS
  86. | | 100 : 128 SPS (默认)
  87. | | 101 : 250 SPS
  88. | | 110 : 475 SPS
  89. | | 111 : 860 SPS
  90. -----------------------------------------------------------------------------------
  91. 4 | COMP_MODE | 比较器模式
  92. | | 0 : 传统比较器 (default)
  93. | | 1 : 窗口比较器
  94. -----------------------------------------------------------------------------------
  95. 3 | COMP_POL | Comparator polarity
  96. | | 0 : 低电平有效 (default)
  97. | | 1 : 高电平有效
  98. -----------------------------------------------------------------------------------
  99. 2 | COMP_LAT | Latching comparator
  100. | | 0 : 非锁存比较器. (default)
  101. | | 1 : 锁存比较器.
  102. -----------------------------------------------------------------------------------
  103. 1:0 | COMP_QUE [1:0] | Comparator queue and disable
  104. | | 00 : Assert after one conversion
  105. | | 01 : Assert after two conversions
  106. | | 10 : Assert after four conversions
  107. | | 11 : 禁用比较器并将ALERT/RDY设置为高阻抗 (default)
  108. -----------------------------------------------------------------------------------
  109. ]]
  110. local ADS1115_CONF_HCMD = 0x42 -- AIN0单端输入 В±4.096 V 连续模式 0 100 001 0
  111. local ADS1115_CONF_LCMD = 0x83 -- 128sps 传统比较器 输出低有效 非锁存比较器 禁用比较器并将ALERT/RDY设置为高阻抗 100 0 0 0 11
  112. --[[
  113. ADS1115初始化
  114. @api ads1115.init(i2c_id)
  115. @number 所在的i2c总线id
  116. @return bool 成功返回true
  117. @usage
  118. ads1115.init(0)
  119. ]]
  120. function ads1115.init(i2c_id)
  121. i2cid = i2c_id
  122. -- i2cslaveaddr = ADS1115_ADDRESS_AD0_LOW
  123. log.info("ADS1115", "init_ok")
  124. return true
  125. end
  126. --[[
  127. 获取ADS1115数据
  128. @api ads1115.get_val()
  129. @return number 光照强度数据,若读取失败会返回nil
  130. @usage
  131. local ads1115_data = ads1115.get_val()
  132. log.info("ads1115", ads1115_data)
  133. ]]
  134. function ads1115.get_val()
  135. i2c.send(i2cid, ADS1115_ADDRESS_AD0_LOW,{ADS1115_CONF_REG,ADS1115_CONF_HCMD,ADS1115_CONF_LCMD})
  136. sys.wait(5)
  137. i2c.send(i2cid, ADS1115_ADDRESS_AD0_LOW, ADS1115_DATA_REG)
  138. local _,val_data_raw = pack.unpack(i2c.recv(i2cid, ADS1115_ADDRESS_AD0_LOW, 2), ">h")
  139. if not val_data_raw then
  140. return
  141. end
  142. if val_data_raw>=0x8000 then
  143. return ((0xffff-val_data_raw)/32767.0)*4.096
  144. else
  145. return (val_data_raw/32768.0)*4.096
  146. end
  147. end
  148. return ads1115