Autor Tema: Diseñando el medidor de Corriente, tension y potencia  (Leído 31871 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #30 en: 20 de Febrero de 2014, 23:06:29 »
Hoy es mi día de suerte! ya probe con exito el OSD y ahora me puse otra vez con la medicion con el INA219.
Lo último que postie fue que no estaba midiendo bien, que habia variaciones en la medicion y estaba estancado en eso... bueno, hoy pensando un poco descubrí el error. El tema es que no estaba conectando el GND de la fuente de "potencia" con el GND del INA219. Por eso las mediciones erroneas.

Bien, solucionado eso, me puse con la configuracion de la calibracion para poder medir corriente y potencia.

En la hoja de datos está toda la serie de cálculos que hay que ir haciendo para obtener el valor de calibracion. Como aún no tengo el shunt definitivo, hice los cálculos a mano en papel mas o menos, como para medir algo. Cuando tenga el shunt definitivo ahí mostraré como hacer bien los cálculos.

Veamos entonces como quedó el código de mi uC:

main.c

Código: [Seleccionar]
#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif
volatile uint32_t msTicks;
__INLINE static void delay_ms (uint32_t delayTicks) {
  uint32_t currentTicks;
  currentTicks = msTicks; // read current tick counter
  while ((msTicks - currentTicks) < delayTicks);
}

#include <cr_section_macros.h>
#include <NXP/crp.h>
#include "uart2.h"
#include <stdio.h>
#include "i2c.h"
#include "INA219.h"

void SysTick_Handler(void) {
msTicks++; /* increment counter necessary in Delay() */
}

/*******************************************************************************
**   Main Function  main()
*******************************************************************************/
int main (void){
signed short data=0;
unsigned char resultado=0;

//Configuro el SysTick para que interrumpa cada 1mseg
if (SysTick_Config(SystemCoreClock / 1000000)) {
while (1);
}

I2C1Init(); // Inicializo el I2C1
UART2_Init(115200); // Inicializo el UART a 115200

UART2_PrintString ("\r\nINA219\r\n");
UART2_PrintString ("======== elgarbe ==========\r\n");

INA219_write_reg(INA219_REG_CALIBRATION, 2560);

resultado=INA219_read_reg(INA219_REG_CALIBRATION, &data);
UART2_PrintString("\r\nConfiguracion: ");
uart2_printUint32(data, 10);
delay_ms(2000000);

while ( 1 ){
resultado=INA219_read_reg(INA219_REG_SHUNTVOLTAGE, &data);
UART2_PrintString("\r\nTens. sht: ");
uart2_printDouble(data/10000.0, 3);
delay_ms(2000);
resultado=INA219_read_reg(INA219_REG_BUSVOLTAGE, &data);
UART2_PrintString("V\tTens. bus: ");
uart2_printDouble(data/1000.0, 3);
delay_ms(2000);
resultado=INA219_read_reg(INA219_REG_POWER, &data);
UART2_PrintString("V\tPot : ");
uart2_printDouble(data/1000.0, 3);
delay_ms(2000);
resultado=INA219_read_reg(INA219_REG_CURRENT, &data);
UART2_PrintString("W\tCorr : ");
uart2_printDouble(data/10000.0, 3);
UART2_PrintString("A");
delay_ms(300000);
}
}

Como primer dato, la funcion delay_ms es en realidad delay_us, tengo configurado el SysTick para 1useg.
Bueno, luego de inicializar los buses, grabo el registro de calibracion del INA con el valor 2560. Luego lo leo para verificar que se alla almacenado y de paso para mostrarlo en el terminal.

Luego en el bucle infinito llamo a la funcion de leer registros del INA y le paso la direccion de la variable como puntero. Luego divid por 1000 o 10000 dependiendo el caso y muestro los valores.

El resultado:



Bueno, ya van quedando los módulos de a poco... ahora hay que empezar a juntar cosas!

Salludos!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #31 en: 20 de Febrero de 2014, 23:09:12 »
Me parece a mi o la potencia es la mitad de la que debería ser????....
-
Leonardo Garberoglio

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #32 en: 20 de Febrero de 2014, 23:51:23 »
Podrías compartirme las librerías del INA219 en C ??
Voy a trabajar en CCS para PIC, pero igual me ahorras trabajo... ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #33 en: 21 de Febrero de 2014, 20:43:06 »
Marcos, está lejos de ser una librería!!! te dejo el código que estoy usando.

INA219.h

Código: [Seleccionar]
#ifndef INA219_H_
#define INA219_H_

#include "i2c.h"

extern volatile uint8_t I2CMasterBuffer[I2C_PORT_NUM][BUFSIZE];
extern volatile uint8_t I2CSlaveBuffer[I2C_PORT_NUM][BUFSIZE];
extern volatile uint32_t I2CReadLength[I2C_PORT_NUM];
extern volatile uint32_t I2CWriteLength[I2C_PORT_NUM];

/*=========================================================================
    I2C ADDRESS/BITS
    -----------------------------------------------------------------------*/
    #define INA219_WRITE_ADDR                         (0x80)    // 1000000 (A0+A1=GND)
    #define INA219_READ_ADDR                          (0x81)
/*=========================================================================*/

/*=========================================================================
    CONFIG REGISTER (R/W)
    -----------------------------------------------------------------------*/
    #define INA219_REG_CONFIG                      (0x00)
    /*---------------------------------------------------------------------*/
    #define INA219_CONFIG_RESET                    (0x8000)  // Reset Bit

    #define INA219_CONFIG_BVOLTAGERANGE_MASK       (0x2000)  // Bus Voltage Range Mask
    #define INA219_CONFIG_BVOLTAGERANGE_16V        (0x0000)  // 0-16V Range
    #define INA219_CONFIG_BVOLTAGERANGE_32V        (0x2000)  // 0-32V Range

    #define INA219_CONFIG_GAIN_MASK                (0x1800)  // Gain Mask
    #define INA219_CONFIG_GAIN_1_40MV              (0x0000)  // Gain 1, 40mV Range
    #define INA219_CONFIG_GAIN_2_80MV              (0x0800)  // Gain 2, 80mV Range
    #define INA219_CONFIG_GAIN_4_160MV             (0x1000)  // Gain 4, 160mV Range
    #define INA219_CONFIG_GAIN_8_320MV             (0x1800)  // Gain 8, 320mV Range

    #define INA219_CONFIG_BADCRES_MASK             (0x0780)  // Bus ADC Resolution Mask
    #define INA219_CONFIG_BADCRES_9BIT             (0x0080)  // 9-bit bus res = 0..511
    #define INA219_CONFIG_BADCRES_10BIT            (0x0100)  // 10-bit bus res = 0..1023
    #define INA219_CONFIG_BADCRES_11BIT            (0x0200)  // 11-bit bus res = 0..2047
    #define INA219_CONFIG_BADCRES_12BIT            (0x0400)  // 12-bit bus res = 0..4097

    #define INA219_CONFIG_SADCRES_MASK             (0x0078)  // Shunt ADC Resolution and Averaging Mask
    #define INA219_CONFIG_SADCRES_9BIT_1S_84US     (0x0000)  // 1 x 9-bit shunt sample
    #define INA219_CONFIG_SADCRES_10BIT_1S_148US   (0x0008)  // 1 x 10-bit shunt sample
    #define INA219_CONFIG_SADCRES_11BIT_1S_276US   (0x0010)  // 1 x 11-bit shunt sample
    #define INA219_CONFIG_SADCRES_12BIT_1S_532US   (0x0018)  // 1 x 12-bit shunt sample
    #define INA219_CONFIG_SADCRES_12BIT_2S_1060US  (0x0048) // 2 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_4S_2130US  (0x0050)  // 4 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_8S_4260US  (0x0058)  // 8 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_16S_8510US (0x0060)  // 16 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_32S_17MS   (0x0068)  // 32 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_64S_34MS   (0x0070)  // 64 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_128S_69MS  (0x0078)  // 128 x 12-bit shunt samples averaged together

    #define INA219_CONFIG_MODE_MASK                (0x0007)  // Operating Mode Mask
    #define INA219_CONFIG_MODE_POWERDOWN           (0x0000)
    #define INA219_CONFIG_MODE_SVOLT_TRIGGERED     (0x0001)
    #define INA219_CONFIG_MODE_BVOLT_TRIGGERED     (0x0002)
    #define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED (0x0003)
    #define INA219_CONFIG_MODE_ADCOFF              (0x0004)
    #define INA219_CONFIG_MODE_SVOLT_CONTINUOUS    (0x0005)
    #define INA219_CONFIG_MODE_BVOLT_CONTINUOUS    (0x0006)
    #define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS (0x0007)
/*=========================================================================*/

/*=========================================================================
    SHUNT VOLTAGE REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_SHUNTVOLTAGE                (0x01)
/*=========================================================================*/

/*=========================================================================
    BUS VOLTAGE REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_BUSVOLTAGE                  (0x02)
/*=========================================================================*/

/*=========================================================================
    POWER REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_POWER                       (0x03)
/*=========================================================================*/

/*=========================================================================
    CURRENT REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_CURRENT                     (0x04)
/*=========================================================================*/

/*=========================================================================
    CALIBRATION REGISTER (R/W)
    -----------------------------------------------------------------------*/
    #define INA219_REG_CALIBRATION                 (0x05)
/*=========================================================================*/

#define PORT_USED 1

void INA219_init();
unsigned char INA219_read_reg(unsigned char reg, signed short *value);
unsigned char INA219_write_reg(unsigned char reg_address, unsigned short value);

unsigned char INA219_read_reg(unsigned char reg, signed short *value){
int i;
for ( i = 0; i < BUFSIZE; i++ )
{
I2CSlaveBuffer[PORT_USED][i] = 0x00;
}
unsigned char result=0;
I2CWriteLength[PORT_USED] = 2;
I2CReadLength[PORT_USED] = 2;
I2CMasterBuffer[PORT_USED][0] = INA219_WRITE_ADDR;
I2CMasterBuffer[PORT_USED][1] = reg;
I2CMasterBuffer[PORT_USED][2] = INA219_READ_ADDR;

result=I2CEngine(PORT_USED);

*value = ((I2CSlaveBuffer[PORT_USED][0] << 8) | I2CSlaveBuffer[PORT_USED][1]);
if (reg == INA219_REG_BUSVOLTAGE){
*value = (*value >> 3) * 4;
}
return(result);
}

unsigned char INA219_write_reg(unsigned char reg_address, unsigned short value){
I2CWriteLength[PORT_USED] = 4;
I2CReadLength[PORT_USED] = 0;
I2CMasterBuffer[PORT_USED][0] = INA219_WRITE_ADDR;
I2CMasterBuffer[PORT_USED][1] = reg_address;
I2CMasterBuffer[PORT_USED][2] = ((value >> 8) & 0xFF);
I2CMasterBuffer[PORT_USED][3] = (value  & 0xFF);

return(I2CEngine( PORT_USED ));
}

#endif /* INA219_H_ */

main.c

Código: [Seleccionar]
#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif
volatile uint32_t msTicks;
__INLINE static void delay_ms (uint32_t delayTicks) {
  uint32_t currentTicks;
  currentTicks = msTicks; // read current tick counter
  while ((msTicks - currentTicks) < delayTicks);
}

#include <cr_section_macros.h>
#include <NXP/crp.h>
#include "uart2.h"
#include <stdio.h>
#include "i2c.h"
#include "INA219.h"

void SysTick_Handler(void) {
msTicks++; /* increment counter necessary in Delay() */
}

/*******************************************************************************
**   Main Function  main()
*******************************************************************************/
int main (void){
signed short data=0;
unsigned char resultado=0;

//Configuro el SysTick para que interrumpa cada 1mseg
if (SysTick_Config(SystemCoreClock / 1000000)) {
while (1);
}

I2C1Init(); // Inicializo el I2C1
UART2_Init(115200); // Inicializo el UART a 115200

UART2_PrintString ("\r\nINA219\r\n");
UART2_PrintString ("======== elgarbe ==========\r\n");

INA219_write_reg(INA219_REG_CALIBRATION, 2560);

resultado=INA219_read_reg(INA219_REG_CALIBRATION, &data);
UART2_PrintString("\r\nConfiguracion: ");
uart2_printUint32(data, 10);
delay_ms(2000000);

while ( 1 ){
resultado=INA219_read_reg(INA219_REG_SHUNTVOLTAGE, &data);
UART2_PrintString("\r\nTens. sht: ");
uart2_printDouble(data/10000.0, 3);
delay_ms(2000);
resultado=INA219_read_reg(INA219_REG_BUSVOLTAGE, &data);
UART2_PrintString("V\tTens. bus: ");
uart2_printDouble(data/1000.0, 3);
delay_ms(2000);
resultado=INA219_read_reg(INA219_REG_POWER, &data);
UART2_PrintString("V\tPot : ");
uart2_printDouble(data/1000.0, 3);
delay_ms(2000);
resultado=INA219_read_reg(INA219_REG_CURRENT, &data);
UART2_PrintString("W\tCorr : ");
uart2_printDouble(data/10000.0, 3);
UART2_PrintString("A");
delay_ms(300000);
}
}

Cuanso lo use en la aplicacion final voy a acomodar esta porquería de código y seguiré publicando... si necesitas algo en particular avisame.

Saludos!
-
Leonardo Garberoglio

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #34 en: 21 de Febrero de 2014, 21:03:36 »
Ja..ja..!!
Lejos de ser una porquería !!
Para mi esta genial y clarisimo !!

Gracias !! :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #35 en: 21 de Febrero de 2014, 21:15:04 »
Me parece a mi o la potencia es la mitad de la que debería ser????....

Comenta que carga y a que tensión esta conectado, y revisamos juntos el calculo de la calibración, por ahí puede venir la cosa...
Igual es extraño... :shock:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #36 en: 23 de Febrero de 2014, 21:49:55 »
Me había olvidado de esto...

veamos según la hoja de datos hay que seguir estos pasos:

VbusMax = 16V - Esto lo defino yo de acuerdo a mi sistema
VshuntMax = 0,32V  - Puede ser 40/80/160 mV
Rshunt = 0.82ohm/5 = 0.164ohm

MaxPosibleI = 0.32V/0.164ohm = 1.95A
MaxExpectedI = 1.5A - Esto es lo que yo considero como máxima corriente esperada en mi sistema.

MinimumLSB = 1.5A/32767 = 45.8uA
MaximumLSB = 1.5A/4096 = 366uA

De esos dos valores elijo uno que este entre los dos, lo más chico posible para tener presicion y en lo posible redondo. Por ejemplo 100uA
CurrentLSB = 100uA

Calibracion = 0.04096 / (100 .10-6 * 0.164) = 2497 - Acá hay que tener en cuenta que el bit 0 del registro de calibracion es siempre 0, por lo que los datos impares se almacenarán como el impar menor más cercano (2496)

PotLSB = 20 x CurrentLSB = 2mW

Con todo esto puedo guardar la calibracion y hacer las converciones de datos Raw en valores reales.

Modifiqué levemente el programa para que quede mejor y cumpla con estas condiciones:

INA219.h

Código: [Seleccionar]
#ifndef INA219_H_
#define INA219_H_

#include "i2c.h"

extern volatile uint8_t I2CMasterBuffer[I2C_PORT_NUM][BUFSIZE];
extern volatile uint8_t I2CSlaveBuffer[I2C_PORT_NUM][BUFSIZE];
extern volatile uint32_t I2CReadLength[I2C_PORT_NUM];
extern volatile uint32_t I2CWriteLength[I2C_PORT_NUM];

/*=========================================================================
    I2C ADDRESS/BITS
    -----------------------------------------------------------------------*/
    #define INA219_WRITE_ADDR                         (0x80)    // 1000000 (A0+A1=GND)
    #define INA219_READ_ADDR                          (0x81)
/*=========================================================================*/

/*=========================================================================
    CONFIG REGISTER (R/W)
    -----------------------------------------------------------------------*/
    #define INA219_REG_CONFIG                      (0x00)
    /*---------------------------------------------------------------------*/
    #define INA219_CONFIG_RESET                    (0x8000)  // Reset Bit

    #define INA219_CONFIG_BVOLTAGERANGE_MASK       (0x2000)  // Bus Voltage Range Mask
    #define INA219_CONFIG_BVOLTAGERANGE_16V        (0x0000)  // 0-16V Range
    #define INA219_CONFIG_BVOLTAGERANGE_32V        (0x2000)  // 0-32V Range

    #define INA219_CONFIG_GAIN_MASK                (0x1800)  // Gain Mask
    #define INA219_CONFIG_GAIN_1_40MV              (0x0000)  // Gain 1, 40mV Range
    #define INA219_CONFIG_GAIN_2_80MV              (0x0800)  // Gain 2, 80mV Range
    #define INA219_CONFIG_GAIN_4_160MV             (0x1000)  // Gain 4, 160mV Range
    #define INA219_CONFIG_GAIN_8_320MV             (0x1800)  // Gain 8, 320mV Range

    #define INA219_CONFIG_BADCRES_MASK             (0x0780)  // Bus ADC Resolution Mask
    #define INA219_CONFIG_BADCRES_9BIT             (0x0080)  // 9-bit bus res = 0..511
    #define INA219_CONFIG_BADCRES_10BIT            (0x0100)  // 10-bit bus res = 0..1023
    #define INA219_CONFIG_BADCRES_11BIT            (0x0200)  // 11-bit bus res = 0..2047
    #define INA219_CONFIG_BADCRES_12BIT            (0x0400)  // 12-bit bus res = 0..4097

    #define INA219_CONFIG_SADCRES_MASK             (0x0078)  // Shunt ADC Resolution and Averaging Mask
    #define INA219_CONFIG_SADCRES_9BIT_1S_84US     (0x0000)  // 1 x 9-bit shunt sample
    #define INA219_CONFIG_SADCRES_10BIT_1S_148US   (0x0008)  // 1 x 10-bit shunt sample
    #define INA219_CONFIG_SADCRES_11BIT_1S_276US   (0x0010)  // 1 x 11-bit shunt sample
    #define INA219_CONFIG_SADCRES_12BIT_1S_532US   (0x0018)  // 1 x 12-bit shunt sample
    #define INA219_CONFIG_SADCRES_12BIT_2S_1060US  (0x0048) // 2 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_4S_2130US  (0x0050)  // 4 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_8S_4260US  (0x0058)  // 8 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_16S_8510US (0x0060)  // 16 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_32S_17MS   (0x0068)  // 32 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_64S_34MS   (0x0070)  // 64 x 12-bit shunt samples averaged together
    #define INA219_CONFIG_SADCRES_12BIT_128S_69MS  (0x0078)  // 128 x 12-bit shunt samples averaged together

    #define INA219_CONFIG_MODE_MASK                (0x0007)  // Operating Mode Mask
    #define INA219_CONFIG_MODE_POWERDOWN           (0x0000)
    #define INA219_CONFIG_MODE_SVOLT_TRIGGERED     (0x0001)
    #define INA219_CONFIG_MODE_BVOLT_TRIGGERED     (0x0002)
    #define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED (0x0003)
    #define INA219_CONFIG_MODE_ADCOFF              (0x0004)
    #define INA219_CONFIG_MODE_SVOLT_CONTINUOUS    (0x0005)
    #define INA219_CONFIG_MODE_BVOLT_CONTINUOUS    (0x0006)
    #define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS (0x0007)
/*=========================================================================*/

/*=========================================================================
    SHUNT VOLTAGE REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_SHUNTVOLTAGE                (0x01)
/*=========================================================================*/

/*=========================================================================
    BUS VOLTAGE REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_BUSVOLTAGE                  (0x02)
/*=========================================================================*/

/*=========================================================================
    POWER REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_POWER                       (0x03)
/*=========================================================================*/

/*=========================================================================
    CURRENT REGISTER (R)
    -----------------------------------------------------------------------*/
    #define INA219_REG_CURRENT                     (0x04)
/*=========================================================================*/

/*=========================================================================
    CALIBRATION REGISTER (R/W)
    -----------------------------------------------------------------------*/
    #define INA219_REG_CALIBRATION                 (0x05)
/*=========================================================================*/

#define PORT_USED 1

void INA219_init();
unsigned char INA219_read_reg(unsigned char reg, signed short *value);
unsigned char INA219_write_reg(unsigned char reg_address, unsigned short value);

unsigned char INA219_read_reg(unsigned char reg, signed short *value){
int i;
for ( i = 0; i < BUFSIZE; i++ )
{
I2CSlaveBuffer[PORT_USED][i] = 0x00;
}
unsigned char result=0;
I2CWriteLength[PORT_USED] = 2;
I2CReadLength[PORT_USED] = 2;
I2CMasterBuffer[PORT_USED][0] = INA219_WRITE_ADDR;
I2CMasterBuffer[PORT_USED][1] = reg;
I2CMasterBuffer[PORT_USED][2] = INA219_READ_ADDR;

result=I2CEngine(PORT_USED);

*value = ((I2CSlaveBuffer[PORT_USED][0] << 8) | I2CSlaveBuffer[PORT_USED][1]);
return(result);
}

unsigned char INA219_write_reg(unsigned char reg_address, unsigned short value){
I2CWriteLength[PORT_USED] = 4;
I2CReadLength[PORT_USED] = 0;
I2CMasterBuffer[PORT_USED][0] = INA219_WRITE_ADDR;
I2CMasterBuffer[PORT_USED][1] = reg_address;
I2CMasterBuffer[PORT_USED][2] = ((value >> 8) & 0xFF);
I2CMasterBuffer[PORT_USED][3] = (value  & 0xFF);

return(I2CEngine( PORT_USED ));
}

#endif /* INA219_H_ */

Luego mi main.c me queda:

Código: [Seleccionar]
#ifdef __USE_CMSIS
#include "LPC17xx.h"
#endif

volatile uint32_t msTicks;
__INLINE static void delay_ms (uint32_t delayTicks) {
  uint32_t currentTicks;
  currentTicks = msTicks; // read current tick counter
  while ((msTicks - currentTicks) < delayTicks);
}

#include <cr_section_macros.h>
#include <NXP/crp.h>
#include "uart2.h"
#include <stdio.h>
#include "i2c.h"
#include "INA219.h"

void SysTick_Handler(void) {
msTicks++; /* increment counter necessary in Delay() */
}

/*******************************************************************************
**   Main Function  main()
*******************************************************************************/
int main (void){
signed short data=0;

//Configuro el SysTick para que interrumpa cada 1mseg
if (SysTick_Config(SystemCoreClock / 1000)) {
while (1);
}

I2C1Init(); // Inicializo el I2C1
UART2_Init(115200); // Inicializo el UART a 115200

UART2_PrintString ("\r\nINA219\r\n");
UART2_PrintString ("======== elgarbe ==========\r\n");

UART2_PrintString ("Escribiendo calibración (2497)\r\n");

INA219_write_reg(INA219_REG_CALIBRATION, 2497);

INA219_read_reg(INA219_REG_CALIBRATION, &data);
UART2_PrintString("\r\nConfiguracion leida: ");
uart2_printUint32(data, 10);
delay_ms(2000);

while ( 1 ){
INA219_read_reg(INA219_REG_SHUNTVOLTAGE, &data);
UART2_PrintString("\r\nTens. sht: ");
uart2_printDouble(data * 0.00001, 3); //El LSB es 10uV
delay_ms(2);
INA219_read_reg(INA219_REG_BUSVOLTAGE, &data);
UART2_PrintString("V\tTens. bus: ");
uart2_printDouble((data>>3) * 0.004, 3); //Alineo el resultado y el LSB es 4mV
delay_ms(2);
INA219_read_reg(INA219_REG_POWER, &data);
UART2_PrintString("V\tPot : ");
uart2_printDouble(data * 0.002, 3); //El LSB de potencia me dió 2mW
delay_ms(2);
INA219_read_reg(INA219_REG_CURRENT, &data);
UART2_PrintString("W\tCorr : ");
uart2_printDouble(data * 0.0001, 3); //El LSB de corriente es 100uA
UART2_PrintString("A");
delay_ms(300);
}
}

Algo importante es que la tensión de bus estpa desplazada 3 posiciones en el registro, por ello el desplazamiento que hago en el código. Luego es cuestion de multiplicar cada valor por su LSB.
El LSB de la V de shunt es fijo y es 10uV y el de la V bus es de 4mV. El resto los hemos calculado.

La salida ahora es:



Ahora sí, si hacemos Vbus * I nos da lo mismo que la potencia medida, cosa que antes no sucedía!!!!

Saludos!
-
Leonardo Garberoglio

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #37 en: 24 de Febrero de 2014, 00:26:06 »
Nunca habías hecho ese calculo ?? :shock: :shock:

O sea que no soy el unico apurado para hacer las cosas !! :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #38 en: 24 de Febrero de 2014, 20:41:06 »
En realidad había hecho los cálculos y me habia dado 2560, pero lo que no habia visto, por apurado, es el tema de los LSB de cada medicion. Entonces estaba midiendo mal...

Bueno, ahora más tranquilo (despues de resolver el tema de las tierras compartidas) leí bien la hoja de datos y ya quedó funcionando todo bien!

Saludos!
-
Leonardo Garberoglio

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #39 en: 24 de Febrero de 2014, 22:40:31 »
Me alegro mucho, estoy aprendiendo un montón de estas experiencias tuyas, gracias por compartirlas !!

De que se trata lo de las tierras compartidas ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #40 en: 25 de Febrero de 2014, 07:23:05 »
El tema de las tierras era que yo tenía alimentado el INA desde la placa del uC con 3.3V. Por otro lado tenía una fuente de alimentacion de "potencia", haciendo corcuilar corriente por un grupo de resistencias de potencia. Yo metía en el circuito la R de shunt y quería medir de ese modo. Lo que vi es que la tierra del INA y la tierra de la fuente de "potencia" deben estar unidas. Sino tenía mediciones que variaban constantemente como en los ejemplos más arriba.

Ahora estoy programando el totalizador de corriente (para ver cuanta corriente le voy sacando a la Lipo en vuelo) y ver de mezclar esto y la info del GPS en el OSD. Para ello estoy estudiando la implementacion de DMA, asi que ahí se puede venir otro gran tema!

saludos!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #41 en: 05 de Marzo de 2014, 20:06:11 »
Utiliza mejor un shunt de 1 miliohmio o menos.

El INA219 acepta diferencias de tensión de +-40 milivoltios sin problema.

Cuando circulen 30 amperios, la potencia en la resistencia de 1 miliohmio será de 0.9 vatios.

Para hacer el shunt, sólo necesitas tomar la tensión de dos puntos del cable de alimentación.



Con un cable de cobre de 3mm de diámetro y 20 centímetros de longitud, tienes una resistencia de 0.5 miliohmios y puede aguantar 30 Amperios.

El INA daría una resolución de 20 miliamperios.

Saludos.

El finde estuve volando y haciendo pruebas con el shunt. La cosa cambió un poco. El consumo máximo que espero ahora son 12A. El tema es que 20cm de alambre de cobre se me complica para poner... que pasa si uso alambre de 3mm pero de aluminio, el que se usa para bobinados de transformadores? que resistividad puedo tomar para ese alambre?

Saludos!
« Última modificación: 05 de Marzo de 2014, 20:12:37 por elgarbe »
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #42 en: 05 de Marzo de 2014, 23:16:52 »
Bueno, despues de las pruebas del finde y de casi estrellar el planeador por el peso excesivo me dí a la tarea de emprolijar el "engendro". La idea de todo el plaqueterío que ven en la parte del OSD era para probar circuitos y ver que funcione todo y empezar a programar.
Ahora que esta funcionando y ya tengo todo más aprendido empiezo a diseñar todo un poco mejor.

En cuanto a la medicion de parámetros eléctricos del avion he decidido hacer una placa exclusiva para la medicion. Con dos conectores XT-60 y las R de shunt y el ina219. De esa forma, lo enchufaría entre el ESC y la LiPo sin tener que tocar las fichas. El tamaño final: 22x63mm, un poquito mas largo que el ESC.
El tema de la R de shunt aún no me convence. Lo unico que consegui son resistencias de .27ohm, 2W metal film. Decidi poner 20 en pararlelo para obtener 0.0135 ohm. Podría medir hasta 23.7A, aunque discipando 7.6W. Es mucho. Como espero una I máxima de 12A, la potencia que disiparían sería 2W... Pero si quisiera medir corrientes mas altas estoy frito.
El tema de poner un alambre como shunt me gusta, pero tendría que ser de no más de 10cm... creo que la resistencia sería muy chica... que Ro se usa para el alambre de cobre comercial? Voy a probar que onda con shunts de alambre... pero mientras tanto tengo que seguir adelante....

Adjunto esquemático y pcb

Como ven he metido los componentes SMD en la capa bottom, entonces los puedo poner "debajo" de las R de potencia, ganando lugra. Si bien hay lugar para 10 R, arriba de esas van 10 más... mañana espero poder hacer la placa en el laburo...

Si quieren el proyecto en altium, me avisan y lo subo!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Diseñando el medidor de Corriente, tension y potencia
« Respuesta #43 en: 09 de Marzo de 2014, 15:41:40 »
Bueno, El CI ya esta listo y armado.
Tuve suerte de desarmar un tester que no funcionaba y encontrar un buen shunt. Es de 0.01ohm. Con  él podría achicar mas la placa, la idea del diseño acual es para poner varias R en paralelo...

Un panel con 3 placas. La pintura anti solder es blanca porque justo estaba pintando con ese color (placas a led)



Shunt, conector con alimentacion y salida I2C y conectores XT-60:



Vista de abajo con los componentes SMD:



Bueno, ahora estoy trabajando en la placa de control, achicando el "engendro OSD" para que entre dentro del avion. Cuando la termine podré probar esta parte en conjunto con el OSD...

Saludos!
-
Leonardo Garberoglio