Controlar brillo de LED con PWM en PIC16F628A

Para sustituir ese PIC debes hacer "ingeniería inversa", se comienza sacando el esquema eléctrico del aparato, luego si hay uno que funciona a mano, se miden y detalla y analiza todas las funciones.

Con esos datos se pasa a hacer el programa que reemplaza al original con funcionalidad similar o mejorada.

Sin todos esos datos esenciales a la hora de programar es difícil llegar a un buen resultado.

No se tiene el esquema total del aparato y no se sabe que hace el que llamas potenciómetro(no se si es el preseet de 100K que se ve en la fotografía o es otro).

Ese PIC no tiene ADC incluido por lo que para usar un preset y dosificar algo, hay que implementar métodos de lectura alternativos a la simple lectura de la caída de voltaje clásica.

Uno de ellos es medir el tiempo de carga y descarga de un capacitor conectado a la resistencia variable del preset o potenciómetro(RC) y tomar decisiones en base a ello.
Adjunto un ejemplo y simulación en Proteus y Proton Basic en cuanto al lenguaje de programación.
hola gracias bueno ese preseet como lo llamas vamos es una resistencia variable de 100k como tu dices me varia un voltaje el cual hace que la señal que sale por el puerto RB6 del pic16f628a que me párese que es una señal cuadrada con una frecuencia de 1 mhz que la hacen con los timer de ese puerto es como si fuera la señal de un PWM
Ese PIC no tiene ADC incluido por lo que para usar un preset y dosificar algo, hay que implementar métodos de lectura alternativos a la simple lectura de la caída de voltaje clásica.
como busco un ejemplo de de eso que dices orientado a C por favor
 
Última edición:
les estoy pidiendo ejemplos es por que yo no soy programador pero tengo un amigo que sabe programar en C y el es el que me esta ayudando con el código por que yo le busco los ejemplos pero el no sabe sobre PIC por eso de los ejemplo ya me a ayudado en casi todo pero falta esa parte del potenciometro

bueno el equipo se daño el pic16f628a cuando lo prendo no ase nada tengo otro equipo igual le puse el pic del ese equipo al malo y funciona bien pero como todos sabemos no puedo copiar ese pic por que esta protegido entonces necesito programar tengo un pic16f628a nuevo pero esta vació
Lee tu mismo lo que has puesto, el micro del equipo dañado funciona en otro, el problema entonces esta en el hardware y eso es reparable, porque no nos muestras fotos del equipo, porque hasta aquí todo en el aire.
No hay un esquema no hay nada, imposible ayudar en tales condiciones. y no creo que la solución sea reprogramando el pic no tiene mucho sentido e incluso puede interferir en el funcionamiento globar, no saben de PIC's no saben electrónica, estan al horno con papas doradas
 
Hola a todos. Buscando llegué a este post.
Estoy buscando un ejemplo de PWM con un potenciómetro con el PIC16F628A y revisé el código que usted compartió con el señor y me sirve pero, ¿cómo le hago para que suba y baje la frecuencia con un potenciómetro? ¿Me podrías ayudar, por favor?
El PIC16F628A no cuenta con ADC para poder obtener la lectura análoga de un potenciómetro.
Uno similar con ADC sería el PIC16F88, pero sus terminales cambian.
Con el 16F628A en PICBasic se puede obtener una lectura pseudo análoga de baja resolución como ya te lo mencionaron.
Obviamente nada comparable a los 10 bits del ADC
 
El PIC16F628A no cuenta con ADC para poder obtener la lectura análoga de un potenciómetro.
Uno similar con ADC sería el PIC16F88, pero sus terminales cambian.
Con el 16F628A en PICBasic se puede obtener una lectura pseudo análoga de baja resolución como ya te lo mencionaron.
Obviamente nada comparable a los 10 bits del ADC
buenas espesemos de cero yace que el Pic16f628a no tienen salidas analógicas ni tienen ADC ,
pero en el circuito donde esta trabajando el pic16f628a tiene un potenciometro o resistencia variable,
y hace una caída de voltaje o variación de voltaje, Como le hago para que el pic me lea esa caída o variación de voltaje si tienes un ejemplo en mikroc mejor por favor
la otra pregunta seria el pic16f628a tiene un puerto con esto RB6/T1OSO/T1CKI/PGC ,
como podría sacar una señal cuadrada con una frecuencia de un 1Mhz usando Timer1 oscillator output que tiene ese pic tienen un ejemplo por favor si es en mikroC mejor
Lee tu mismo lo que has puesto, el micro del equipo dañado funciona en otro, el problema entonces esta en el hardware y eso es reparable, porque no nos muestras fotos del equipo, porque hasta aquí todo en el aire.
No hay un esquema no hay nada, imposible ayudar en tales condiciones. y no creo que la solución sea reprogramando el pic no tiene mucho sentido e incluso puede interferir en el funcionamiento globar, no saben de PIC's no saben electrónica, estan al horno con papas doradas
la tarjeta del equipo es esa y perdona lo escribí mal el Pic del equipo "bueno" lo pongo en el equipo malo y trabaja bien el equipo por eso digo que esta malo el pic

