desktop

Contar pulsos con CCP en modo captura

y si pones un potenciometro multivueltas y vas viendo donde es mas estable en lugar de que sean 2.5

ahora colocando un motor de 12 volt el duty no tendría que estar al 100% ya que es todo su ciclo no enciende y apaga como las bobinas, eso no lo hace
eso no lo entendi, es bueno o malo?
 
Si voy hacer eso, otra cosa es la pata 11 la medición se puede regulas bien, voy a colocar un preset multivuelta para calibrar mejor, vamos mejor
 
ya voy entendiendo XD, como que a ese sistema le faltaria algo como un diodo volante, red snubber o algo asi, porque eso deberia ser muy ruidoso en terminos electricos. la verdad me gustaria recomendarte y hacer pruebas pero no tengo nada que me pudiera servir para experimentar y verlo en el osciloscopio.

pero podriamos indagar un poco como eliminar esos ruidos. estamos en contacto y si encuentras algo me gustaria que nos lo compartieras.
 
Va tomando forma me falta la caja y la fuente, se podría hacer una fuente tipo buck con un mosfet y manejarlo con el Pic con pulsadores voy a ir probando
 

Adjuntos

  • DSC_0206.jpg
    DSC_0206.jpg
    81.4 KB · Visitas: 18
  • DSC_0205.jpg
    DSC_0205.jpg
    36.5 KB · Visitas: 17
Código:
#include <16f883.h>
#device ADC=10
#use delay(internal = 8MHz)
#define LCD_DATA_PORT getenv("SFR:PORTC")
#include <lcd.c>
#define led PIN_B5
int1 flagHayDatos=0; 
float const ticks_us = 4.0; // microsegundos por Tick del Timer 1 @ 8 MHz. (Osc. Interno)
//float const ticks_us = 8.0; // microsegundos por Tick del Timer 1 @ 8 MHz. (Osc. Cristal)
int8 flancos;
int8 flag_flanco;
int16 periodo1,periodo2,periodo3;
int16 tiempo_alto,tiempo_bajo,tiempo_total;
float us_alto,us_bajo,us_total;
float frecuencia;
#INT_EXT
void sdi_externa_RB0 (void)
{
flancos++; // Incrementar la variable "flancos"

if(!flag_flanco) // Si el flanco del pulso es bajo...
{
if(flancos == 1) // Si el conteo de flancos es 1...
{
set_timer1(0); // Limpiar el Timer 1
periodo1 = get_timer1(); // "periodo1" tendrá el tiempo del pulso en alto.
}
if(flancos == 3) // Si el conteo de flancos es 3...
periodo3 = get_timer1(); // "periodo3" tendrá el tiempo del pulso en alto.

EXT_INT_EDGE(H_TO_L); // Establecer la interrupción por flanco de bajada.
flag_flanco = 1; // Indicar que el próximo flanco será de bajada.
}
else // Caso contrario. (Pulso en estado alto)...
{
periodo2 = get_timer1(); // "periodo2" tendrá el valor del pulso en bajo.
EXT_INT_EDGE(L_TO_H); // Establecer la interrupción por flanco de subida.
flag_flanco = 0; // Indicar que el próximo flanco será de subida.
if(flagHayDatos==0){ // Si los datos anteriores han sido procesados ...
flagHayDatos=1; // Indico que ya hay nuevos datos de flancos para calcular
}
}
if(flancos > 2)flancos = 0; // Si la variable "flancos" llega a 3, ponerla a 0.
}
void main()
{
long int var1=0, var2=0, var3=0;
float valor, valor1,valor2;
float duty;
int8 porcentaje;

setup_adc_ports(sAN1|sAN3);
setup_adc(ADC_CLOCK_INTERNAL );
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(int_ext);
ext_int_edge(0,L_TO_H);
enable_interrupts(global);

lcd_init();

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

while (true)
{


for(var1=0;var1<50;var1++)
{
valor=valor+ get_timer1();
delay_us(62); 
}
periodo1=valor/50;

for(var2=0;var2<50;var2++)
{
valor1=valor1+ get_timer1();
delay_us(62); 
}
periodo2=valor/50;
for(var3=0;var3<50;var3++)
{
valor2=valor2+ get_timer1();
delay_us(62); 
}
periodo3=valor/50;

if(flagHayDatos==1){
output_HIGH(led);
if((periodo3 > periodo2) && (periodo2 > periodo1))
{
tiempo_alto = periodo2 - periodo1; // Obtener el periodo del pulso en estado alto.
tiempo_bajo = periodo3 - periodo2; // Obtener el periodo del pulso en estado bajo.
tiempo_total = tiempo_alto + tiempo_bajo; // Obtener el periodo de la frecuencia.
us_alto = ticks_us * tiempo_alto; // Obtener el periodo en microsegundos del pulso en alto.
us_bajo = ticks_us * tiempo_bajo; // Obtener el periodo en microsegundos del pulso en bajo.
us_total = ticks_us * tiempo_total; // Obtener los microsegundos en total de la frecuencia.
frecuencia = 1 / (us_total / 1000000); // Obtener la frecuencia.
duty = ((float) tiempo_bajo / (float)(tiempo_bajo + tiempo_alto));
porcentaje = (duty * 100) + 0.5; // Físicamente el + 0.5 puede no ser necesario. (Ajusta desviación pero consume ROM)
} 
flagHayDatos=0; 
}
lcd_gotoxy(1,1);
printf(lcd_putc,"CPS:%03.0fHz",frecuencia);
lcd_gotoxy(1,2);
printf(lcd_putc,"DUTY:%02u%c",porcentaje,0x25);
flagHayDatos=0; 

delay_ms(100); // Retardo para disminuir parpadeos en la pantalla. (No afecta interrupción externa.)
if(flagHayDatos==0){
frecuencia = 0;
porcentaje=0;
output_low(led);
}

}
}

estoy usando este codigo
 
Se podría agregar una fuente así, con dos pulsadores que moverán de 0 a 5 volt, un operacional para amplificar y tener de 0a 18 volt? Y tendría que hacerlo por el pwm como saco el pulso por otro puerto que no sea el c?
 

Adjuntos

  • img_0366.jpg
    img_0366.jpg
    49.6 KB · Visitas: 15
Hola amigos del foro volví para pedir su ayuda con el código que estoy armando funciona bien , lo que no logro hacer es mostrar de 0 a 18 el voltaje el pwm ya pude poner los pulsadores me falta ajústalo mas fino
 

Adjuntos

  • pic pulsadores.zip
    89.6 KB · Visitas: 7
No entendí el por qué de esas banderas para lo que pretendes hacer.
Por favor, cuando solicites ayuda, da más detalles y describe con comentarios tu programa.
Te adjunto el programa con los cambios.
 

Adjuntos

  • 16F883 Lectura de pulsos, porcentaje y voltaje.rar
    39.6 KB · Visitas: 15
Muchas gracias por tu tiempo y dedicación en este foro, tu ayuda no tiene precio.
Voy a probar como va y te cuento. ¡Gracias por enseñar!

---------- Actualizado ----------

Te consulto una cosa más.
¿En vez de TIP35 podría colocar un mosfet como en la imagen que te adjunto, o un regulador de la línea LM317, LM22677, o alguno de esa línea funcionaria igual?

Saludos.
 

Adjuntos

  • Documento.rar
    225.7 KB · Visitas: 6
Última edición por un moderador:
Mejor usa un transistor bipolar. El TIP35 soporta 25 Amperes, lo cual se me hace excesivo y no creo que necesites más.
Si es para controlar el motor de una máquina para tatuar, con un TIP41 (6 Amps.) puede ir bien.
 
Hola te consulto antes de cambiar algo y después que no me ande, hice las pruebas y me paso de casualidad que se me apagó y me vuelve el voltimetro a cero como hago para modificar que quede la tensión que marcó con los pulsadores? Hay que usar la memoria?
 
Pues si, pero te recomiendo que uses un pulsador para guardar los datos.
Ya que si almacenas los datos con cada cambio, después de 1,000,000 escrituras, la memoria se irá dañando.
Si lo piensas usar así, haz un promedio de uso para determinar el tiempo de vida.
 
Atrás
Arriba