ina226.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. --[[
  2. @module ina226
  3. @summary ina226 驱动
  4. @version 1.0
  5. @date 2023.04.06
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:校准和算法根据自己设计情况进行调节
  9. --注意:因使用了sys.wait()所有api需要在协程中使用
  10. -- 用法实例
  11. local ina226 = require "ina226"
  12. local i2cid = 0
  13. sys.taskInit(function()
  14. i2c.setup(i2cid, i2c.FAST)
  15. ina226.init(i2cid)
  16. while 1 do
  17. local ina226_data = ina226.get_data()
  18. log.info("ina226_data", "shunt_voltage",ina226_data.shunt_voltage,"bus_voltage",ina226_data.bus_voltage,"power",ina226_data.power,"current",ina226_data.current)
  19. sys.wait(1000)
  20. end
  21. end)
  22. ]]
  23. local ina226 = {}
  24. local sys = require "sys"
  25. local i2cid
  26. local INA226_ADDRESS_ADR = 0x40
  27. --寄存器
  28. local INA226_CONFIG_REG = 0x00 -- 配置
  29. local INA226_SHUNT_VOL_REG = 0x01 -- 分压电压
  30. local INA226_BUS_VOL_REG = 0x02 -- 总线电压
  31. local INA226_POWER_REG = 0x03 -- 功率
  32. local INA226_CURRENT_REG = 0x04 -- 电流
  33. local INA226_CALIBRA_REG = 0x05 -- 校准
  34. local INA226_MASK_REG = 0x06 -- 屏蔽 启用
  35. local INA226_ALERT_REG = 0x07 -- 警报
  36. local INA226_MANUFACTURER_ID_REG= 0xFE -- 制造商ID
  37. local INA226_DIE_ID_REG = 0xFF -- 器件ID
  38. local INA226_MANUFACTURER_ID = 0x5449
  39. local INA226_DIE_ID = 0x2260
  40. local function ina226_send(...)
  41. i2c.send(i2cid, INA226_ADDRESS_ADR, {...})
  42. end
  43. local function ina226_recv_short(...)
  44. i2c.send(i2cid, INA226_ADDRESS_ADR, {...})
  45. local _, read_data = pack.unpack(i2c.recv(0, INA226_ADDRESS_ADR, 2), ">H")
  46. return read_data
  47. end
  48. --器件ID检测
  49. local function chip_check()
  50. if ina226_recv_short(INA226_MANUFACTURER_ID_REG) == INA226_MANUFACTURER_ID and ina226_recv_short(INA226_DIE_ID_REG) == INA226_DIE_ID then
  51. log.info("Device i2c id is: INA226")
  52. return true
  53. else
  54. log.info("Can't find INA226 device")
  55. end
  56. end
  57. --[[
  58. ina226初始化
  59. @api ina226.init(ina226_i2c, conf, cal)
  60. @number 挂载ina226的i2c总线id
  61. @table 配置数据, 默认值 {0x47,0x27}, 即0100 0111 0010 0111
  62. @table 校准数据, 默认值 {0x0A,0x00}, 即5.12 / (0.1 * 0.02)
  63. @return bool 成功返回true
  64. @usage
  65. -- 使用默认值进行初始化
  66. ina226.init(0)
  67. ]]
  68. function ina226.init(ina226_i2c, conf, cal)
  69. i2cid = ina226_i2c
  70. if not conf then
  71. conf = {0x47,0x27}
  72. end
  73. if not cal then
  74. cal = {0x0A,0x00}
  75. end
  76. if chip_check() then
  77. ina226_send(INA226_CONFIG_REG,0x80,0x00)
  78. sys.wait(20)
  79. ina226_send(INA226_CONFIG_REG, table.unpack(conf))-- 0100 0111 0010 0111
  80. ina226_send(INA226_CALIBRA_REG, table.unpack(cal))--5.12 / (0.1 * 0.02)
  81. return true
  82. end
  83. end
  84. --[[
  85. 获取 ina226 分压电压数据
  86. @api ina226.get_data()
  87. @return table ina226 数据
  88. @usage
  89. local ina226_data = ina226.get_data()
  90. log.info("ina226_data", "shunt_voltage",ina226_data.shunt_voltage,"bus_voltage",ina226_data.bus_voltage,"power",ina226_data.power,"current",ina226_data.current)
  91. ]]
  92. function ina226.get_data()
  93. local ina226_data = {}
  94. local shunt = ina226_recv_short(INA226_SHUNT_VOL_REG)
  95. -- print("shunt",shunt)
  96. if shunt == 0 then ina226_data.shunt_voltage = 0 else ina226_data.shunt_voltage = shunt*0.0025 end
  97. local bus = ina226_recv_short(INA226_BUS_VOL_REG)
  98. -- print("bus",bus)
  99. if bus == 0 then ina226_data.bus_voltage = 0 else ina226_data.bus_voltage = bus*1.25 end
  100. local power = ina226_recv_short(INA226_POWER_REG)
  101. -- print("power",power)
  102. if power == 0 then ina226_data.power = 0 else ina226_data.power = power*0.5 end
  103. local current = ina226_recv_short(INA226_CURRENT_REG)
  104. -- print("current",current)
  105. if current == 0 then ina226_data.current = 0 else ina226_data.current = current*0.02 end
  106. return ina226_data
  107. end
  108. return ina226