Autor Tema: Generador de onda cuadrada...  (Leído 278 veces)

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

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 4
Generador de onda cuadrada...
« en: 05 de Julio de 2019, 11:58:51 »
Buenas tardes gente, este es mi primer post, ya que recién estoy comenzando a programar en C y a mis 58 años se me hace bastante complicado, estoy intentando hacer esto, medir la frecuencia que ingresa por RB0, que puede ir desde 10hz a 60kz, hasta ahí vamos bien, en base a unos ejemplos que encontré por ahí, logre medirla con EXT_INT_EDGE(0,L_TO_H), y plasmarla en el display, estoy trabajando con 16F877A, ahora bien, esa frecuencia necesito aumentarla en un 5% y sacarla por alguno de los pines de salida, ahí se me complica y no se si me conviene encararla con el Timer1 o el CCP1, medio que hasta aca llegue, es por eso que necesito una mano de ustedes que son los que saben....
Desde ya muchas gracias por cualquier aporte...

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5109
Re:Generador de onda cuadrada...
« Respuesta #1 en: 05 de Julio de 2019, 16:42:14 »
Es un problema complejo para alguien que comienza.

Lo primero que necesitas es medir la frecuencia con un error menor del 1% para luego incrementarle un 5%. ¿Has conseguido ese resultado para todo el rango desde 10Hz hasta 60000Hz?

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5109
Re:Generador de onda cuadrada...
« Respuesta #2 en: 05 de Julio de 2019, 16:59:34 »
Para generar frecuencias de un rango amplio y con mucha precisión deberías utilizar un PIC con un periférico que se denomina NCO (Numerically Controlled Oscillator) y que sirve precisamente para eso.
Por ejemplo estos PIC tienen ese periférico:
Código: [Seleccionar]
PIC10F320
PIC10F322
PIC12F1501
PIC16F1503
PIC16F1507
PIC16F1508
PIC16F1509
PIC16F15375
PIC16F1713
PIC16F1716
PIC16F1717
PIC16F1718
PIC16F1719
PIC16F15313
PIC16F15323
PIC16F15324
PIC16F15325
PIC16F15344
PIC16F15345
PIC16F15354
PIC16F15355
PIC16F15356
PIC16F15376
PIC16F15385
PIC16F15386
PIC16F18313
PIC16F18323
PIC16F18324
PIC16F18325
PIC16F18326
PIC16F18344
PIC16F18345
PIC16F18346
PIC16F18424
PIC16F18425
PIC16F18426
PIC16F18444
PIC16F18445
PIC16F18446
PIC16F18455
PIC16F18456
PIC18F25K83
PIC18F26K42
PIC18F26K83
PIC18F27K42
PIC18F46K42
PIC18F47K42
PIC18F56K42
PIC18F57K42
PIC16F18854
PIC16F18855
PIC16F18856
PIC16F18857
PIC16F18875
PIC16F18876
PIC16F18877
PIC18F24K42
PIC18F45K42
PIC18F55K42

Puedes comprobarlo en esta página: https://www.microchip.com/paramchartsearch/Chart.aspx?branchID=1012

Saludos.

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 4
Re:Generador de onda cuadrada...
« Respuesta #3 en: 07 de Julio de 2019, 14:09:10 »
Hola Picuino, muchas gracias por tu respuesta y tu orientación, hasta el momento e conseguido medir las frecuencia de entrada y aumentarle el 5% con este código:

#include <16F877A.h>

#fuses HS
#use delay(clock=4Mhz)

#Byte PORTB=0X06
#bYTE TRISB=0X86



#define LCD_ENABLE_PIN  PIN_D0
#define LCD_RS_PIN      PIN_D1     
#define LCD_RW_PIN      PIN_D2                           
#define LCD_DATA4       PIN_D4                             
#define LCD_DATA5       PIN_D5                             
#define LCD_DATA6       PIN_D6       
#define LCD_DATA7       PIN_D7

#include <LCD.C>

int16 Ta,Tb,TICK;
float T,Periodo,F;
#int_EXT
#use rs232(baud=9600, UART1)

void RB0(){


  Ta= get_timer1();
   Tick= Ta-Tb;
   Tb=ta;
   

void main(){
SETUP_TIMER_1(T1_INTERNAL  |T1_DIV_BY_8);//Prescaler = 8
EXT_INT_EDGE(0,L_TO_H); //interrupcion externa por flanco de subida
enable_interrupts(int_ext);
enable_interrupts(GLOBAL);
lcd_init();

while(true)
 
   {       
   lcd_gotoxy(1,1);
   T=4.0*8.0/4000000.0;
   Periodo=T*Tick;
   F=1/Periodo;

   if(input(pin_b1)==0)
   {
      if (F < 1850)
      {
         F=F*1.05;
      }
   }
   else
   

   printf(lcd_putc,"Tick: %Lu",Tick);
   printf(lcd_putc,"\nF: %LfHz",F);

   }
}

Habrá algún código ejemplo de algún pic con NCO en el foro..??

Gracias por el aporte.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5109
Re:Generador de onda cuadrada...
« Respuesta #4 en: 08 de Julio de 2019, 05:31:24 »
No recuerdo ningún programa publicado para manejo del NCO. Microchip suele tener ejemplos en el datasheet.
De todas formas, si te funciona, mejor no complicarse más.

Un saludo.

Desconectado AccioRw

  • PIC12
  • **
  • Mensajes: 86
Re:Generador de onda cuadrada...
« Respuesta #5 en: 08 de Julio de 2019, 11:04:21 »
que puede ir desde 10hz a 60kz, hasta ahí

No me queda clara la frecuencia que necesitas medir, te refieres:

Desde 10Hz hasta 60Hz

o desde 10Hz hasta 60000Hz (60 KHz)

Un Saludo!

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 4
Re:Generador de onda cuadrada...
« Respuesta #6 en: 08 de Julio de 2019, 11:31:13 »
Hola Gente... si, la parte de frecuencímetro se podría decir que esta media resuelta, el problema es que no se como volver a sacar la frecuencia por alguno de los pines... por que el problema es que es variable, y el rango es de 10Hz a 60000Hz (60KHz), cualquier aporte será bien venido, anoche me quede hasta las 4am y no pude sacar nada...
Un saludo.

Desconectado AccioRw

  • PIC12
  • **
  • Mensajes: 86
Re:Generador de onda cuadrada...
« Respuesta #7 en: 08 de Julio de 2019, 12:08:46 »
Hola telesystem, estoy en el trabajo así que mirando brevemente un poco por encima el datasheet del uC que tienes que usar, estoy viendo si es posible o no que jugando con el preescaler del Timer2 (y el valor del registro PR2) junto con la salida de PWM con un duty Cicle del 50% puedas sacar los 60.300Hz que necesitas como máximo y en principio parece posible no se con cuanta precisión, en una tabla de ejemplo con 20MHz de oscilador  en vez de los 4MHz que usar tu ahora mismo (pagina 68 tabla 8-3) me da la impresión que puedes llegar a jugar con los 4 primeros preescalers y podría quizá valerte al menos con frecuencias menores a 20KHz que sigues teniendo los 10bits de precisión.
Siento no poderte concretar un poco más, te dejo la idea por si puedes ir mirando algo.
 Un saludo!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7231
Re:Generador de onda cuadrada...
« Respuesta #8 en: 08 de Julio de 2019, 13:07:51 »
El PWM le puede llegar a servir para las frecuencias "altas", pero para frecuencias bajas ya no ...

A 4Mhz es bastante complejo que tenga esa diferencia del 5% ...

63000Hz necesita un periodo de 15.8us , y cambios de la salida cada 7.93us

Es decir 8 ciclos de reloj (8us -> 16us periodo -> 62500Hz)... si uno piensa hacerlo desde el punto de vista de ASM, entre la pregunta, el salto del bucle, el cambio, no quedan demasiados ciclos como para jugar tampoco.
Ademas esta decir que al ser de 1us los pasos no va a obtener la precision que el necesita. Ni hablar tambien de estar midiendo el tiempo (mas sencillo con el CCP)
De solo durar 1 ciclo mas por cada pulso, es decir cambios cada 9us -> periodo de 18us, la salida tendria una frecuencia de 55555Hz , se salto 7KHz casi .....

Lo primero seria aumentar la frecuencia al maximo que es 20Mhz, asi permitirse un poco mas de juego con ese punto.
Pero eso lo llevaria a un paso de 625000 casi a 60600Hz,  2 Khz el maximo "paso" que tendria ... sigue siendo mucho creo yo para lo que el plantea....


A no ser que exista algun hardware especial dedicado a enviar la señal, no creo que lo vaya a realizar.

Para frecuencias bajas el error va a ser menos por lo que no influye en el analisis.
« Última modificación: 08 de Julio de 2019, 13:10:15 por KILLERJC »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5109
« Última modificación: 08 de Julio de 2019, 16:27:15 por Picuino »

Desconectado telesystem

  • PIC10
  • *
  • Mensajes: 4
Re:Generador de onda cuadrada...
« Respuesta #10 en: 08 de Julio de 2019, 17:43:55 »
Hola gente, la verdad, después de lo que comento Picuino "Para generar frecuencias de un rango amplio y con mucha precisión deberías utilizar un PIC con un periférico que se denomina NCO (Numerically Controlled Oscillator) y que sirve precisamente para eso"  y que me parece que es lo más correcto, creo que voy a mandar a hacer el código por alguien que este mas ducho que yo que recién comienzo, así que si alguien se anima o saben de alguien que programe para terceros por favor avísenme...

Igualmente así muchísimas gracias por las opiniones...

Un saludo.