Autor Tema: Medicion de corriente  (Leído 3373 veces)

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

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Medicion de corriente
« en: 08 de Junio de 2011, 20:26:34 »
Saludos amigos, la consulta es la siguiente, tengo una señal pwm de duty variable y periodo variable a la que le debo medir la corriente, que metodo me recomiendan para realizar una medicion lo mas correcta posible.

Las corrientes iran desde 100mA hasta 2 A, necesito mostrar el valor de corriente y no se como hacerlo.

Encontre este hilo, para avanzar en la lectura.

La señal es positiva.

Acaso rms??

saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Medicion de corriente
« Respuesta #1 en: 09 de Junio de 2011, 01:42:52 »
No, lo que correspondería es determinar el valor medio. Una idea es mediante un shunt sensar la corriente, amplificar la diferencia de tensión y pasarlo por un filtro pasabajos adecuado según la frecuencia del PWM, con ello tendrás una tensión de valor medio proporcional a la corriente que circula.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Medicion de corriente
« Respuesta #2 en: 10 de Junio de 2011, 20:49:18 »
Hola suky gracias por responder.

El ckto lo he copiado de la FUENTE DE ALIMENTACION hecha por valdorre y posteriormente por felixs, 10 resistencias de 1ohm en paralelo   ;-).

Me sugieres realizar un promedio de las mediciones, voy a probar a ver ke sale.

Como referencia me han dicho que utilizando un multimetro digital miden corriente y variando la señal varia la corriente, mientras menor duty cicle menor corriente.

Aun no se como realizar los calculos tal como lo haria el multimetro; con el pic tomo un valor instantantaneo que en algun momento sera 0 y en otro momento cualquier valor segun sea la forma de onda.

Probare lo que me sugieres suky y tambien la formula que se utiliza en un codigo al FINAL DE ESTE HILO

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Medicion de corriente
« Respuesta #3 en: 10 de Junio de 2011, 21:33:46 »
De dice verdadero valor RMS porque no supone que la señal a medir es una onda sinusoidal perfecta, sino que puede ser cualquier tipo de señal AC, (Un tester común supone que es sinusoidal) Para ello creo que lo más adecuado es tomar varias muestras por ciclo y aplicar la definición del calculo RMS. Aunque para tu caso no lo veo necesario, con tomar el valor medio, aplicando lo que comente (Cierta parte es igual a la fuente de Elektor que comentas) logras el cometido.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Medicion de corriente
« Respuesta #4 en: 10 de Junio de 2011, 23:54:07 »
Chevere, a darle entonces  :-/.

saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Medicion de corriente
« Respuesta #5 en: 11 de Junio de 2011, 20:53:44 »
Hola suky, tienes razón, hice medición promediando y me salen datos muy parecidos al multimetro, en ambos hay oscilaciones propias por la forma de onda, pero obtengo valores aceptables.

Dejo codigo por si alguien lo necesita. Esta hecho en un 16f877a a 8Mhz, el cual genera el pwm, lee y muestra en adc en un lcd 4x20.

