Jump to content

Помогите найти ошибку в схеме


Go to solution Solved by korsaj,

Recommended Posts

пришлось отказатся от этой платы, поставил обычную NANO и все заработало. а там какая то несовместимость по частоте получалась.

Теперь появился вопрос по ina219 :

я выпаял родной резистор на 0.1 Ом и подключил шунт на 20А, 75мВ, 3750мкОм

 

Opera Снимок_2022-07-09_145903_prom.ua.png

Opera Снимок_2022-07-09_145922_prom.ua.png

Link to comment
Share on other sites

Акция: снижена цена на 48 В источники питания MEAN WELL в Компэл

Компэл снизил цены на популярные серии ИП MEAN WELL с выходным напряжением 48 В. В акции участвуют источники питания с креплением на DIN-рейку и шасси в диапазоне мощности от 150 до 500 Вт.

Все источники питания обладают трехлетней гарантией, имеют каскад коррекции мощности (ККМ; PFC) и предназначены для систем промавтоматизации и производственно-технологического оборудования, а также для охранных систем, систем оповещения и других приложений, с питающим напряжением 48 В. Подробнее>>

нашел более интересную библиотеку INA219_WE

естественно , что изменить значения только в скетче ничего не даст кроме ошибки, нужно редактировать конфиг

This is a library for the INA219 Current Sensor Module
*
* You'll find an example which should enable you to use the library. 
*
* You are free to use it, change it or build on it. In case you like 
* it, it would be cool if you give it a star.
* 
* If you find bugs, please inform me!
* 
* Written by Wolfgang (Wolle) Ewald
* https://wolles-elektronikkiste.de/en/ina219-current-and-power-sensor (English)
* https://wolles-elektronikkiste.de/ina219 (German)
*
*******************************************/

#include "INA219_WE.h"

INA219_WE::INA219_WE(int addr){
#ifndef USE_TINY_WIRE_M_
    _wire = &Wire;
#endif
    i2cAddress = addr;   
}

INA219_WE::INA219_WE(){
#ifndef USE_TINY_WIRE_M_
    _wire = &Wire;
#endif
    i2cAddress = 0x40;   
}

#ifndef USE_TINY_WIRE_M_
INA219_WE::INA219_WE(TwoWire *w, int addr){
    _wire = w;
    i2cAddress = addr; 
}

INA219_WE::INA219_WE(TwoWire *w){
    _wire = w;
    i2cAddress = 0x40;
}
#endif
    
bool INA219_WE::init(){ 
    if( !reset_INA219() )
    {
        return false;
    }
    setADCMode(BIT_MODE_12);
    setMeasureMode(CONTINUOUS);
    setPGain(PG_320);
    setBusRange(BRNG_32);
    shuntFactor = 1.0;
    overflow = false;
    shuntVoltageOffset = 0.0;
    offsetIsSet = false;
    
    return true;
}

bool INA219_WE::reset_INA219(){
    byte ack = writeRegister(INA219_CONF_REG, INA219_RST); 
    return ack == 0;
}

void INA219_WE::setCorrectionFactor(float corr){
    calValCorrected = calVal * corr;
    writeRegister(INA219_CAL_REG, calValCorrected);
}

void INA219_WE::setShuntVoltOffset_mV(float offs){
    shuntVoltageOffset = offs;
    offsetIsSet = true; 
}

void INA219_WE::setADCMode(INA219_ADC_MODE mode){
    deviceADCMode = mode;
    uint16_t currentConfReg = readRegister(INA219_CONF_REG);
    currentConfReg &= ~(0x0780);  
    currentConfReg &= ~(0x0078);
    uint16_t adcMask = mode<<3;
    currentConfReg |= adcMask;
    adcMask = mode<<7;
    currentConfReg |= adcMask;
    writeRegister(INA219_CONF_REG, currentConfReg);
}

void INA219_WE::setMeasureMode(INA219_MEASURE_MODE mode){
    deviceMeasureMode = mode;
    uint16_t currentConfReg = readRegister(INA219_CONF_REG);
    currentConfReg &= ~(0x0007);
    currentConfReg |= deviceMeasureMode;
    writeRegister(INA219_CONF_REG, currentConfReg);
}

