Autor Tema: Como amplificar una escala de tension  (Leído 3353 veces)

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

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #15 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!!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #16 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!!!!
« Última modificación: 17 de Junio de 2015, 21:19:31 por arielmdq »
El tiempo es una ilusión ,solo existe el presente................

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Como amplificar una escala de tension
« Respuesta #17 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 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 a mi solicitud.
« Última modificación: 17 de Junio de 2015, 22:54:55 por Chaly29 »
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #18 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!!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8136
Re: Como amplificar una escala de tension
« Respuesta #19 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.
« Última modificación: 18 de Junio de 2015, 17:02:02 por KILLERJC »

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Como amplificar una escala de tension
« Respuesta #20 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.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #21 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 !!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #22 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 !!!!
« Última modificación: 05 de Julio de 2015, 22:52:00 por arielmdq »
El tiempo es una ilusión ,solo existe el presente................

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Como amplificar una escala de tension
« Respuesta #23 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:



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.


« Última modificación: 06 de Julio de 2015, 13:49:31 por Chaly29 »
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #24 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!!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #25 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 !!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Como amplificar una escala de tension
« Respuesta #26 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.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado arielmdq

  • PIC16
  • ***
  • Mensajes: 166
Re: Como amplificar una escala de tension
« Respuesta #27 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!!!!!
El tiempo es una ilusión ,solo existe el presente................

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: Como amplificar una escala de tension
« Respuesta #28 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.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.


 

anything