Mostrar voltaje sin usar ADC

Pido ayuda porque no se como hacerlo, lo que quiero hacer es: cuando aprieto el pulsador que muestre el " voltaje " subir de 0.1 a 0.2, 0.3 así subiendo un truco de muestra no una medición por adc, y así hasta llegar a 18.0 volt

Si uso un contador de 0 a 18 y lo uso en la función de ciclo de pwm?

void voltaje()
{
float voltaje;
voltaje= ciclo_activo;
voltaje=voltaje /14;
lcd_gotoxy(11,1);
printf(lcd_putc,"V=%4.1fV ",voltaje);

}

asi me funciona pero me lo muestra al revés cunado subo desciende e viceversa .
 
Ahora no entiendo que es lo que quiere realmente hacer porque usted ha planteado al menos dos objetivos:

hola necesito ayuda con un problema que no se como resolver , tengo un programa que muestra la tensión , un voltámetro la muestra es por el adc pero cuando pongo una carga se mueve mucho la muestra , como puedo hacer para mostrarla en el lcd que quede fija , por mas que haya pequeñas oscilaciones

Pido ayuda porque no se como hacerlo, lo que quiero hacer es: cuando aprieto el pulsador que muestre el " voltaje " subir de 0.1 a 0.2, 0.3 así subiendo un truco de muestra no una medición por adc, y así hasta llegar a 18.0 volt

Lo que usted quiere es ¿variar el ancho de pulso de la señal PWM por medio de dos pulsadores, uno para aumentar y el otro para disminuir? y también ¿mostrar en una LCD el valor del voltaje promedio de la señal PWM y el porcentaje del ancho de pulso?
Tengo que armarlo todo, o buscarlo mejor dicho

Al menos captura del trabajo en el simulador.
 
Utiliza el modo PWM del modulo CCP del PIC es mas sencillo que hacerlo por software.
Idealmente el PIC solo puede sacar hasta 5V cuando el ciclo de trabajo es 100%, entonces si necesita sacar un voltaje de hasta 18V debe colocar un circuito externo que amplifique el voltaje.
 
Utiliza el modo PWM del modulo CCP del PIC es mas sencillo que hacerlo por software.
Idealmente el PIC solo puede sacar hasta 5V cuando el ciclo de trabajo es 100%, entonces si necesita sacar un voltaje de hasta 18V debe colocar un circuito externo que amplifique el voltaje.
Si lo amplifico con lm338 para tener los 18 volt pasando por un filtro pasa bajo, ahora estoy trabajando en el esquema así lo subo, y viendo como hacer el promedio para mostrar la tensión
 
El LM338 es un regulador de tensión por lo tanto idealmente nunca podrá sacar mas voltaje que el de su entrada.

Si el voltaje de salida es tan solo una señal de información o la carga es de muy baja potencia entonces puede usar un OP-AMP con configuración amplificador no inversor y le ajustas la ganancia.

Pero si en cambio tienes un motor o una carga que demande mas de algunos cientos de miliamperios entonces se complica la cosa, pienso que en este caso hay que recurrir a un convertidor DC-DC.
 
No hace falta hacer eso si tienes en algunas de las fuente de alimentación esa tensión disponible o partiendo de un duplicador o triplicador o aún mejor utilizar un regulador ajustable para que entregue entre 1.2V y 18V
 
No es por ser molesto, ojo la de veces que se le ha pedido al compañero que suba el esquema, al final estoy de acuerdo con gudino, juntemos firmas jeje, o no quiere compartir con el foro y solo quiere recibir, o no sabe subir el esquema.
 
Todo esto son temas ya tratados, los retardos y las oscilaciones en la lectura de un ADC.
Eso de que la fuente no oscila... Si el ADC lo mide será que sí que oscila. Un polímero lleva un conversor de doble rampa que es muy sencillo, muy preciso y muy lento. Por eso no oscila la lectura del polímero y sí que oscila la lectura del ADC.

Lo más sencillo es promediar lecturas consecutivas.
Lo más lógico es nunca usar retardos salvo que se haga un programa de un proceso ultrahipersimple.
 
Código:
void tension()
{

long voltaje;

  if (input(PIN_A4)==0)
   {
    while(!input(pin_a4)){
      voltaje++;  // Incrementar
      if (voltaje > 18) voltaje = 18;  
      delay_ms(10);

    }
   }
  if (input(PIN_A5)==0)
   {
    while(!input(pin_a5)){
      voltaje --;
       if (voltaje <= 1) voltaje = 0;
         delay_ms(10);
 
    }
   }
 
        lcd_gotoxy(11,1);
  printf(lcd_putc,"V=%0.2lu",voltaje);

}


Hola miembros del foro opté por hacerlo así , ahora , ¿Porque no me corre el contador ?

Como sería un contador de 0 a 18 ascendente y descendente con pulsador y la cuenta que muestre sea con coma, ejemplo 1,2
1,3
1,4
Así sube y baja!
No me doy idea del código si uso if o un for
 
Como seria un contador de 0 a 18 ascendente y descendente con pulsador y la cuenta que muestre sea con coma, ejemplo 1,2
1,3
1,4
Así suba y baje!
No me doy idea del código si uso if o un for

