TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: arielmdq en 08 de Junio de 2015, 22:35:30

Título: Como amplificar una escala de tension
Publicado por: arielmdq en 08 de Junio de 2015, 22:35:30
Hola que tal gente del foro, les cuento que estuve leyendo los post del foro y por internet que se refieren a elevar voltajes, pero no he encontrado esto que quiero hacer yo ,que de hecho, no se si es posible, por eso decido crear el tema para sacarme la duda.
Bueno al grano,basicamente lo que yo necesito es mover un voltimetro analogico de 12v , pero con 5volt, es decir que cuando tenga 5v ,la escala del voltimetro me marque 12v cuando tenga 2,5v la escala me marque 6v y asi progresivamente.
El voltaje lo  estoy sacando por un pic (16f876a) mediante una señal pwm y un filtro pasa bajos y la hago variar de 0 a 5 volt, eso funciona bien,con el voltimetro lo que hago es marcar una posicion y como voltimetros de 5v no pude conseguir lo quiero hacer con uno de 12v. Ahora en un intento por elevar la tension lo que  hice hasta ahora fue ponerle un amplificador
 operacional  lm741 con alimentacion de 12v, en el simulador proteus funciona perfectamente pero en la realidad no y lo que sucede es lo siguiente : 
cuando tengo 2,5v en el pic tengo un poco mas de 6v en el LM y cuando tengo 5v en el pic tengo cera de 12v en el LM, pero cuando tengo 0v en el pic tengo
5v en el LM es como que no respeta una escala y nisiquiera baja de 5 volt no logro tener los 0v en la salida del LM741 .Y la otra cosa que sucede es que cuando le conecto el voltimetro analogicoa la salida de lm741 la tension se cae a 3v ,osea si no es capaz de mover la aguja del voltimetro no me sirve .Asi que las dudas son:
se puede hacer esto?
estoy usando el integrado adecuado?
de que otra manera lo puedo hacer?
Leí por ahí, sobre un convertidor dc dc de 5v a 24v que tambien me serviría, el tema es si me hara el efecto en cuestion ?(subir el voltaje gradualmente)
ojala me puedan ayudar ,les adjunto un esquema para aclarar lo que intento explicar,En este momento solo estoy probando con el operacional ,descarte el circuito del pic hasta poder hacerlo funcionar y asi eliminar posibles problemas. Desde ya muchas gracias.Saludos !!!
 
Título: Re: Como amplificar una escala de tension
Publicado por: planeta9999 en 08 de Junio de 2015, 23:02:18


Prueba a convertir los pulsos de 0-5v a 0-12v con un transistor y luego integra con el filtro para sacar el voltaje. Te resultará más fácil que tratar de elevar el voltaje de la señal ya integrada, que además tienes que mantener en una escala proporcional.
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 09 de Junio de 2015, 08:21:31
Muchas gracias por tu respuesta planeta9999 !!!,pero no se como hacer esto que me decis , me podrias explicar un poco ,o hacer algun esquema por favor ?Es que nunca hice eso, gracias
Título: Re: Como amplificar una escala de tension
Publicado por: juaperser1 en 09 de Junio de 2015, 08:40:24
Lo que te ya dicho planeta es una buena idea, pero se me ha ocurrido una alternativa que también puedes probar.

Baja la tensión de 5v del pic a 3v (que es multiplo de 12) con un divisor de tensión y esta tensión metela en un amplificador no inversor con una ganancia de 4 de esta manera cuando tengas 3 voltios a la salida tendrás 12 y cuando tengas 1.5voltios de entrada tendrás 6voltios de salida.

Un saludo.
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 09 de Junio de 2015, 09:00:50
Hola arielmdq, los primeros defectos que veo en tu explicación:

1) Para alimentar el operacional deberás de usar una fuente simétrica o por lo menos partida.
2) La tensión de alimentación del operacional deberá ser por lo menos 2V mayor a los 12 de salida que deseas, o sea un tensión mínima de alimentación de 14V, pero 15 sería la mínima ideal.
3) Deberás de usar un transistor a la salida del amplificador, a manera de driver para conseguir excitar de manera correcta tu voltímetro.

Este es el circuito que debes de usar, y te recomendaría el LM358 como amplificador operacional:

Acá lo puedes ver funcionando con cero volts
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=44651.0;attach=23962;image)

Acá a mitad de escala, o sea con 2.5 volts
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=44651.0;attach=23964;image)

Y Acá a plena escala, sería con los 5V.
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=44651.0;attach=23966;image)

Espero te sea de ayuda, cualquier duda la preguntas.

Un saludo.

Atte. CARLOS.
Título: Re: Como amplificar una escala de tension
Publicado por: planeta9999 en 09 de Junio de 2015, 09:19:40


http://www.todopic.com.ar/foros/index.php?topic=43271.0

For Vcc = 12V, Vin = 3.3 to 5V
R1 = 1Kohm,
R2 = 10Kohm,
R3 = 10Kohm,
R4 = 100Kohm,
Q1 = BC817,
Q2 = BC807



(http://i1121.photobucket.com/albums/l518/xmen4001/ScreenHunter_007_zpsumm4103i.jpg)
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 09 de Junio de 2015, 13:49:02
Que grande gente !!!! unos genios ((:-)) muchas gracias por sus respuestas :) .Justo hoy me estaban diciendo lo de la fuente partida para alimentar el operacional ,como dice chaly29, asi que empece a buscar como hacer una, a partir de una simple, pero sin transformador .Llevo poco buscando pero seguro que tiene que haber alguna dando vueltas por internet. Asi que voy a probar las dos cosas a ver que me sale y despues les cuento.Muchas gracias a todos ,saludos !!!!
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 09 de Junio de 2015, 14:05:07
Hola arielmdq, busca por el ICL7660, es un integradito de 8 pines que el con solo usar un condensador, y a partir de una tensión de 5V te genera una de -5V que te servirá con creces para alimentar el ramal negativo del LM358 o cualquier otro operacional.

