INA 3221

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
Всем здравствуйте, поискав на форуме тему о работе модуля INA3221 (трехканальная). Не найдя решения по данному вопросу хочу спросить.
Примеры бибилиотек дают не совсем ясную картину, посмотрев их не особо понял работу, далее по даташиту тоже порядком ничего нет. Вопрос в следующем прикрепил скетч.

переменные:
ina3221.setBusConversionTime(4156);           /* Время конверсии в микросекундах (7 = 8.244 ms) */
ina3221.setShuntConversionTime(4156);         /* Время конверсии в микросекундах (Время преобразования напряжения шины. Значение по умолчанию 1,1 мс — это значение сброса устройства при включении питания. */
                                              /* 0 = 140 μs, 1 = 204 μs, 2 = 332 μs, 3 = 588 μs, 4 = 1.1 ms (default), 5 = 2.116 ms, 6 = 4.156 ms, 7 = 8.244 ms */
ina3221.setAveragingMode(1);                  /* Среднее количество чтений n раз (0 = 1 (default) 1 = 4, 2 = 16, 3 = 64, 4 = 128, 5 = 256, 6 = 512, 7 = 1024) */
Ругается конкретно 1-2 строку что то не так с записью значения, как его правильно записать, возможно что-то по скетчу не дописано.

invalid conversion from 'int' to 'ina3221_conv_time_t' [-fpermissive]
Что не так и что нужно сделать подскажите, возможно есть примеры и тд. Благодарен за любую помощь или наводку, сайт, видео и тд.
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
2,911
865
@MashukovAntonVictorovich, а что это за странные магические цифры в коде - 4156? В этом месте должны быть именованные константы из библиотеки.
Откуда вы этот код взяли?
 

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
@bort707, Это не магические цифры я предположил согласно примерам скетча INA229 там именно так описывается значение и в даташите так же написано,у INA3221 иначе сделан этот момент на зарубежном сайте нашел информацию такого характера как указан в примечании напротив. Соответственно предположив по аналогии, но я так понимаю что должно быть целое число типа int uint16_t

setBusConversionTime(ina3221_conv_time_t convTime);
setShuntConversionTime(ina3221_conv_time_t convTime);
setAveragingMode(ina3221_avg_mode_t mode);


// Conversion times
typedef enum {
INA3221_REG_CONF_CT_140US = 0,
INA3221_REG_CONF_CT_204US,
INA3221_REG_CONF_CT_332US,
INA3221_REG_CONF_CT_588US,
INA3221_REG_CONF_CT_1100US,
INA3221_REG_CONF_CT_2116US,
INA3221_REG_CONF_CT_4156US,
INA3221_REG_CONF_CT_8244US
} ina3221_conv_time_t;

// Averaging modes
typedef enum {
INA3221_REG_CONF_AVG_1 = 0,
INA3221_REG_CONF_AVG_4,
INA3221_REG_CONF_AVG_16,
INA3221_REG_CONF_AVG_64,
INA3221_REG_CONF_AVG_128,
INA3221_REG_CONF_AVG_256,
INA3221_REG_CONF_AVG_512,
INA3221_REG_CONF_AVG_1024
} ina3221_avg_mode_t;

