定義
namespace { uint8_t INA226_device_address = 0x80; enum INA226_register { configuration_register = 0x00, shunt_voltage = 0x01, bus_voltage = 0x02, }; }
おまじない
I2C_HandleTypeDef *hi2c = &hi2c1;
レジスタの読み出し
int8_t data[2] = { 0 }; uint16_t *ptr = (uint16_t *)data; HAL_StatusTypeDef status = HAL_OK; status = HAL_I2C_Mem_Read( hi2c, INA226_device_address, INA226_register::bus_voltage, I2C_MEMADD_SIZE_8BIT, data, sizeof(data), 10); if (status == HAL_OK) { int16_t value = __REVSH(*ptr); printf("voltage: %.2f V\n", value * 1.25 / 1000); } status = HAL_I2C_Mem_Read( hi2c, INA226_device_address, INA226_register::shunt_voltage, I2C_MEMADD_SIZE_8BIT, data, sizeof(data), 10); if (status == HAL_OK) { int16_t value = __REVSH(*ptr); printf("current: %.2f A\n", value * 1.25 / 1000); }
CubeでI2Cの初期化を行ってしまえば、あとはMem_Readで読み出せる。いちおうI2CのEEPROMがターゲットだろうけど、普通にI2Cデバイスの読み書きに使える。
エンディアンが違うのでREVSHで変換する必要があるのが面倒。
INA226はリセット時で約900Hzの継続サンプリングモードに入る。電圧/電流共にサンプリングされるので、初期設定とかは特に不要。電力を読み出すならそのあたりはいろいろ設定する必要があるはず。
ほんとはINA226のドライバクラスを作るべきなんだろうなー。
0 件のコメント:
コメントを投稿