void INA219_WE::setPGain(INA219_PGAIN gain){
    devicePGain = gain;
    uint16_t currentConfReg = readRegister(INA219_CONF_REG);
    currentConfReg &= ~(0x1800);
    currentConfReg |= devicePGain;
    writeRegister(INA219_CONF_REG, currentConfReg);
    
    switch(devicePGain){
        case PG_40:
            calVal = 20480;
            currentDivider_mA = 50.0;
            pwrMultiplier_mW = 0.4;
            shuntOverflowLimit = 4000;
            break;
        case PG_80:
            calVal = 10240;
            currentDivider_mA = 25.0;
            pwrMultiplier_mW = 0.8;
            shuntOverflowLimit = 8000;
            break;
        case PG_160:
            calVal = 8192;
            currentDivider_mA = 20.0;
            pwrMultiplier_mW = 1.0;
            shuntOverflowLimit = 16000;
            break;
        case PG_320:
            calVal = 4096;
            currentDivider_mA = 10.0;
            pwrMultiplier_mW = 2.0;
            shuntOverflowLimit = 32000;
            break;
    }
    
    writeRegister(INA219_CAL_REG, calVal);
            
}

void INA219_WE::setBusRange(INA219_BUS_RANGE range){
    deviceBusRange = range;
    uint16_t currentConfReg = readRegister(INA219_CONF_REG);
    currentConfReg &= ~(0x2000);
    currentConfReg |= deviceBusRange;
    writeRegister(INA219_CONF_REG, currentConfReg);
}

void INA219_WE::setShuntSizeInOhms(float shuntSize){
    shuntFactor = shuntSize / 0.1;
}

float INA219_WE::getShuntVoltage_mV(){
    int16_t val;
    val = (int16_t) readRegister(INA219_SHUNT_REG);
    if((abs(val))== shuntOverflowLimit){
        overflow = true;
    }
    else{
        overflow = false;
    }
    return (val * 0.01);
}


float INA219_WE::getBusVoltage_V(){
    uint16_t val;
    val = readRegister(INA219_BUS_REG);
    val = ((val>>3) * 4);
    return (val * 0.001);
}


float INA219_WE::getCurrent_mA(){
    int16_t val;
    int16_t offsetCurrent = 0;
    val = (int16_t)readRegister(INA219_CURRENT_REG);
    if(offsetIsSet){
        offsetCurrent = (int16_t)(shuntVoltageOffset * 100.0 * calVal / 4096.0);
    }
    return ((val - offsetCurrent) / (currentDivider_mA * shuntFactor));
}

float INA219_WE::getBusPower(){
    uint16_t val;
    float busPwr = 0.0;
    if(offsetIsSet){
        float current = getCurrent_mA();
        float busVolt = getBusVoltage_V();
        busPwr = current * busVolt;   
    }
    else{
        val = readRegister(INA219_PWR_REG);
        busPwr = val * pwrMultiplier_mW / shuntFactor;
    }
    return busPwr;
}

bool INA219_WE::getOverflow(){
    uint16_t val;
    val = readRegister(INA219_BUS_REG);
    if(val & 1){ 
        overflow = true;
    }
    return overflow;
}

void INA219_WE::startSingleMeasurement(){
    uint16_t val = readRegister(INA219_BUS_REG); // clears CNVR (Conversion Ready) Flag
    val = readRegister(INA219_CONF_REG);
    writeRegister(INA219_CONF_REG, val);
    uint16_t convReady = 0x0000;
    while(!convReady){
        convReady = ((readRegister(INA219_BUS_REG)) & 0x0002); // checks if sampling is completed
    }
}


bool INA219_WE::startSingleMeasurement(unsigned long timeout_us){
    uint16_t val = readRegister(INA219_BUS_REG); // clears CNVR (Conversion Ready) Flag
    val = readRegister(INA219_CONF_REG);
    writeRegister(INA219_CONF_REG, val);
    uint16_t convReady = 0x0000;
    unsigned long convStart = micros();
    while(!convReady && (micros() - convStart < timeout_us)){
        convReady = ((readRegister(INA219_BUS_REG)) & 0x0002); // checks if sampling is completed
    }
    if(convReady) {
        return true;
    } else {
        return false;
    }
}

void INA219_WE::powerDown(){
    confRegCopy = readRegister(INA219_CONF_REG);
    setMeasureMode(POWER_DOWN);
}

void INA219_WE::powerUp(){
    writeRegister(INA219_CONF_REG, confRegCopy);
    delayMicroseconds(40);  
}   