¿ Como sería la presentación de los números < 10 ?, ¿ 0,9 por ejemplo ?

Si ese es el caso, solo dejas la coma fija en el display, en lo demás es un contador común y corriente.
 
Código:
#include <16f886.h>
#device ADC=10
#use     delay(internal = 8MHz)                           
#define  LCD_DATA_PORT getenv("SFR:PORTC")
#include <flex_lcd.c>

#define LCD_RW_PIN    PIN_C3




int voltaje=0;


void tension()
{

 
  if (input(PIN_A4)==0)
   {
    while(!input(pin_a4)){
      voltaje++;  // Incrementar
        delay_ms(10);
 if (voltaje > 18) {
 voltaje=18;
 
 }

    

    }
   }
  if (input(PIN_A5)==0)
   {
    while(!input(pin_a5)){
            delay_ms(10);
      voltaje --; 
  if (voltaje <= 1) {
  voltaje = 0;
  }
  
    }
   }
  
           lcd_gotoxy(11,1);
  printf(lcd_putc,"V=%0.3u",voltaje);
}
 void main ()
 {
 

  
  
  lcd_init(); 
  
  
   while (true)
   {
  
  
  
   tension();
  
   }
 }

hola estoy trabajando en este codigo y no me cuanta 1 en 1 y seria un contador decimal tendia que contar 0.1 0.2 0.3 asi hasta 18.0 pero todavia no lo puedo hacer andar gracias por responder
 
Hola, habría que ver el esquema eléctrico o imagen de simulación para saber cómo conectas las entradas.
Pero viendo rápidamente tu código, en el bucle del decremento está mal condicionado.
Pues tú le dices que si voltaje es menor o igual a 1 entonces será 0. Y ahí generas un underflow. Pues voltaje valiendo ahora 0 cuando se ejecute voltaje-- lo decrementa aún más y ahora será 255.
Deberías hacer lo sig.

if(voltaje>0) voltaje--;

Y para el tope superior puedes hacer:

if(voltaje<18) voltaje++;
 
Última edición:
si no se porque no me suma 1 en 1 ahí esta la simulacion
lo que no quiero que se de vuelta , cuando pulso que llego a cero y si sigo pulsando que quede en cero y asi cuando llego a 18 si sigo pulsando que quede en 18.0
 

Adjuntos

  • prueba3.rar
    45.8 KB · Visitas: 19
Lo que estoy viendo con tu código, es que el anti rebote que estas implementado esta mal, por eso no esta sumando de a uno, la forma correcta seria así:
Código:
void tension(){
 
  if (input(PIN_A4)==0){
    while(!input(pin_a4)){}
      voltaje++;  // Incrementar
         if (voltaje > 18){ voltaje=18;}
   }
 
  if (input(PIN_A5)==0){
    while(!input(pin_a5)){}
     voltaje --; 
       if (voltaje > 18) {voltaje = 0;}
   }
  
  lcd_gotoxy(11,1);
  printf(lcd_putc,"V=%2.1u",voltaje);
}
 
Código:
#include <16f886.h>
#device ADC=10
#use     delay(internal = 8MHz)                           
#define  LCD_DATA_PORT getenv("SFR:PORTC")
#include <flex_lcd.c>

#define LCD_RW_PIN    PIN_C3



 int  voltaje=0;


void tension()
{


 
  if (input(PIN_A4)==0)
   {
    while(!input(pin_a4)){
      delay_ms(10);
for(voltaje=0;voltaje <18;voltaje++)
{
delay_ms(60);
           lcd_gotoxy(11,1);
  printf(lcd_putc,"V=%3u",voltaje);
}

    }
   }
  if (input(PIN_A5)==0)
   {
    while(!input(pin_a5)){
            delay_ms(10);
    for(voltaje=18;voltaje >0;voltaje--){
    
    delay_ms(60);
             lcd_gotoxy(11,1);
  printf(lcd_putc,"V=%3u",voltaje);
    }

  
    
   }
  
   }
}
 void main ()
 {
 

  
  
  lcd_init(); 
  
  
   while (true)
   {
  
  
  
   tension();
  
   }
 }
 
 lo hice asi y me cuenta y baja pero estoy mas cerca , como puedo ponerle coma ala muetra no se me ocurre
Lo que estoy viendo con tu código, es que el anti rebote que estas implementado esta mal, por eso no esta sumando de a uno, la forma correcta seria así:
Código:
void tension(){

  if (input(PIN_A4)==0){
    while(!input(pin_a4)){}
      voltaje++;  // Incrementar
         if (voltaje > 18){ voltaje=18;}
   }

  if (input(PIN_A5)==0){
    while(!input(pin_a5)){}
     voltaje --;
       if (voltaje > 18) {voltaje = 0;}
   }
 
  lcd_gotoxy(11,1);
  printf(lcd_putc,"V=%2.1u",voltaje);
}
asi funciona pero cuando mantengo apretado el pulsador tendría que subir rápido y se queda , es difícil hacerlo pero con paciencia saldrá y su aya , gracias
 
Última edición:
Atrás
Arriba