1557141836891.png

hola necesito algo de esto pero con el 16f628a.
Control de un servomotor utilizando un potenciometro, para la generación de la señal PWM no se utilizaron los módulos CCP, ya que se utilizo cualquier pin digital, para ello se utilizo el timer0 y la interrupción por desbordamiento de timer0.
 
Última edición:
El 16F628A tiene salidas digitales lo que no tiene es entrada de ADC(Convertidor Analogico Digital).

Parece que no entiendes que sin circuito eléctrico como base de comienzo es imposible analizar algo para saber qué se debe hacer sin basarse en adivinación ya que las posibilidades de confección de un circuito e implementación de un software controlador son diversas.

Saca el esquema eléctrico completo del aparato, muéstralo aqui y tal vez obtengas respuestas más precisas.
 
Como ya te han dicho, ese derivado no tiene conversor analógico a digital y por tanto no puede leer un potenciometro.
Llegados a este punto hay varias opciones:
- Que lo que parece un potenciometro, no lo sea, sea un encoder o algo así que dé pulsos digitales
-Que si que sea un potenciometro y en ese caso se lee o estima su valor a través de un circuito auxiliar
En ambos casos necesitas conocer exáctamete como es el circuito para saber que es lo que tienes que programar.

Cabe una tercera solución que es cambiar el potenciometro por dos pulsadores [+] y [-] con los que pulsando consecutivamente establezcas el valor de preset ese que buscas. Pero me imagino que lo que quieres es aprovechar el harware del que dispones sin tocar nada.

Para aprovechar lo que tienes es neceesario conocer que es lo que tienes, es decir, conocer exáctamente el esquema y como te han dicho mas arriba analizar en profundidad como funciona el que ya va para clonarlo lo mas fielmente posible.
 
Como ya te han dicho, ese derivado no tiene conversor analógico a digital y por tanto no puede leer un potenciometro.
Llegados a este punto hay varias opciones:
- Que lo que parece un potenciometro, no lo sea, sea un encoder o algo así que dé pulsos digitales
-Que si que sea un potenciometro y en ese caso se lee o estima su valor a través de un circuito auxiliar
En ambos casos necesitas conocer exáctamete como es el circuito para saber que es lo que tienes que programar.

Cabe una tercera solución que es cambiar el potenciometro por dos pulsadores [+] y [-] con los que pulsando consecutivamente establezcas el valor de preset ese que buscas. Pero me imagino que lo que quieres es aprovechar el harware del que dispones sin tocar nada.

Para aprovechar lo que tienes es neceesario conocer que es lo que tienes, es decir, conocer exáctamente el esquema y como te han dicho mas arriba analizar en profundidad como funciona el que ya va para clonarlo lo mas fielmente posible.
si supieras que pensé eso de los pulsadores por que hay un modelo que los trae así
y lo del potenciometro es para tumbar un voltaje de 3 voltios a tierra con un condensador como dijo uno de ustedes
 
Posiblemente el PIC, utiliza el propio PWM generado por él, y la señal del potenciómetro a un comparador analógico que él mismo posee.
La señal de PWM debe pasar por un filtro RC, para luego ser comparada con la referencia.
De esa manera puede regularse la señal de PWM.
 
Posiblemente el PIC, utiliza el propio PWM generado por él, y la señal del potenciómetro a un comparador analógico que él mismo posee.
La señal de PWM debe pasar por un filtro RC, para luego ser comparada con la referencia.
De esa manera puede regularse la señal de PWM.
hola puede ser pero en este caso no se esta usando el puerto que trae el ccp están usando el pin12 que es el puerto RB6/T1OSO/T1CKI/PGC y para mi están sacando un PWM pero usando los timer y los prescale
y el potenciometro esta conectado asi como muestra la imagen
 

Adjuntos

  • pot.png
    pot.png
    22.7 KB · Visitas: 18
Es que todo se puede aún con un microcontrolador sin ADC, la cosa es saber cómo implementarlo.
Nada difícil si se tienen conocimientos en electrónica y programación.
Ejemplos hay bastantes, y en base a ellos puedes adaptar alguno a tu necesidad.
 