#ifndef USE_TINY_WIRE_M_
uint8_t INA219_WE::writeRegister(uint8_t reg, uint16_t val){
  _wire->beginTransmission(i2cAddress);
  uint8_t lVal = val & 255;
  uint8_t hVal = val >> 8;
  _wire->write(reg);
  _wire->write(hVal);
  _wire->write(lVal);
  return _wire->endTransmission();
}
  
uint16_t INA219_WE::readRegister(uint8_t reg){
  uint8_t MSByte = 0, LSByte = 0;
  uint16_t regValue = 0;
  _wire->beginTransmission(i2cAddress);
  _wire->write(reg);
  _wire->endTransmission(false);
  _wire->requestFrom(i2cAddress,2);
  if(_wire->available()){
    MSByte = _wire->read();
    LSByte = _wire->read();
  }
  regValue = (MSByte<<8) + LSByte;
  return regValue;
}
#else
uint8_t INA219_WE::writeRegister(uint8_t reg, uint16_t val){
  TinyWireM.beginTransmission(i2cAddress);
  uint8_t lVal = val & 255;
  uint8_t hVal = val >> 8;
  TinyWireM.send(reg);
  TinyWireM.send(hVal);
  TinyWireM.send(lVal);
  return TinyWireM.endTransmission();
}
  
uint16_t INA219_WE::readRegister(uint8_t reg){
  uint8_t MSByte = 0, LSByte = 0;
  uint16_t regValue = 0;
  TinyWireM.beginTransmission(i2cAddress);
  TinyWireM.send(reg);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(i2cAddress,2);
  MSByte = TinyWireM.receive();
  LSByte = TinyWireM.receive();
  regValue = (MSByte<<8) + LSByte;
  return regValue;
}
#endif

 

я правильно понимаю, что нужно мои параметры вписать в эту часть кода?

Screenshot_7.png

и сразу же еще один вопрос, с этим шунтом диапазон тока я увеличиваю, а по напряжению как это сделать правильно?

Link to comment
Share on other sites

Химические элементы FANSO EVE Energy для питания беспроводных датчиков
Литиевые батарейки различного химического состава и разных типоразмеров широко используются в беспроводных датчиках систем сбора данных, промышленной автоматики и систем умного дома. И в любом из многочисленных вариантов использования беспроводных датчиков основными требованиями к их работе являются автономность и бесперебойность функционирования.
Главным условием, гарантирующим такую работу, является правильный выбор элемента питания для датчика.

Подробнее >>

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

    • Нет, автор ничего об этом не писал. 12 транзистор (регулирующий ток покоя) стоит на плате. 
    • VT12 на радиаторе вместе с выходными ?
    • Один канал собрал ещё летом, пару дней назад собрался с духом собрал второй канал и буфер, запустилось сразу, ППК настроился элементарно, LM318 никаких фокусов не преподнесли, как в прошлый раз.   
    • Господа, товарищи, подскажите Христа ради. У меня интерес практический, и ставить эксперименты не хочется. Вот схема. Собрал. Автор обещал при токе покоя 50 мА стабильность и покой. Фигушки - греются 13 и 14 транзисторы. Сопротивлением R16 я выставил минимальное значение тока покоя. Но проходит полторы две минуты и транзисторы нагреваются. Напряжение на эмиттерных резисторах R25 и R26 постепенно растет и соответственно ток... Можно ли увеличить сопротивление R22? Или надо переустановить 13 и 14 транзисторы на радиаторы 15 и 16 транзистора соответственно? И еще... можно ли ставить меньший ток покоя? Не повредит ли это качеству УНЧ? И вообще, правильно ли я считаю, что ток эмиттерного резистора (при отсутствии сигнала) это ток покоя? Я знаю физику, но аналоговую схемотехнику собираю впервые.   
    • Медь рыжая, а латунь желтая. Медь мягкая, латунь жесткая. Определенно это медь. Чем покрыта не знаю, но паяется хорошо. Не магнитится. Пользуюсь лет 15 уже.
    • Найдите в сети книгу "Головков А.В. Любицкий В.Б. Блоки питания для системных модулей типа IBM PC-XT/AT". Там все эти цепи подробно расписаны. Q10 без нагрузки как бы греться не с чего.
×
×
  • Create New...