class INA3221 {
// Configuration register
typedef struct {
uint16_t mode_shunt_en : 1;
uint16_t mode_bus_en : 1;
uint16_t mode_continious_en : 1;
uint16_t shunt_conv_time : 3;
uint16_t bus_conv_time : 3;
uint16_t avg_mode : 3;
uint16_t ch3_en : 1;
uint16_t ch2_en : 1;
uint16_t ch1_en : 1;
uint16_t reset : 1;
} __attribute__((packed)) conf_reg_t;


из файла INA3221.cpp:
[SIZE=12px]void INA3221::setAveragingMode(ina3221_avg_mode_t mode) {
    conf_reg_t conf_reg;

    _read(INA3221_REG_CONF, (uint16_t *)&conf_reg);
    conf_reg.avg_mode = mode;
    _write(INA3221_REG_CONF, (uint16_t *)&conf_reg);
}

void INA3221::setBusConversionTime(ina3221_conv_time_t convTime) {
    conf_reg_t conf_reg;

    _read(INA3221_REG_CONF, (uint16_t *)&conf_reg);
    conf_reg.bus_conv_time = convTime;
    _write(INA3221_REG_CONF, (uint16_t *)&conf_reg);
}

void INA3221::setShuntConversionTime(ina3221_conv_time_t convTime) {
    conf_reg_t conf_reg;

    _read(INA3221_REG_CONF, (uint16_t *)&conf_reg);
    conf_reg.shunt_conv_time = convTime;
    _write(INA3221_REG_CONF, (uint16_t *)&conf_reg);
}[/SIZE]
Вопрос как правильно записать данное значение нужно его перевести, или обозначить. Наведите на мысли.
 

bort707

★★★★★★✩
21 Сен 2020
2,911
865
так и записать, используя константы из библиотеки, например
setBusConversionTime(INA3221_REG_CONF_CT_204US );
В этом списке перечислены возможные варианты:
// Conversion times
typedef enum {
INA3221_REG_CONF_CT_140US = 0,
INA3221_REG_CONF_CT_204US,
INA3221_REG_CONF_CT_332US,
INA3221_REG_CONF_CT_588US,
INA3221_REG_CONF_CT_1100US,
INA3221_REG_CONF_CT_2116US,
INA3221_REG_CONF_CT_4156US,
INA3221_REG_CONF_CT_8244US
} ina3221_conv_time_t;
заменять на числа их не нужно
 
Изменено:
  • Лойс +1
Реакции: MashukovAntonVictorovich

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
Разобрался по аналогии на гитхабе по ина226, действительно писать и переводить ничего не нужно было просто нужно было подставить значения из бибилотеки и все. В любом случае спасибо за совет. Просьба тему не закрывать так как делаю вольтметр и возможно появятся еще вопросы по данной тематике. На этом пока что всё.
 

bort707

★★★★★★✩
21 Сен 2020
2,911
865
Сколько каналов планируете использовать на ИНА3221 ?
Имейте в виду, что модуль "с особенностями", скажем каналы не являются независимыми и, например, сделать вольтметр для трех последовательных батареек на этом модуле нельзя.
 

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
@bort707, Может неправильно выразился, это будет ЛБП с дисплеем, использовать хочу по полной все 3 канала на который будут выводиться данные CH1 - это для USB, CH2 питание паяльника, CH3 выход для подключения разных самоделок от 2-24Вольт, единственный момент который меня смутил это то что каждый канал может потянуть только 1.6А макс. Вопрос можно ли увеличить этот момент, но врое как я читал что само АЦП не может этого делать. Возможно есть другой выход и тд. В видео одном видел парень делал на INA229 четко работает.
 

bort707

★★★★★★✩
21 Сен 2020
2,911
865
использовать хочу по полной все 3 канала на который будут выводиться данные CH1 - это для USB, CH2 питание паяльника, CH3 выход для подключения разных самоделок от 2-24Вольт,
Боюсь, что это невозможно без существенной доработки модуля. Как я уже писал, все три канала модуля связаны между собой и измерять ими токи трех независимых источников питания не получится. Чтобы исправить это, нужно резать одни дорожки на плате исоединять перемычками другие.
Подробнее тут
и тут

единственный момент который меня смутил это то что каждый канал может потянуть только 1.6А макс.
А вот это как раз не проблема. У каждого канала свой шунт, его сопротивление задает предел измеряемого тока. Чтобы увеличить измеряемый ток в 2 раза, надо заменить шунт на другой, с сопротивлением в 2 раза меньшим.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
334
104
@bort707,
Сейчас на Али есть модули с независимой разводкой. У них каналы подписаны слева направо CH1 CH2 CH3 . Конечно есть вероятность, что пришлют не тот, но есть продавцы у которых таких жалоб нет. https://aliexpress.ru/item/4001104619430.html
 

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
Подскажите как инициализировать INNA3221 на другие пины например сказать ей что SDA - D6, SCL-D8
Подключение производится к плате Node MCU V3, Так же к ней подключен TFT ST7789 дисплей по шине SPI где задействованы пины D1,D2 на которых у node mcu заведены SCL, SDA, можно конечно переназначить пины для дисплея и подключить ina3221 к пинам D1 и D2 по шине i2c, Но есть одно НО если я переназначаю пины дисплея TFT_CS - D2 и TFT_DC - D1, чтобы туда подключить "Инну3221"То после переназначения например на D6 D8 либо любые другие пины, дисплей отказывается работать, в связи с чем вопрос ? можно ли тогда для "Инны" указать пины D6 D8 как SDA и SCL. Спасибо.
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
334
104
@MashukovAntonVictorovich,
Для общения по TWI (I2C) используется библиотека Wire которая работает с аппаратным TWI (I2C). Аппаратный I2C выведен на фиксированные выводы (в случае UNO и подобных), переназначить нельзя. Если очень надо использовать другие выводы, то можно попробовать использовать библиотеку SoftWire. Но я советую сначала использовать стандартные пины, и если заработает, то пробовать переносить на SoftWire (если без этого реально не обойтись). Сам я такого не делал.

Дополнено позже. Т.к. я не обратил внимания, что в данном случае используется ESP8266 у которой I2C можно использовать на разных выводах, то написанное выше не имеет отношения к данному случаю.
 
Изменено:

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
@Bruzzer,
Удалось мне все таки подружить работу SPI и I2C на плате node mcu v3, все работает дисплей по SPI, INA3221 по I2C.
К сожалению нет моментов в библиотеке вывода mA, mV, mW, Ah, kWh, может кто то знает как это сделать?
 

bort707

★★★★★★✩
21 Сен 2020
2,911
865
@MashukovAntonVictorovich,что же оно выводит, если этого всего нет?
 

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
@bort707,
Библиотека для ina3221 одна всего и так написанное при царе горохе, в остальных уже все перековеркано и переписано людьми под себя, а разбираться в чужих библиотеках как то не хочется. А в основной библиотеке только Amper&Volt все на этом
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,847
595
44
@MashukovAntonVictorovich, В OpenSource всегда так. Ты либо не умеешь программировать и пользуешься готовыми библиотеками. Либо умеешь программировать и допиливаешь библиотеки под себя или пишешь свои.
 

MashukovAntonVictorovich

✩✩✩✩✩✩✩
31 Окт 2021
16
0
39
Как же без ботанов на форумах без них никуда, надо же умом блеснуть вместо того чтобы помочь, или на форумах должны быть только умники, тогда на кой им ваш форум, если вместо помощь слышишь, а ты это знаешь? Знаю! Просто думал что это умеет делать сама библиотека. Ну и тут тоже ботаник видимо писал что SPI с I2C не фурыкают, однако очень даже фурыкают и без проблем как оказалось позже. Есть люди помогли разобраться и навели на верный мануал, а Вы здесь видимо для того чтобы советы давать, а делом то никак видимо не получается.
Поэтому дабы не тратить ваше время, подожду может кто действительно делом поможет.
 

bort707

★★★★★★✩
21 Сен 2020
2,911
865
подожду может кто действительно делом поможет.
Каким делом? Вы серьёзно что ли? Написать вам код чтоб амперы в миллиамперы переводить? Сами одно число на другое поделить не сможете?
тут тоже ботаник видимо писал что SPI с I2C не фурыкают, однако очень даже фурыкают и без проблем как оказалось позже.
Вы что-то перепутали, никто вам такого не писал.
spi и i2c отлично уживается в одном коде.
 
Изменено: