Mostrar voltaje sin usar ADC

Si no me esta funcionando, si me guarda el ciclo activo, pero la muestra del contador no y se me defaza la tensión con respecto a la muestra del lcd, porque cuando corta la energía siempre me inicia 0, tenias razón es bastante difícil hacerlo así!
 
En la simulación a mi sí me guardó las dos variables, pero colocando un pulsador hacia tierra en RB4.
Y es lógico que obtengas una cosa por un lado y otra por otro lado, porque digamos que no hay una sincronía.
Hacerlo de esa forma es un engaño sin sentido, teniendo los recursos del microcontrolador para hacerlo de forma correcta. (ADC)
 
La fuente la tengo con el adc, quería lograr hacerlo de esa manera para que quede mas estable solo cuando apretar los pulsadores, colocando un capacitor de 10 uf lo más cerca de la pata del pic queda estable y no se mueva nada, solo te muestra una caída de 0.100 de la fuente
 
No sé qué estés tratando de hacer, pero de cualquier forma, no es correcto así.
La lectura del ADC siempre va a variar si se tiene como referencia el mismo VDD del microcontrolador.
Por eso te mencioné lo de usar otra referencia y un Timer para tomar la lectura cada x tiempo.
Promediar también funciona pero si lo haces correctamente, pero tienes el siguiente error.
Estás realizando 49 lecturas y luego divides la suma por 50.

Ten en cuenta que var2<50 nada más llegará hasta 49.
 
Hola nuevamente , vengo un problema que no se como resolver , estoy tratando de medir con un voltímetro directamente la salida , hice la etapa de amplificación con el lm358 , me mide de 1 volt en 1 volt , como hago hago para que muestre 0.1 en el voltímetro?
Código:
nclude <16f886.h>
#device ADC=10
#use     delay(internal = 8MHz)                          
#include <flex_lcd416.c>
#define led PIN_B5

//#include <internal_eeprom.c>



int8   ciclo_activo=1;
  int16 cont3;    

void establecer_ciclo (int8 ciclo)
{
 

   set_pwm1_duty(ciclo);   // Establecer el ciclo activo

}


void pulsadores()
{  
   if (input(PIN_A4)==0)
   {
    while(!input(pin_a4)){
      ciclo_activo ++;  // Incrementar el ciclo activo.
      if (ciclo_activo > 249) ciclo_activo = 249;   // No permitir que el ciclo activo suba de 249
      delay_ms(15);
      establecer_ciclo(ciclo_activo);
     
   }
   }
   if (input(PIN_A5)==0)
   {
    while(!input(pin_a5)){
      ciclo_activo --;  // Disminuir el ciclo activo.
      delay_ms(15);
       if (ciclo_activo <= 1) ciclo_activo = 2;  // No permitir que el ciclo activo baje de 1
      establecer_ciclo(ciclo_activo);
       
   }
 
}
}

 
void memoria()
{
int16 cont;    
   if(input(pin_a2)==0){
          while(!input(pin_a2)){
          cont++;
          delay_ms(5);
          if (cont >500){
         
          write_eeprom(00,ciclo_activo ); // guardo el dato ciclo activo
         delay_ms(50);
   
         cont = 0;
          }
          }
       
           ciclo_activo =read_eeprom(00); // paso el dato a la variable ciclo_activo
         
     
         
           cont=0;
            delay_ms(50);
             establecer_ciclo(ciclo_activo);
           
            }

}

void memoria1()
{
int16 cont1;    
   if(input(pin_a3)==0){
          while(!input(pin_a3)){
          cont1++;
          delay_ms(5);
          if (cont1 >500){
         
          write_eeprom(01,ciclo_activo ); // guardo el dato ciclo activo
         delay_ms(50);
   
         cont1 = 0;
          }
          }
       
           ciclo_activo =read_eeprom(01); // paso el dato a la variable ciclo_activo
       
       
         
           cont1=0;
            delay_ms(50);
             establecer_ciclo(ciclo_activo);
             
            }
}  


void energia()  
{
// set_adc_channel(11);
//  delay_us(50);
//  ene = read_adc();
// if(ene<200)
if(input(pin_B4)==0){
cont3++;
delay_ms(1);
if (cont3 >10) {
write_eeprom(03,ciclo_activo );
delay_ms(50);
cont3 = 0;            
               }
                  }
}

