|
一、项目名称: 基于树莓派伏安表采集系统 二、项目概述: 本项目旨在开发一款基于树莓派采集负载设备的电压,电流,功率的系统,并可以在上位机上显示实时数据,并记录分析。采用电流监测芯片,来自于TI的INA226,控制和数据传输接口为IIC总线,可以检测最大36V,4A,其精度为1ma。
三、硬件部分 核心部分: - ? 处理器?:[color=var(--cos-color-text-link)]Broadcom BCM2712四核[color=var(--cos-color-text-link)]Arm Cortex-A76处理器,主频为2.4 GHz,带有加密扩展,每核512KB二级缓存,2MB共享L3缓存。
- ? 内存?:提供1GB、2GB、4GB和8GB四种运行内存版本。
- ? 存储?:支持高速SDR104模式的[color=var(--cos-color-text-link)]MicroSD卡插槽,性能是[color=var(--cos-color-text-link)]树莓派4的两倍。
- ? 视频输出?:两个[color=var(--cos-color-text-link)]HDMI端口,最高支持4Kp60分辨率,支持HDR。
- ? 网络连接?:千兆以太网RJ45接口,支持双频802.11ac Wi-Fi 5和蓝牙5.0/低功耗蓝牙(BLE)。
- ? USB接口?:两个USB 3.0接口和两个USB 2.0接口,支持同时5Gbps操作。
- ? 其他特性?:配备了实时时钟(RTC)、电源按钮、UART调试连接器等。
采集部分: INA226是一种电流电压监测器,具有I2C或SMBUS兼容接口。该设备监测电流电压降和总线供电电压。可编程的校准值、转换时间和平均值,结合内部乘法器,使得直接读出电流(安培)和功率(瓦特)成为可能。INA226感知的电流是在公共模式总线电压上,该电压可以独立于供电电压在0V至36V之间变化。该设备从单一2.7V至5.5V的供电中工作,典型的供电电流为330μA。该设备在-40°C至125°C的工作温度范围内指定,并在I2C兼容接口上具有最多16个可编程地址。 接口: 原理图如下:
四、软件部分 - import smbus
- import serial
- import time
- # INA226默认I2C地址
- INA226_ADDRESS = 0x40
- # 寄存器地址
- INA226_REG_CONFIG = 0x00
- INA226_REG_SHUNTVOLTAGE = 0x01
- INA226_REG_BUSVOLTAGE = 0x02
- INA226_REG_POWER = 0x03
- INA226_REG_CURRENT = 0x04
- INA226_REG_CALIBRATION = 0x05
- # 配置寄存器设置
- INA226_CONFIG = 0x4127 # 默认配置,平均模式1,总线电压转换时间1.1ms,分流电压转换时间1.1ms
- # 初始化I2C总线
- bus = smbus.SMBus(1) # Raspberry Pi使用I2C总线1
- # 初始化UART
- uart = serial.Serial("/dev/serial0", baudrate=9600, timeout=1) # 使用默认串口,波特率9600
- def write_register(address, register, value):
- bus.write_i2c_block_data(address, register, [(value >> 8) & 0xFF, value & 0xFF])
- def read_register(address, register):
- data = bus.read_i2c_block_data(address, register, 2)
- return (data[0] << 8) | data[1]
- def ina226_init():
- write_register(INA226_ADDRESS, INA226_REG_CONFIG, INA226_CONFIG)
- # 设置校准寄存器,假设分流电阻为0.1欧姆,最大预期电流为3.2A
- calibration_value = int(0.00512 / (0.1 * 0.001))
- write_register(INA226_ADDRESS, INA226_REG_CALIBRATION, calibration_value)
- def ina226_read_shunt_voltage():
- shunt_voltage = read_register(INA226_ADDRESS, INA226_REG_SHUNTVOLTAGE)
- return shunt_voltage * 0.0000025 # 转换为伏特
- def ina226_read_bus_voltage():
- bus_voltage = read_register(INA226_ADDRESS, INA226_REG_BUSVOLTAGE)
- return (bus_voltage >> 3) * 0.001 # 转换为伏特
- def ina226_read_current():
- current = read_register(INA226_ADDRESS, INA226_REG_CURRENT)
- return current * 0.001 # 转换为安培
- def ina226_read_power():
- power = read_register(INA226_ADDRESS, INA226_REG_POWER)
- return power * 0.0025 # 转换为瓦特
- def send_data_via_uart(data):
- uart.write(data.encode()) # 将数据编码为字节并发送
- if __name__ == "__main__":
- ina226_init()
- time.sleep(0.1) # 等待初始化完成
- while True:
- shunt_voltage = ina226_read_shunt_voltage()
- bus_voltage = ina226_read_bus_voltage()
- current = ina226_read_current()
- power = ina226_read_power()
- # 格式化数据
- data = f"Shunt Voltage: {shunt_voltage:.4f} V, Bus Voltage: {bus_voltage:.4f} V, Current: {current:.4f} A, Power: {power:.4f} W\n"
- # 通过UART发送数据
- send_data_via_uart(data)
- print(data) # 在终端打印数据(可选)
- time.sleep(1) # 每秒读取一次
复制代码
代码说明I2C部分:
使用smbus库与INA226通信。 初始化INA226并读取电流、电压和功率数据。
UART部分: 主循环:
上位机显示软件
|