Así es, pero es un comparador y por lo mismo no se adapta para lo requerido.
No es igual una lectura análoga de 10 bits a una comparación que únicamente nos entregará un 0 o un 1
Bueee....con un poco de imaginacion..tal vez sea posible variar dinamicamente por soft el umbral del comparador hasta que cambie de nivel "la salida" y de esa forma tener una aproximacion cercana a la tension en la entrada analogica 0 (no escribo AN0 por que se vé feo :rolleyes:).
Claro que la tension debe ser mas o menos estable mientras dure el proceso...

En fin....pensaba en voz alta...
 
Así es, pero es un comparador y por lo mismo no se adapta para lo requerido.
No es igual una lectura análoga de 10 bits a una comparación que únicamente nos entregará un 0 o un 1
Para que quede más claro; Activo el Módulo CCP para que funcione cómo PWM. Luego me fijo si el COMP me arroja 1 o 0.
Suponiendo la siguiente lógica, si me arroja 1, entonces reduzco paulatinamente el duty del PWM, de lo contrario lo aumento.
Claro que para lograrlo, es necesario conectar la salida del PWM con una red RC, a la entrada del módulo comparador, y la otra entrada del módulo al potenciómetro.
 
Última edición:
Es que es lo dicho, se puede obtener PWM hasta sin microcontrolador.
La cosa es saber implementarlo para el uso requerido.
Suponiendo que fuera mi caso, programo un PIC12F683 y asunto arreglado, pero si no sé programar pues voy a estar dando tumbos buscando la forma de hacerlo.
 
Es que es lo dicho, se puede obtener PWM hasta sin microcontrolador.
La cosa es saber implementarlo para el uso requerido.
Suponiendo que fuera mi caso, programo un PIC12F683 y asunto arreglado, pero si no sé programar pues voy a estar dando tumbos buscando la forma de hacerlo.
bueno tienes toda la razón por que si fuera un proyecto nuevo podría sacar el PWM con un clásico 555 pero hay esta el de talle estoy tratando de reparar un enegizador de cercos eléctricos marca Krom que tiene un Pic16f628a y que los genios de esa empresa lo programaron asi y estoy tratando de explicarles a ustedes que son los veteranos en micros para ver si me dan una ayuda por favor
Bueee....con un poco de imaginacion..tal vez sea posible variar dinamicamente por soft el umbral del comparador hasta que cambie de nivel "la salida" y de esa forma tener una aproximacion cercana a la tension en la entrada analogica 0 (no escribo AN0 por que se vé feo :rolleyes:).
Claro que la tension debe ser mas o menos estable mientras dure el proceso...

En fin....pensaba en voz alta...
Para que quede más claro; Activo el Módulo CCP para que funcione cómo PWM. Luego me fijo si el COMP me arroja 1 o 0.
Suponiendo la siguiente lógica, si me arroja 1, entonces reduzco paulatinamente el duty del PWM, de lo contrario lo aumento.
Claro que para lograrlo, es necesario conectar la salida del PWM con una red RC, a la entrada del módulo comparador, y la otra entrada del módulo al potenciómetro.
esa logica que haces creo que es asi por que me puse a medir el voltaje del potenciometro que llega pin17 que es RA0/ANO hay 2 voltios cuando giro el potenciometro hay una caída a cero quiere decir que esta recibiendo los 2 voltios que seria el alto, y cero que seria el bajo
 
Última edición:
Yo lo hago utilizando el Timer 0 para aumentar y disminuir el ciclo activo del PWM.
Es muy sencillo hacerlo de esa forma y el código no es complicado.

Cuando quiero incluir la sentencia de WDT el PWM deja de funcionar. Lo estoy probando con un led y deja de dimerizar. Esto se debe a que estoy usando el timer 0, el mismo que usa el PWM, cierto?
 
El Watchdog Timer produce un reset cuando desborda.
Por eso es que se debe configurar para se puedan ejecutar las rutinas, o restablecerlo antes de que lo haga.
Su uso no provocaría que el PWM deje de funcionar, lo que si lo haría sería un sleep.
¿Esto se debe a que estoy usando el timer 0, el mismo que usa el PWM, cierto?
El módulo CCP para el PWM usa el Timer 2, usar el Timer 0 para generar PWM es hacerlo por software.
Como el Timer 0 se puede direccionar al prescaler del Watchdog Timer, podría afectar.

Sin ver el programa es como para preguntarle a la bola de cristal y últimamente ha estado descompuesta.
 
Señores, si es posible leer un potenciometro con un micro sin adc. En proton ide existe el comando POT
en donde se mide el tiempo de descarga de un condensador que varia con la resistencia del potenciometro.