Un saludo.

Atte. CARLOS.

Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 09 de Junio de 2015, 16:52:41
Muchas gracias Carlos!!! ahi  estuve viendo como funciona el icl7660 , ya simule en proteus y funciona ,a ver si mañana lo puedo ir  a comprar y lo pruebo .Despues les cuento como me fue. Mil gracias!!!!
          Saludos!!!!
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 10 de Junio de 2015, 19:48:26
Hola gente como andan!!!, les queria comentar que arme el circuito que me paso chaly29, agregandole el icl7660 para dar el voltaje negativo al operacional y funciona perfecto ya puedo mover la aguja del voltimetro normalmente .Y recien ahora puedo ver un defecto que tengo en el programa que suponia que podia pasar :lol:pero esperaba que no se notara y si se nota ja ja (La aguja del voltimetro me va muy a los saltos y no tan gradual o natural).Bueno soy muy principiante programando y lo hice muy brutamente ja ja . Me gustaria si lo puedo subir para que lo vean y a parte de reirse  :D me ayuden a mejorarlo ja ja ,o no se si lo tendria que poner en otra parte del foro .Desde ya muchas gracias por la ayuda que me dieron hasta aca que fue buenisima .Gracias Carlos te pasaste con los esquemas  ((:-)).
                                                        Saludos !!!!
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 10 de Junio de 2015, 21:52:19
Hola arielmdq, me alegra de que todo haya funcionado FELICIDADES!!! Puedes subirlo acá mismo si lo deseas, así se sabe de que estamos hablando y no tener que explicar todo nuevamente.

Con respecto al movimiento brusco de la aguja, pues tienes dos soluciones posibles:

1) Hacerlo por software. Haciendo que el PWM incremente/decremente con cierta cadencia, o sea que lo haga suavemente como para que el movimiento de la aguja se vea más "natural".

2) O hacerlo por hardware. Variando los valores de R1 o C1 del esquema que yo te e pasado, conseguirás un filtro "pasa bajos" de mayor o menor frecuencia de corte. Que significa esto en la practica? Pues si aumentas el valor de R1 o de C1 o ambos, la aguja se pondrá más "lenta" y por más brusco que sea el cambio del PWM la aguja lo seguirá más lentamente, Experimentando un poco con los valores de los mismos de seguro conseguirás la cadencia de movimiento que te parezca correcta.

Comenta los resultados y si es posible la aplicación que le estas dando al circuito creado.

Un saludo.

Atte. CARLOS.

Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 11 de Junio de 2015, 14:31:45
Gracias Carlos por tu respuesta , voy a probar lo que me decis de corregirlo por hardware,pero de todos modos me gustaria mostrarles el programa
 por que no supe como resolver esto que les voy a comentar.Este trabajo lo habia hecho con un programa parecido ,solo que mostraba en una pantalla lcd ,
y al querer adaptarlo para colocar un instrumento analogico me salto la falla que les comentaba de que la aguja va a los saltos.El circuito lo que hace
 es medir la posicion de un timon de un barco ,lo que yo quise hacer es que la calibracion del instrumento, o del lcd en aquel caso, fuera lo mas sencilla posible,
entonces como lo hacia:ya que el timon no gira la cantidad de grados que el potenciometro ,con el que mido su posicion,necesitaba hacer una especie de tabla en la
que pudiera grabar los limites tanto hacia un lado como el otro , asi tambien el centro,a partir de ahi hacer unas cuentas y establecer mi escala .Es decir que yo pudiera
manipular estos 3 parametro a gusto, para  despues mostrarlas con el movimiento correspondiente de la aguja.Una de las cosas que no supe como resolver, es como hacer para que se incremente o decremente el pwm de cero a 1023 si mi entrada analogica no va de cero a 1023 ,entonces decidi hacer esta especie de tabla que va comparando valores (la cual supongo es una manera muy bruta de hacerlo) ja ja....... pero se me sigue ocurriendo que si le agrego mas variables puedo corregir este efecto que me hace la aguja.Bueno espero haber sido claro ,aunque no me fue facil explicarlo ja ja. Si se les ocurre alguna idea ,les estare muy agradecido a continuacion les adjunto el programa .Desde ya muchas gracias .Saludos!!!
 