void main()
{
 
ciclo_activo =read_eeprom(03);                  
    establecer_ciclo(ciclo_activo);  
   
setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4,249,1);   // 1000 Hz. @ 4 MHz.
   set_pwm1_duty(1);                   // Ciclo activo al mínimo



   #ZERO_RAM   // Limpiar RAM. (Variables en 0)

    establecer_ciclo(ciclo_activo);
 
   
   while (true)
   {
  pulsadores();
   memoria();
memoria1();

energia();



       
       
       
       
    }



   }

Lo que necesito que el ciclo activo se muestre más dividido ! Estuve tomando mediciones en la salida del pwm después del filtro pasa bajo y cada vez que pulso sube 200 milivolt el pwm, cómo puedo hacer para que suba de 50 milivolt?
 
Eso no tiene sentido y no se puede establecer cualquier valor para el ciclo activo.
Todo tiene un motivo y un por qué, y para eso están las fórmulas en la hoja de datos.

Suponiendo que eso fuera válido, al compilador le daría lo mismo 1/2 que 0.5
Y establecer ese valor quedará totalmente fuera del rango para el registro CCPR(X)L

Por ejemplo, si quiero generar PWM a 1 KHz con un ciclo activo del 50 % con FOsc = 4 MHz:
Tomando como referencia la fórmula de la hoja de datos, tendríamos qué...
PR2 = 249 y CCPR1L = 124
Así que en PICC quedaría como:
setup_timer_2(T2_DIV_BY_4, 249, 1);
set_pwm1_duty(124); // Ciclo activo al 50 %

Entonces, si el valor máximo para un ciclo activo del 100 % es 249, CCPR1L no puede ser superior a 249
Lo que se establecería de esta forma: set_pwm1_duty(249); // Ciclo activo al 100 %
Y obviamente los registros no trabajan con decimales o variables del tipo float.
Por lo tanto, lo que propones no funciona ni tiene sentido.

Te recomiendo que leas muy bien la hoja de datos para que comprendas mejor cómo funcionan los módulos de los PIC.
 
Si tenes razón, estoy sin poder hacerlo andar, no se porque en cada vez que pulso me sube de 1 volt y vaya de 1 volt a la vez, no puedo lograr que suba de 50 milivolt por cada vez que se pulsa el botón!
 
No creo que eso sea posible ni usando el módulo CCP a su máxima resolución. (10 bits) O sea, 1023 pasos, sin contar el 0
De hecho, el ciclo activo se puede mantener sin cambios pasando de 800 a 820 en CCPR(XH/L) si se usara a 10 bits.
O en 8 bits puede no haber cambios del ciclo activo si se pasa de 80 a 85 en CCPR1L
 
Hola consulta para no habrír otro post, puedo usar dos pulsadores apretados al mismo tiempo para guardar el dato en la memoria, yo uso para variar el ciclo activo los pin a4 y a5 se puede declarar en el if a4 y a5 para guardar el dato?
 
hola miembros del foro , estoy haciendo mejoras en mi fuente y quiero sacar la lectura del adc , pero seguir mostrando los datos de voltaje en pantalla y no se como hacer los cambien en la función del ciclo activo para que muestre un valor aproximado de 0 volt a 18
Código:
void establecer_ciclo (int8 ciclo)
{
  
     set_pwm1_duty(ciclo);   // Establecer el ciclo activo
    lcd_gotoxy(1,3);
   // Obtener el porcentaje del ciclo activo.
   porcentaje2 = (ciclo / 24.5) *10;
   // Mostrar el porcentaje del ciclo activo para la carga.
   printf(lcd_putc," Rf:%02u%%",porcentaje2,);
  
        
}
en el código muestra porcentaje , en ves de porcentaje quiero mostrar voltaje , necesito una idea de como cambiarlo , gracias
 
Es simple, matemática pura, sin usar tus variables
Valor_max
X%
x%=ciclo expresado en porcentaje

(X5 * Valor_max)/100= valor_dc

Es mucho más práctico utilizar el ADC del micro, uno esterno, o un CI dedicado y no perder tanto tiempo y seguir sin tener nada, hay cosas en las que hay que ser prácticos sobre todo si no se tienen los conocimientos necesarios
 
Última edición:
Atrás
Arriba