Lo usan con el pin RB0, seguramente usan la interrupción para disparar el timer ...no se si funcione con otro pin.
Un ejemplo aquí de PWM y potenciometro: POT - PWM
 
El Watchdog Timer produce un reset cuando desborda.
Por eso es que se debe configurar para se puedan ejecutar las rutinas, o restablecerlo antes de que lo haga.
Su uso no provocaría que el PWM deje de funcionar, lo que si lo haría sería un sleep.

El módulo CCP para el PWM usa el Timer 2, usar el Timer 0 para generar PWM es hacerlo por software.
Como el Timer 0 se puede direccionar al prescaler del Watchdog Timer, podría afectar.

Sin ver el programa es como para preguntarle a la bola de cristal y últimamente ha estado descompuesta.

Estoy usando el código de pwm que encontré en este foro por D@rkbytes con las salidas b1 y b2 conectadas a dos leds, utiliza el timer 2 y el timer 0 para ejecutar el PWM funciona bien hasta que quiero añadir el wdt y los leds empiezan a parpadear, entiendo que debo añadir wdt dentro del timer0 y un tiempo corto antes que se desborde. Adicionalmente uso el timer 1 para hacer retardos (Es solo didacticamente lo del timer 1). Realmente funciona el programa como quiero, pero no comprendo cual es el lugar mas optimo para colocar el wdt. Estoy programando en pic c

Archivo .h
CSS:
#include <16F627A.h>
#use delay(internal=4000000)
#FUSES NOBROWNOUT
#Fuses WDT
#use FIXED_IO( B_outputs=PIN_B1,PIN_B2,PIN_B3 )

Archivo .c
CSS:
#include <PWM.h>

short Flagok = 0;
int16 Retardo = 1000;
int16 Ms100 = 0;
int valorms = 2;// 8;    // para 104ms de desborde
int contador = 0;


int8 ciclo = 2;
int1 flag_cambio = 0;

void EstableceTiempo(int16 tiempo);

#define ciclo_max 249
#define ciclo_min 2


#INT_TIMER0
void sdi_deborde_timer0 (void)
{
restart_wdt();

   if(!flag_cambio)                    // Si no hay cambio de ciclo...
   {  
      ciclo ++;                        // Aumentar "ciclo"
     
      if(ciclo >= ciclo_max)           // Si se supera o se alcanza "ciclo_max"...
      {
         ciclo = ciclo_max;            // Ajustar "ciclo" a "ciclo_max"
         flag_cambio = 1;              // Confirmar que se alcanzó el máximo para "ciclo"
      }
   }
   else                                // Pero Si existe cambio de ciclo...
   {
      ciclo --;                        // Diminuir "ciclo"
     
      if(ciclo <= ciclo_min)           // Si se llega al ciclo mínimo...
      {
         ciclo = ciclo_min;            // Ajustar "ciclo" a "ciclo_min"
         flag_cambio = 0;              // Confirmar que se alcanzó el mínimo para "ciclo"
      }
   }
     
   set_pwm1_duty(ciclo);               // Establecer el ciclo activo.
   set_timer0(225);                    // Recargar el Timer 0.
}

#INT_TIMER1
void  TIMER1_isr(void)
{
   contador++;
   if(contador >= valorms)
   {
      Ms100 = Ms100 + 100;              
      if(Ms100 >= Retardo)        
      {
         Flagok = 1;
         Ms100 = 0;
      }
      contador = 0;
   }
}


void main (void)
{
   setup_ccp1(CCP_PWM);                // Módulo CCP en modo PWM.
   setup_timer_2(T2_DIV_BY_4,249,1);   // Frec. = 1 KHz. Fosc = 4 MHz.
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_0(T0_INTERNAL|T0_DIV_256); // Configuración del Timer 0.
   set_timer0(225);                   
 
   setup_wdt (WDT_18MS);
 
   enable_interrupts(INT_TIMER0);      // Activar interrupción por desborde del Timer 0.
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);          // Habilitar las interrupciones.
 
   while (true)
   {
            EstableceTiempo(1000);
            while(Flagok == 0)
            {
               output_high(pin_b2);
               output_low(pin_b1);
            }
            EstableceTiempo(2000);
            while(Flagok == 0)
            {
               output_high(pin_b1);
               output_low(pin_b2);
            }
           
   
   }
}

void EstableceTiempo(int16 tiempo)
{
   Ms100 = 0;
   contador = 0;
   Retardo = tiempo;
   Flagok = 0;
}
 

Adjuntos

  • PWM.rar
    23 KB · Visitas: 12
Atrás
Arriba