Código: CSS
  1. #include <16f876a.h>
  2. #device adc =10
  3. #use delay (clock=8M)
  4. #fuses HS,NOWDT,NOPROTECT,NOLVP
  5. #include <internal_eeprom.c>
  6. #use fast_io(B)
  7. #use fast_io(c)
  8. #use fast_io(a)
  9.  
  10. int16 calculoBandaEr(int16 cero,int16 toper);// funcion
  11. int16 a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;
  12.  
  13. int16 calculoBandaBr(int16 cero, int16 topbr);//funcion
  14. int16 n=0,z=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;
  15.  
  16. int16 cursor=0,toper=0,topbr=0,cero=0,ciclo_util;
  17. int16 resultadoEr =0,resultadoBr =0;
  18.  
  19.  
  20. void main()
  21. {
  22. set_tris_c(0b00000000);
  23. output_c(0b00000000);
  24. set_tris_b(0b11111111);
  25. output_b(0b00000000);
  26. //****************ADC**************************/
  27.   setup_adc_ports(AN0_AN1_AN3);//* entradas analogicas*//
  28.   setup_adc (ADC_CLOCK_INTERNAL);
  29.   setup_COUNTERS(RTCC_internal.rtcc_div_8);
  30. //********************************************************/
  31. // *************PWM*************************************/
  32.  
  33.   setup_ccp1(CCP_PWM);
  34.    setup_timer_2(T2_DIV_BY_16,255, 1);
  35.    set_pwm1_duty(ciclo_util);
  36.    
  37.  
  38.  
  39.    
  40.    WHILE (1) {
  41.    
  42.       set_pwm1_duty(ciclo_util);
  43.       set_adc_channel (0);
  44.       delay_us (20);
  45.       cursor = read_adc ();
  46.      
  47.  
  48.  
  49.      if (input(pin_b4)==0)//configuracion
  50.    {
  51.       output_high (PIN_c0);//enciendo un led
  52.      
  53.      if (input(pin_b1)==1)//  configuro limite derecho
  54.    {
  55.  
  56.     if (input(pin_b0)==1)//boton que graba en la eeprom
  57.    {
  58.    write_int16_eeprom(0x120,(int16) cursor);// escribe en la memoria
  59.    delay_ms(15);
  60.    toper=read_int16_eeprom(0x120);
  61.  
  62.    }
  63.  
  64.    }
  65.  
  66.      if (input(pin_b2)==1)// configuro limite izquierdo
  67.    {    
  68.                        
  69.     if (input(pin_b0)==1)//boton que graba en la eeprom
  70.    {
  71.    write_int16_eeprom(0x122,(int16) cursor);// escribe en la memoria
  72.    delay_ms(15);
  73.    topbr=read_int16_eeprom(0x122);
  74.  
  75.    }
  76.  
  77.    }
  78.  //****************CERO************************/
  79.     if (input(pin_b3)==1)// cero
  80.     {
  81.     if (input(pin_b0)==1)//boton que graba en la eeprom
  82.    {
  83.  
  84.    write_int16_eeprom(0x126,(int16) cursor);// escribe en la memoria
  85.    delay_ms(15);
  86.    cero= read_int16_eeprom(0x126);
  87.    delay_ms(15);
  88.    
  89.    }
  90.  
  91.    }
  92.     }
  93.  
  94.    
  95. //****************************************/
  96.    if (input(pin_b4)==1)//switch en posicion listo para usar
  97.   {
  98.    output_low (PIN_c0);//apago led de configuracion
  99.    cero= read_int16_eeprom(0x126);
  100.    delay_ms(15);
  101. //******************************************************************/
  102.    topbr=read_int16_eeprom(0x122);
  103.    delay_ms(15);
  104.  
  105.    resultadoBr = calculoBandaBr(topbr,cero);//( topbr -cero ) /14;
  106.  
  107.    n = resultadoBr + cero;
  108.    z =cero+(resultadoBr*2);
  109.    o =cero+(resultadoBr*3);
  110.    p =cero+(resultadoBr*4);
  111.    q =cero+(resultadoBr*5);
  112.    r =cero+(resultadoBr*6);
  113.    s =cero+(resultadoBr*7);
  114.    t =cero+(resultadoBr*8);
  115.    u =cero+(resultadoBr*9);
  116.    v =cero+(resultadoBr*10);
  117.    w =cero+(resultadoBr*11);
  118.    x =cero+(resultadoBr*12);
  119.    y =cero+(resultadoBr*13);
  120.    
  121. //******************************************************************/  
  122.    toper=read_int16_eeprom(0x120);
  123.    delay_ms(15);
  124.  
  125.    resultadoEr = calculoBandaEr (cero, toper);
  126.    a=   resultadoEr + toper;
  127.    b =( resultadoEr * 2)+toper;
  128.    c =( resultadoEr * 3)+toper;
  129.    d =( resultadoEr * 4)+toper;
  130.    e =( resultadoEr * 5)+toper;
  131.    f =( resultadoEr * 6)+toper;
  132.    g =( resultadoEr * 7)+toper;
  133.    h =( resultadoEr * 8)+toper;
  134.    i =( resultadoEr * 9)+toper;
  135.    j =( resultadoEr * 10)+toper;
  136.    k =( resultadoEr * 11)+toper;
  137.    l =( resultadoEr * 12)+toper;
  138.    m =( resultadoEr * 13)+toper;
  139.  
  140.  
  141.         IF (cursor >0 && cursor<= toper)
  142.       {
  143.         output_low(PIN_c6);
  144.         output_high (PIN_c5);
  145.         ciclo_util=8;
  146.       }
  147.         IF (cursor > toper && cursor <=a)
  148.       {  
  149.         output_low (PIN_c5);
  150.         output_low(PIN_c6);
  151.         ciclo_util=44;
  152.       }
  153.  
  154.       IF (cursor >a && cursor <b)
  155.       {
  156.         ciclo_util=80;
  157.       }
  158.    
  159.       IF (cursor >b &&cursor<c)
  160.       {
  161.         ciclo_util=116;
  162.       }
  163.  
  164.       IF (cursor >c && cursor<d)
  165.       {
  166.          ciclo_util=152;
  167.       }
  168.  
  169.       IF (cursor >d && cursor<e)
  170.       {
  171.          ciclo_util=188;
  172.       }
  173.  
  174.       IF (cursor >e && cursor<f)
  175.       {
  176.         ciclo_util=224;  
  177.       }
  178.       IF (cursor>f&&cursor<g)
  179.       {
  180.          ciclo_util=260;
  181.       }
  182.        IF (cursor>g&&cursor<h)
  183.       {
  184.          ciclo_util=296;
  185.       }
  186.        IF (cursor>h&&cursor<i)
  187.       {
  188.          ciclo_util=332;
  189.       }
  190.        IF (cursor>i&&cursor<j)
  191.       {
  192.          ciclo_util=368;
  193.       }
  194.        IF (cursor>j&&cursor<k)
  195.       {
  196.          ciclo_util=404;
  197.       }
  198.        IF (cursor>k&&cursor<l)
  199.       {
  200.          ciclo_util=440;
  201.       }
  202.        IF (cursor>l&&cursor<m)
  203.       {
  204.          ciclo_util=476;
  205.       }
  206. //************************************/
  207.       IF (cursor >m&&cursor<cero)
  208.       {
  209.          ciclo_util=512;               //posicion  
  210.       }
  211. //************************************ //de la
  212.       IF (cursor >cero &&cursor<n)      
  213.       {                                // aguja
  214.          ciclo_util=512;                              
  215.       }                                //en el centro
  216. //************************************/
  217.       if (cursor>n&&cursor<z)
  218.        {
  219.           ciclo_util=548;
  220.        }
  221.  
  222.       if (cursor>z&&cursor<o)
  223.    {
  224.          ciclo_util=584;
  225.  
  226.    }
  227.       if (cursor>o&&cursor<p)
  228.    {
  229.        ciclo_util=620;
  230.    }
  231.       if (cursor>p&&cursor<q)
  232.    {
  233.        ciclo_util=656;
  234.  
  235.    }
  236.       if (cursor>q&&cursor<r)
  237.    {
  238.        ciclo_util=692;
  239.    }
  240.  
  241.       if (cursor>r&&cursor<s)
  242.    {
  243.       ciclo_util=728;
  244.  
  245.    }
  246.       IF (cursor>s&&cursor<t)
  247.       {
  248.          ciclo_util=764;
  249.       }
  250.       IF (cursor>t&&cursor<u)
  251.       {
  252.          ciclo_util=800;
  253.       }
  254.       IF (cursor>u&&cursor<v)
  255.       {
  256.          ciclo_util=836;
  257.       }
  258.        IF (cursor>v&&cursor<w)
  259.       {
  260.          ciclo_util=872;
  261.       }
  262.        IF (cursor>w&&cursor<x)
  263.       {
  264.          ciclo_util=908;
  265.       }
  266.        IF (cursor>x&&cursor<y)
  267.       {
  268.          ciclo_util=944;
  269.       }
  270.       if (cursor>y&&cursor<topbr)
  271.    {
  272.       output_low (PIN_c5);
  273.       output_low(PIN_c6);  
  274.       ciclo_util=980;
  275.    }
  276.  
  277.       if (cursor>topbr&&cursor<=1024)
  278.    {
  279.       output_high(PIN_c6);//led************************/
  280.       output_low (PIN_c5);
  281.       ciclo_util=1023;
  282.  
  283. }
  284.    }
  285. }  
  286.  
  287. }
  288.  
  289.  
  290. //funciones*********************************************/
  291.  
  292. int16 calculoBandaEr(int16 cero, int16 toper)
  293. {
  294.    toper=read_int16_eeprom(0x120);
  295.    delay_ms(15);  
  296.    RETURN (cero - toper) / 14;
  297. }
  298.  
  299. int16 calculoBandaBr(int16 topbr,int16 cero )
  300. {
  301.    topbr=read_int16_eeprom(0x122);
  302.    delay_ms(15);
  303.    RETURN ( topbr -cero ) / 14;
  304. }
  305.  
  306.  
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 13 de Junio de 2015, 18:33:16
Hola  !!! les queria contar que efectivamente como dijo Carlos cambie los valores de R1 y C1 y ya la aguja se mueve gradualmente .Gracias Carlos !!!! sos un grande!!!!  ((:-))
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 13 de Junio de 2015, 19:30:04
Hola arielmdq, felicidades por el excito, me alegra escuchar los buenos resultados. El mérito es todo tuyo, porque en realidad yo no hice nada  :D  :D

Un saludo.

Atte. CARLOS.

Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 13 de Junio de 2015, 20:03:51
Hola arielmdq, no había leído lo de tu problema el programar, ehora lo hice y se me ocurren algunas ideas para que mejores el mismo, pero como no programo en C te lo explico con fórmulas y tu lo llevas a la practica.

Primero que nada, para tomar la posición y como usas un potenciómetro, pues debes de asegurarte que el mismo sea lineal y no logarítmico, los logarítmicos son usado en audio y su escala o resistencia no es proporcional en todo su recorrido, pero los lineales sí, o por lo menos lo intentan. Aparte de esto, debes de tratar que los puntos extremos del timón no estén cercanos a los extremos del potenciómetro, ya que los potes, en posiciones cercanas a los extremos pierden enormemente cualquier linealidad o proporción.

Montas todo y tomas las tensiones de referencia para extremo derecho, extremo izquierdo y punto central, tal como lo haz realizado.

Con estas tensiones ya podrás calcular que valores digitales tendrán cada posición, por ejemplo:

Extremo derecho   = 1 Vcc
Extremo Izquierdo = 4 Vcc
Punto central         = 2.5 Vcc

Calculemos los valores digitales :

Valor digital = Tensión análoga / (5 / 1023)      Esto suponiendo que uses como referencia del conversor A/D la tensión de alimentación del micro y el micro se alimente con 5Vcc

Extremo derecho   = 1 / (5 / 1023) = 205
Extremo izquierdo  = 4 / (5 / 1023) = 818
Punto central         = 2.5 / (5/1023) = 511

Calculemos el factor de multiplicación que luego usaremos como constante:

818 - 205 = 613

1023 / 613 = 1.6688 Esta es la constante.

Ya con la constante anterior, el resto lo podemos calcular con el micro:

Verificamos si el valor del A/D es mayor o menor de 511 que es el valor de la posición central.


                      Vc          Vad   Vc                            Const                             Vc
1) Si VALOR > 511 ---> 818 - 511 = 307 ---> 307 x 1.6688 = 512 ---> 512 + 511 = 1023 este valor al PWM


                      Vc          Vc    Vad                           Const                   Vc
2) Si VALOR < 511 ---> 511 - 205 = 306 ---> 306 x 1.6688 = 511 ---> 511 - 511 = 0 este valor al PWM

Donde:
Vc      = Valor de la posición central
Vad    = Valor leído del conversor A/D
Const = Valor de la constante calculada anteriormente

Un número al azahar, ejemplo 612

612 es mayor que 511, usaremos la primer secuencia de cálculos

612 - 511 =  101 ---> 101 x 1.6688 = 169 ---> 169 + 511 = 680 este valor al PWM

Espero haber sido claro, cualquier duda la preguntas.

Un saludo.

Atte. CARLOS.
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 16 de Junio de 2015, 11:39:33
Gracias Carlos !!!! recien veo el msj ,que buena onda !!! me estuve rompiendo el coco para poder mejorar este programa  y ahora que veo tu razonamiento creo que se me aclaran un poco  las cosas,le voy a hechar manos a la obra y despues te cuento .Mil gracias !!!!!
                                                                                    Saludos!!!!
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 16 de Junio de 2015, 19:58:35
Hola Carlos te cuento y les cuento a los amigos del foro  ,que arme un programa con el razonamiento que me pasaste, el cual creo entendi correctamente ,pero no me funciona ,como ya se habran dado cuenta soy muy principiante programando ja ja , y seguramente tiene que haber algo mal en el programa .El programa  compila correctamente ,pero cuando voy a la simulacion hace cualquier cosa .
 Uno de los varios problemas (ja ja ), lo veo cuando pauso la simulacion y veo el cuadro de variables que no me muestra nada
 Otro o el mismo  es que cambie todas las variables de int16 a float por que no funcionaban ya que el valor de la constante es con coma ( ej.:1,66) y creo que no me esta haciendo las cuentas y no se por que ???
 Otro es la manera que use, de asignar el valor del pwm (el resultado de las cuentas ) a la posicion del potenciometro ( el potenciometro si es lineal) lo hice con unos if , pero desconfio la forma que lo hice. Bueno esos creo que son los problemas que veo seguro habra mas que no tengo idea ,ja ja !!!
Basicamente aunque entiendo todas las cuentas que hago ,no se como hacer para expresarlas en el pwm y que de asi  :z) ja ja
Les adjunto el codigo y una foto del cuadro de variables del proteus , haber si me pueden orientar un poco con esto ,que creia estar tan cerca y cada vez lo veo mas lejos
Un comentario : los valores del extremo dercho ,el extremo izquierdo y el valor central no los calculo ya que los grabo en la eeprom posicionando el potenciometro manualmente.
Les agradezco cualquier ayuda y desde ya muchas gracias

Código: C
  1. #include <16f876a.h>
  2. #device adc =10
  3. #use delay (clock=8M)
  4. #fuses XT,NOWDT,NOPROTECT,NOLVP
  5. #include <internal_eeprom.c>
  6. #use fast_io(B)
  7. #use fast_io(c)
  8. #use fast_io(a)
  9.  
  10. //******declaracion de variables******************************
  11.  
  12. float cursor=0,toper=0,topbr=0,cero=0,ciclo_util=0;
  13.  
  14. float  a=0,b=0,d=0,e=0,c=0;
  15. float constante (float topbr,float toper);
  16. float funcionBr (float cursor,float cero);
  17. float funcionEr (float cero,float cursor);
  18. //***********************************************************
  19. void main()
  20. {
  21. set_tris_c(0b00000000);
  22. output_c(0b00000000);
  23. set_tris_b(0b11111111);
  24. output_b(0b00000000);
  25. //****************ADC**************************
  26.   setup_adc_ports(AN0);//* entrada analogica*//
  27.   setup_adc (ADC_CLOCK_INTERNAL);
  28.   setup_COUNTERS(RTCC_internal.rtcc_div_8);
  29.  
  30. // *************PWM**************************************
  31.  
  32.   setup_ccp1(CCP_PWM);
  33.    setup_timer_2(T2_DIV_BY_16,255, 1);
  34.    set_pwm1_duty(ciclo_util);
  35.    
  36. //**********************************************************  
  37.  
  38.    
  39.    WHILE (1) {
  40.    
  41.       set_pwm1_duty(ciclo_util);
  42.      
  43.       set_adc_channel (0);
  44.       delay_us (20);
  45.       cursor = read_adc ();
  46.      
  47.  //*********************************************
  48.  
  49.      if (input(pin_b4)==0)//switch que habilita la configuracion
  50.    {                      // de parametros  
  51.  
  52.      if (input(pin_b1)==1)//switch que habilita para establecer
  53.    {                      // el limite izquierdo ( toper)  
  54.  
  55.     if (input(pin_b0)==1)//boton que graba en la eeprom
  56.    {
  57.    write_int16_eeprom(0x120,(float) cursor);// escribe en la memoria
  58.    delay_ms(15);                            // el valor de toper
  59.    toper=read_int16_eeprom(0x120);          
  60.  
  61.    }
  62.  
  63.    }
  64.  
  65.      if (input(pin_b2)==1)//switch que habilita para establecer
  66.    {                      // el limite derecho ( topbr)
  67.        
  68.                        
  69.     if (input(pin_b0)==1)// boton que graba en la eeprom
  70.    {
  71.    write_int16_eeprom(0x122,(float) cursor);// escribe en la memoria
  72.    delay_ms(15);                           // el valor de topbr
  73.    topbr=read_int16_eeprom(0x122);
  74.  
  75.    }
  76.  
  77.    }
  78.  //****************CERO************************
  79.     if (input(pin_b3)==1)//switch que habilita para establecer
  80.    {                      // el valor central  ( cero )
  81.    
  82.     if (input(pin_b0)==1)// boton que graba en la eeprom
  83.    {
  84.  
  85.    write_int16_eeprom(0x126,(float) cursor);// escribe en la memoria
  86.    delay_ms(15);                            // el valor central (cero)
  87.    cero= read_int16_eeprom(0x126);
  88.    delay_ms(15);
  89.    }  
  90.    }
  91.     }  
  92. //****************************************
  93.    if (input(pin_b4)==1)//switch que habilita el funcionamiemto
  94.   {
  95.    cero= read_int16_eeprom(0x126);
  96.    delay_ms(15);                  
  97.                                    
  98.    toper=read_int16_eeprom(0x120);
  99.    delay_ms(15);                  
  100.      
  101.    topbr=read_int16_eeprom(0x122);
  102.    delay_ms(15);
  103.  
  104. //********************************************************
  105.     c = constante ( topbr, toper);// 1023 /(limite izq - limite derecho)
  106.                                  
  107.     d = funcionBr ( cursor, cero);//lectura adc - posicion central
  108.     a = (d * c)+ cero;//este será al valor del pwm cuando el adc >
  109.                       // al valor central
  110.     b = funcionEr (cero,cursor);
  111.     e = (b * c)-cero;//este será al valor del pwm cuando el adc <
  112.                       // al valor central
  113.                      
  114. //*********************************************************
  115.    if (cursor < cero) //si la lectura del adc es < que cero
  116.    {
  117.    ciclo_util  = e;  // PWM tomara el valor de (e)
  118.    
  119.    }
  120.    
  121.    if (cursor == cero)
  122.    {
  123.    ciclo_util= cero;
  124.    }
  125.    
  126.    if (cursor > cero)
  127.    {
  128.    ciclo_util = a;
  129.    }
  130.   }
  131. }  
  132. }
  133. //*****************funciones*************************
  134.  
  135.  
  136. float constante (float topbr,float toper)//Funcion que devuelve el valor
  137. {                                       // de la constante restando el
  138.    topbr=read_int16_eeprom(0x122);     // limite mayor al menor  
  139.    delay_ms(15);                       // y dividirlo por 1023
  140.    toper=read_int16_eeprom(0x120);
  141.    delay_ms(15);
  142.    
  143.   RETURN 1023/(topbr - toper);
  144. }
  145.  
  146. float funcionBr (float cursor,float cero)// funcion que se usa cuendo el
  147. {                                       // el valor del adc sea mayor al
  148.    RETURN (cursor - cero);              // valor central  
  149. }
  150.  
  151. float funcionEr (float cero,float cursor)// funcion que se usa cuendo el
  152.                                        // el valor del adc sea menor al                                        
  153. {                                      // valor central
  154.    RETURN ( cero -cursor );
  155. }
                                                                               Saludos!!!!
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 17 de Junio de 2015, 22:46:14
Hola arielmdq, lamentablemente en C no te puedo ayudar, por ahí te conviene colocar un post nuevo en el apartado Lenguaje C para microcontroladores PIC (http://www.todopic.com.ar/foros/index.php?board=4.0) realizando nuevamente esta pregunta anterior o un link que redirija al usuario a este post.

De seguro conseguirás más respuestas que estando en el foro técnico.

Un saludo.

Atte. CARLOS.

Pda. Lo acabo de hacer por vos, veremos si alguien presenta alguna posible solución. LINK (http://www.todopic.com.ar/foros/index.php?topic=44686.0) a mi solicitud.
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 18 de Junio de 2015, 07:57:14
Muchas gracias Carlos !!!! te agradezco todo lo que me has ayudado, aprendi un poco sobre operacionales que nunca habia usado y lo mejor es que funciono todo lo que me dijiste.Bueno con respecto al programa yo me pongo todos los dias un rato,cuando salgo del laburo, haber si lo hago andar pero todavia no pude, asi que como decis vos ahora que lo linkeaste capaz algun genio de los del C me de una manito.Si me permitis (me da un poco de verguenza y no quiero abuzar de tu confianza)  pero te queria hacer otra pregunta con respecto a lo mismo.Si quisiera usar un voltimetro con 0 al centro + 24v -24v ,lo podria hacer con 2 operacionales mas? .Osea sacando 2 señales pwm, con una manejar uno como esta ahora y con otra manejar el otro en configuracion inversora y asi manejar el voltimetro?.Es esto posible o estoy diciendo una burrada ja ja .O tal vez con uno solo se pueda hacer y obiamente no se como ja ja.Por favor no te sientas comprometido a responder ya me has ayudado bastante, nuevamente muchas gracias .Saludos!!!!
Título: Re: Como amplificar una escala de tension
Publicado por: KILLERJC en 18 de Junio de 2015, 14:12:35
Una forma de simplificar los calculos de Chaly:

Formula de Chaly:

Código: [Seleccionar]
818>x>511  -------   [(x-511)*1.6688]+511
205<x<511  -------   [(511-x)*1.6688]-511

Simplificando esas operaciones

Código: [Seleccionar]
818>x>511  -------   (x*1.6688)-341.77
205<x<511  -------   -(x*1.6688)+341.77

Lo cual pasado a codigo C:

Código: C
  1. int a;
  2.  
  3. if (x>=511)
  4. {
  5.     a = (float)(x*1.6688) - 341.77;
  6.     set_pwm_duty(a);
  7. }
  8. else
  9. {
  10.     a = 341.77 - (float)(x*1.6688);
  11.     set_pwm_duty(a);
  12. }

Observa que a es un entero ( imagino que de 16bits ) ya que el registro que admite el duty no posee "comas" sino que puede almacenar unicamente numeros enteros

Y una cosa mas que falto es limitar la entrada, se definió solamente desde 205 a 818 la formula.
Cualquier otro valor dará un resultado inesperado

Código: C
  1. if(x<205) { x=205;}
  2. if(x>818) { x=818;}
  3.  

Con eso limitamos a que si supera uno de esos minimos/maximos el valor sea el maximo.
Por ejemplo, para demostrar que ocurre si no limitamos, si probamos un valor fuera de rango, como 100, nuevamente le robamos a Chaly algo ( gracias Chaly )

                      Vc          Vc    Vad                           Const                   Vc
2) Si VALOR < 511 ---> 511 - 100 = 411 ---> 411 x 1.6688 = 685 ---> 685 - 511 = 174

Nos da 174, es decir si bajamos del limite que fijamos empieza a incrementar el duty y se va a sentir bastante extraño que estando en un comienzo tenga un duty, avances el duty vaya a 0 y luego incremente, contrario a toda logica. Asi que por eso se lo limita.

En tu programa limitas la salida pero antes le hiciste hacer todos los calculos con el otro valor. El resultado final es el mismo.
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 18 de Junio de 2015, 19:44:24
Hola arielmdq, paso a responderte.

Si me permitis (me da un poco de verguenza y no quiero abuzar de tu confianza)  pero te queria hacer otra pregunta con respecto a lo mismo.Si quisiera usar un voltimetro con 0 al centro + 24v -24v ,lo podria hacer con 2 operacionales mas? .Osea sacando 2 señales pwm, con una manejar uno como esta ahora y con otra manejar el otro en configuracion inversora y asi manejar el voltimetro?.Es esto posible o estoy diciendo una burrada ja ja .O tal vez con uno solo se pueda hacer y obiamente no se como ja ja.Por favor no te sientas comprometido a responder ya me has ayudado bastante, nuevamente muchas gracias .Saludos!!!!

Estás diciendo una burrada  :D  :D  :D
El voltímetro -24 +24 posee una sola bobina, por lo que te será muy difícil de conectarle la salida de dos operacionales para hacer lo que tienes pensado.

De hecho, ese circuito sin muchas reformas puede hacer funcionar un voltímetro con escala positiva/negativa, el único problema es que: 24 + (-24) son 48 volts y muy pocos operacionales alcanzan esa tensión a sus salidas.

Por lo tanto, la única solución posible es usar una configuración puente, lo cual complica un poco, no mucho su diseño, más allá de esto, para usar una configuración puente y ese voltímetro necesitarías alimentar el operacional con por lo menos 27 volts. Si dispones de estos 27 mínimos no hay muchos problemas, ahora si no los tienes, pues deberás de hacer una fuente de algún tipo para conseguirlos a partir de la tensión de la cual dispongas, y esto sí puede ser un problema.

Un saludo.

Atte. CARLOS.

Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 18 de Junio de 2015, 19:59:57
  :D :D :D viste era una burrada .  Gracias Carlos deja se complica todo y ya estoy complicado con la programacion ja ja ,deci que aca killerjc me esta ayudando un monton .Te agradezco de todos modos me sacaste la duda .Muchas gracias !!!!! Saludos !!!!
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 05 de Julio de 2015, 22:48:10
Hola Carlos !!! te queria hacer una pregunta con respecto al circuito que me pasaste del amplificador operacional con el transistor .Vos sabes que lo estoy haciendo andar con 24 volts, cambie las resist para obtener esta salida, pero el bc 337 me calentaba, asi que le puse un bc 637 y con una resistencia del emisor a negativo de 100k y calienta menos pero calienta.
Es esto normal?
Estoy haciendo algo mal?
O esta bien asi y no pasa nada ?
Adjunto el esquema como lo tengo armado en la placa para ser mas claro.
                                                                                                       Saludos !!!!
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 06 de Julio de 2015, 13:40:09
Hola arielmdq, veamos esto:

Hola Carlos !!! te queria hacer una pregunta con respecto al circuito que me pasaste del amplificador operacional con el transistor .Vos sabes que lo estoy haciendo andar con 24 volts, cambie las resist para obtener esta salida, pero el bc 337 me calentaba, asi que le puse un bc 637 y con una resistencia del emisor a negativo de 100k y calienta menos pero calienta.
Es esto normal?
Estoy haciendo algo mal?
O esta bien asi y no pasa nada ?
Adjunto el esquema como lo tengo armado en la placa para ser mas claro.
                                                                                                       Saludos !!!!

Bueno, el calentamiento es normal, tu siempre hablaste de tensiones y nunca as tenido en cuenta las corriente y por consiguientes las potencias (relación entre corriente y tensión) manejadas.

Desde ya te comento que la resistencia de 100K lo único que hace es empeorar el problema, por lo tanto quítala. En esa ubicación no tiene razón de ser... Lo que sí debes de conectar en ese lugar es un diodo y en inversa, para proteger al transistor de la fuerza contra-electromotriz generada por la bobina del voltímetro. Cátodo del diodo conectado al emisor del transistor y ánodo del diodo conectado a masa.

En el circuito original, tu comentabas que el instrumento indicador era un voltímetro tipo análogo de instrumentos, por experiencia se que esos voltímetros posee una resistencia interna bien elevada, por lo que su consumo de corriente es muy reducido y la potencia que disipan muy escasa. Por lo que se que el BC337 está muy sobre dimensionado para tal función y por este motivo no le dí mayor importancia.

Estimo que ahora, con la fuente de 24V as reemplazado dicho instrumento, y este instrumento no debe de poseer una resistencia tan elevada como el anterior, por lo que debe de estar exigiendo más corriente del transistor. Esta corriente extra es la que te está haciendo calentar el transistor, un ejemplo:

Suponiendo que el instrumento original posea una resistencia de 1000 ohms y necesite 12V para fondo de escala:

12 / 1000 = 0.012A ----> 12V x 0.012A = 0.144 Watts

y a mitad de escala sería:

6 / 1000 = 0.0006A ----> 6V x 0.006A = 0.036 Watts

Como en este último ejemplo el instrumento recibe solo 6 volts pero la fuente entrega 12 volts, pues lo 6 volts faltantes los consume el transistor, o sea que el transistor también esta disipando 0.036A como el instrumento. (en realidad un poco más ya que la fuente entrega un poco mas de 12V)

Ahora con el nuevo instrumento, que de seguro posee una resistencia menor, supongamos que esta es de 200 ohms y necesita de 24 volts para fondo de escala, los cálculos quedarían así:

24 / 200 = 0.12A ----> 24V x 0.12A = 2.88 Watts

y a mitad de escala sería:

12 / 200 = 0.06A ----> 12V x 0.06A = 0.72 Watts

En este último caso llevando el instrumento a media escala, el trasistor estaría disipando 0.72 watts, un valor que hará que un encapsulado TO92 caliente demasiado, y necesitarás usar un encapsulado que permita disipar mayor potencia.

En este caso, puedes usar un transistor tipo BD139, que permite disipar una potencia bastante mayor, el problema de usar un transistor más grande es que también poseen menor ganancia, y al poseer menor ganancia el operacional necesitará entregarle más corriente para el mismo resultado final, pero los operacionales tienen una corriente de salida limitada, por lo que estamos en un apriete  :D pero tiene solución.

Para solventar lo de la ganancia se usa un transistor darlington o una configuración darlington, para el primer caso debemos usar un transistor darlington de encapsulado mayor al TO92, un transistor común y clásico de este tipo sería el TIP122, encapsulado TO220, por lo que fácilmente controlará la potencia y la corriente necesaria para mover el instrumento nuevo, sin mostrar calentamiento.

Para crear una configuración darlington usaremos el siguiente circuito:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=44651.0;attach=24121;image)

Como verás es muy sencilla de construir, tanto el BC548 como el BD139 pueden ser reemplazados por cualquier juego de transistores NPN, por ejemplo BC337-TIP41, BC548-TIP41, BC337-BD139, etc

Las resistencias pueden ser de valores similares, mientras no se alejen mucho del valor original, no es muy estricto. Este juego de resistencia está para una mejor linealidad y desempeño.

Por lo demás, este conjunto se conecta tal y como si fuera un transistor normal, en el esquema puedes ver la definición de cada pin.

Espero te sea de ayuda. Cualquier duda la consultas.

Un saludo.

Atte. CARLOS.


Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 06 de Julio de 2015, 18:19:45
Muchas gracias Carlos como siempre impecable su explicacion  ((:-)) , creo que por razones de espacio voy a optar por colocar un transistor darlinton en vez de  armar la  configuracion darlinton como me mostras en la figura ,asi que manos a la obra y luego comento los resultados ,mil gracias !!!!!
                                                                                                     Saludos!!!!
Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 09 de Julio de 2015, 19:13:56
Perdon por la tardanza pero  queria probarlo bien ,le puse un tip 122 en lugar del bc 337 del principio y cambie la resistencia de 100k por el diodo como dijistes  Carlos , y todo bien a penas se entibia en la peor condicion y todavia no le puse disipador asi que creo que es la solucion, lo tengo conectado hace 2 dias y funciona perfecto , le muestro el final, como quedo la placa .Muchas gracias por la ayuda .
                                          Saludos !!!!!
Pd : no se como cerrar el tema, si es necesario, si alguien me puede decir  como , lo cierro .Gracias !!!!
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 09 de Julio de 2015, 19:20:33
Hola arielmdq, felicidades por el proyecto, la PCB a quedado muy linda, felicitaciones.

Si el TIP122 no calienta como para quemarte los dedos, pues no le hace falta disipador, y por lo que tu comentas solo entibia en el peor de los casos, pues con más razón.

Un consejo, fija de alguna manera los disipadores a la PCB, porque de no hacerlo, a la corta o larga y por culpa de las vibraciones terminarán cortando los pines de los componentes a los cuales están montados.

No es necesario cerrar el tema, en este foro los sabemos dejar abiertos para que cualquier interesado en lo mismo o algo similar pueda seguir el hilo. Igual gracias por preguntar.

Un saludo.

Atte. CARLOS.

Título: Re: Como amplificar una escala de tension
Publicado por: arielmdq en 09 de Julio de 2015, 19:37:33
Gracias por los consejos Carlos, voy a hacer lo que me decis con los disipadores .
Ahora empece a leer un hilo en el que hablas de termocuplas para medir altas temperaturas ,que esta muy interesante, quizas mas adelante encare un proyecto que tengo pendiente hace rato, que es para medir temperaturas de caños de escape de los motores de los barcos,es que  los que venden hechos son excesivamente caros, tal vez me anime  :lol:.
Gracias por todo Carlos!!!!, me encanta este foro !!!!
Entoces queda abierto este hilo OK
                                             Saludos!!!!!
Título: Re: Como amplificar una escala de tension
Publicado por: Chaly29 en 09 de Julio de 2015, 19:52:26
Hola arielmdq, el circuito para  termocupla que aparece en ese hilo es precisamente para medir temperaturas de escapes, en mi caso lo use para medir escapes de motores 2T de carreras, pero nada impide su uso en escapes de barcos.

Saludos.

Atte. CARLOS.