Código: C
  1. #include <16f877a.h>
  2. #device  ADC = 10    
  3. #fuses HS    
  4. #fuses NOPUT                      
  5. #fuses NOBROWNOUT
  6. #fuses NOWDT
  7. #fuses NOPROTECT                                        
  8. #use delay(clock = 8000000)      
  9. //#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7)
  10.                                                                                                            
  11. #use fast_io(A)                        
  12. #use fast_io(B)                        
  13. #use fast_io(C)                                                                                                            
  14. #use fast_io(D)                        
  15. #use fast_io(E)                                                      
  16.  
  17. #define LCD_DB4         PIN_C0
  18. #define LCD_DB5         PIN_C1
  19. #define LCD_DB6         PIN_C2
  20. #define LCD_DB7         PIN_C3
  21. #define LCD_RS          PIN_C4
  22. #define LCD_E           PIN_C5
  23.  
  24. #define salida PIN_D0                                                    
  25. #include "FLEX LCD.c"      ///display 20x4                                                                          
  26.  
  27. int1  flag_tecla = 0;
  28. int16 cont_tecla_1_a = 0;        
  29. int16 cont_tecla_2_a = 0;        
  30. int16 cont_tecla_1_b = 0;        
  31. int16 cont_tecla_2_b = 0;        
  32. int16 cont_tecla_1_c = 0;        
  33. int16 cont_tecla_2_c = 0;        
  34. int16 cont_tecla_1 = 0;        
  35. int16 cont_tecla_2 = 0;        
  36. int16 cont_tecla_3 = 0;        
  37. int16 cont_tecla_4 = 0;        
  38.                                
  39. int1  flag_rapido_1 = 0;
  40. int1  flag_rapido_2 = 0;                        
  41. int1  flag_rapido_11 = 0;
  42. int1  flag_rapido_21 = 0;
  43. int1  flag_rapido_111 = 0;
  44. int1  flag_rapido_211 = 0;
  45.                                      
  46. int8  carga_t0;
  47. int16 carga_t1;
  48.  
  49. int16 periodo = 50000;
  50. int8 duty  = 10;
  51. int16 muestra;
  52.  
  53. int1  solto1 = 0;
  54. int1  solto2 = 0;
  55. int1  solto3 = 0;
  56. int1  solto4 = 0;
  57.  
  58. int1  flag_solto1 = 0;
  59. int1  flag_solto2 = 0;
  60. int1  flag_solto3 = 0;                                    
  61. int1  flag_solto4 = 0;
  62.  
  63. int16 leer;
  64. int32 lector;
  65. float acumula_adc;
  66. int32 cont_adc;
  67.  
  68.  
  69.  
  70. void teclas(void);
  71.  
  72.  
  73. #int_timer1              ///periodo            
  74. void timer_1(void)
  75. {                                                      
  76. output_high(salida);  
  77. set_timer1(carga_t1);          
  78. set_timer0 (carga_t0);                          
  79.                                
  80. }
  81.                                              
  82. #int_rtcc              ///duty  
  83. void timer_0(void)        
  84. {
  85. output_low(salida);
  86. }                                                                    
  87.  
  88. #INT_TIMER2
  89. void timer_2 (void)     ///interrupcion a 4950.4 uS
  90. {
  91. flag_tecla = 1;
  92. }
  93.  
  94. void main()
  95.  {
  96.     set_tris_a (255);                
  97.     set_tris_b (255);      
  98.     set_tris_c (128);                                        
  99.     set_tris_d (0);
  100.     set_tris_e (0);  
  101.                                                                                                          
  102.     SETUP_ADC(ADC_CLOCK_INTERNAL);
  103.     SETUP_TIMER_2(T2_DIV_BY_16,156,16);         ///interrupcion cada 25.728 mS          
  104.     SETUP_ADC_PORTS(AN0_AN1_AN2_AN4_VSS_VREF);  
  105.     SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_2);
  106.     setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
  107.     enable_interrupts(INT_TIMER0);                                        
  108.     enable_interrupts(INT_TIMER1);        
  109.     enable_interrupts(INT_TIMER2);                                                                    
  110.  
  111.    set_adc_channel(0);
  112.  
  113.    port_b_pullups(1);
  114.    //printf("Prueba de pic\r\n");        
  115.                                                
  116.     //delay_ms(100);                              
  117.     lcd_init();                                
  118.    // delay_ms(100);                
  119.    restart_wdt ();  
  120.    carga_t1 = 65535 - periodo;                                                                                        
  121.    carga_t0 = 256 - duty;
  122.    muestra = (int16)duty * 128;  
  123.    lcd_gotoxy(1,1);printf(lcd_putc,"Periodo: %6.3w ms           ",periodo);// Ftcv: 67Hz");
  124.    lcd_gotoxy(1,2);printf(lcd_putc,"Duty: %9.3w ms           ",muestra);        
  125.    lcd_gotoxy(1,3);printf(lcd_putc,"ADC: ");
  126.    enable_interrupts(global);
  127.    while(true)
  128.       {                                            
  129.                                
  130.       if(++cont_adc >= 20000)            
  131.          {
  132.          //printf("L: %Lu\r\n",lector);                                            
  133.          lector = lector / cont_adc;
  134.          acumula_adc = (float)lector * 0.002441406;  ////referencia 2.5 volt    adc 10 bits  
  135.          lcd_gotoxy(7,3);printf(lcd_putc,"%4.3f",acumula_adc);
  136.          //printf("ADC: %f\r\n",acumula_adc);
  137.          cont_adc = 0;                                              
  138.          lector = 0;                                    
  139.          }                  
  140.       else                              
  141.          {
  142.          leer = read_adc();              
  143.          lector += (int32)leer;
  144.          }
  145.                    
  146.      
  147.       teclas();
  148.       if((!input(PIN_B0)) && (solto1))                                      
  149.          {              
  150.          solto1 = 0;                                                  
  151.          periodo++;
  152.          if(flag_rapido_1)periodo += 10;
  153.          if(flag_rapido_11)periodo += 100;
  154.          if(flag_rapido_111)periodo += 1000;
  155.          carga_t1 = 65536 - periodo;
  156.          lcd_gotoxy(10,1);printf(lcd_putc,"%6.3w",periodo);
  157.          //printf("%5Lu",periodo);// Ftcv: 67Hz");  
  158.          }                  
  159.       if((!input(PIN_B1)) && (solto2))
  160.          {                    
  161.          solto2 = 0;                                                                                    
  162.          periodo--;              
  163.          if(flag_rapido_2)periodo -= 10;                  
  164.          if(flag_rapido_21)periodo -= 100;
  165.          if(flag_rapido_211)periodo -= 1000;
  166.          carga_t1 = 65536 - periodo;            
  167.          lcd_gotoxy(10,1);printf(lcd_putc,"%6.3w",periodo);  
  168.          //printf("%5Lu",periodo);// Ftcv: 67Hz");  
  169.          }                        
  170.       if((!input(PIN_B2)) && (solto3))                    
  171.          {                                                                
  172.          solto3 = 0;                                                                
  173.          duty++;                      
  174.          carga_t0 = 256 - duty;      
  175.          muestra = (int16)duty * 128;  
  176.          lcd_gotoxy(10,2);printf(lcd_putc,"%6.3w",muestra);        
  177.          }                                                              
  178.       if((!input(PIN_B3)) && (solto4))
  179.          {
  180.          solto4 = 0;
  181.          duty--;
  182.          carga_t0 = 256 - duty;                                                          
  183.          muestra = (int16)duty * 128;  
  184.          lcd_gotoxy(10,2);printf(lcd_putc,"%6.3w",muestra);        
  185.          }
  186.      
  187.        restart_wdt ();
  188.                        
  189.       }
  190. }                              
  191.  
  192.                                
  193. void teclas(void)
  194. {
  195.      
  196. if(flag_tecla)
  197.    {
  198.    flag_tecla = 0;
  199.    
  200.    if(!input(PIN_B0))
  201.       {
  202.       ++cont_tecla_1;
  203.       if(cont_tecla_1 > 5 && flag_solto1)
  204.          {
  205.          cont_tecla_1 = 0;
  206.          solto1 = 1;
  207.          if(flag_rapido_1)
  208.             {
  209.             if(++cont_tecla_1_b > 20)flag_rapido_11 = 1;
  210.             }
  211.          if(flag_rapido_11)
  212.             {
  213.             if(++cont_tecla_1_c > 20)flag_rapido_111 = 1;
  214.             }
  215.          if(++cont_tecla_1_a > 20)flag_rapido_1 = 1;
  216.          }                                                              
  217.      
  218.       if(cont_tecla_1 > 60){cont_tecla_1 = 0;flag_solto1 = 1;}
  219.       }
  220.    else
  221.       {
  222.       cont_tecla_1 = 0;                          
  223.       flag_solto1 = 0;
  224.       cont_tecla_1_a = 0;
  225.       flag_rapido_1 = 0;  
  226.       cont_tecla_1_b = 0;
  227.       flag_rapido_11 = 0;
  228.       cont_tecla_1_c = 0;
  229.       flag_rapido_111 = 0;
  230.       solto1 = 1;
  231.       }                    
  232.  
  233.    if(!input(PIN_B1))
  234.       {                            
  235.       ++cont_tecla_2;
  236.       if(cont_tecla_2 > 5 && flag_solto2)
  237.          {
  238.          cont_tecla_2 = 0;
  239.          solto2 = 1;
  240.          if(flag_rapido_2)
  241.             {
  242.             if(++cont_tecla_2_b > 20)flag_rapido_21 = 1;
  243.             }
  244.          if(flag_rapido_21)
  245.             {
  246.             if(++cont_tecla_2_c > 20)flag_rapido_211 = 1;
  247.             }
  248.          if(++cont_tecla_2_a > 20)flag_rapido_2 = 1;
  249.          }                              
  250.                            
  251.       if(cont_tecla_2 > 60){cont_tecla_2 = 0;flag_solto2 = 1;}  
  252.       }
  253.    else
  254.       {
  255.       cont_tecla_2 = 0;              
  256.       flag_solto2 = 0;              
  257.       cont_tecla_2_a = 0;
  258.       flag_rapido_2 = 0;  
  259.       cont_tecla_2_b = 0;
  260.       flag_rapido_21 = 0;
  261.       cont_tecla_2_c = 0;
  262.       flag_rapido_211 = 0;
  263.       solto2 = 1;                    
  264.       }                    
  265.                            
  266.                              
  267.    if(!input(PIN_B2))
  268.       {
  269.       ++cont_tecla_3;
  270.       if(cont_tecla_3 > 5 && flag_solto3){cont_tecla_3 = 0;solto3 = 1;}                        
  271.      
  272.       if(cont_tecla_3 > 60){cont_tecla_3 = 0;flag_solto3 = 1;}
  273.       }
  274.    else
  275.       {
  276.       cont_tecla_3 = 0;              
  277.       flag_solto3 = 0;                          
  278.       solto3 = 1;                    
  279.       }                    
  280.  
  281.    if(!input(PIN_B3))
  282.       {                                    
  283.       ++cont_tecla_4;
  284.       if(cont_tecla_4 > 5 && flag_solto4){cont_tecla_4 = 0;solto4 = 1;}                        
  285.                            
  286.       if(cont_tecla_4 > 60){cont_tecla_4 = 0;flag_solto4 = 1;}  
  287.       }
  288.    else
  289.       {
  290.       cont_tecla_4 = 0;              
  291.       flag_solto4 = 0;              
  292.       solto4 = 1;                    
  293.       }                    
  294.    }
  295. }


Saludos.

A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Medicion de corriente
« Respuesta #6 en: 11 de Junio de 2011, 22:40:36 »
Hola Kallitos!
Hay un chip que pudiera servirte para lo que quieres reviza aqui a ver si te sirve  :mrgreen:

Saludos

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Medicion de corriente
« Respuesta #7 en: 12 de Junio de 2011, 00:11:30 »
Se ve interesante, aunque por cuestiones de disponibilidad de IC y tiempo, quedara con pic.

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything