Frecuencia y ciclo activo con Arduino

Hola les consulto, estoy tratando de medir frecuencia y duty de una señal sin usar la función pulsein, estoy usando el arduino uno y no logro progresar con mi proyecto, subo simulación , gracias

Código:
#define F_CPU 16000000l
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(6, 9, 10, 11, 12, 13);

  unsigned int a,b,c,high,period;
  int freq,duty_cycle;
void setup ( )
{

 
  lcd.begin(16,2);
    lcd.clear();
  
  PORTD = 0xFF;   /* Turn ON Pull-UP resistor */
}
  void loop()
  {
 TCCR1B |= _BV(ICES1);           // enable input capture
  TIMSK1 =  _BV(ICIE1);           // enable input capture interrupt for timer 1
  TIMSK1 |= _BV(TOIE1);           // enable overflow interrupt to detect missing input pulses

    TCCR1A = 0;
    TCNT1=0;

    TIFR1 = (1<<ICF1);       /* clear ICP flag (Input Capture flag) */

    TCCR1B = 0x41;          /* rising edge, No prescaler */
    while ((TIFR1&(1<<ICF1)) == 0);
    a = ICR1;           /* take value of capture register */
    TIFR1 = (1<<ICF1);       /* clear ICP flag (Input Capture flag) */
    
    TCCR1B = 0x01;           /* falling edge, No prescaler */
    while ((TIFR1&(1<<ICF1)) == 0);
    b = ICR1;           /* take value of capture register */
    TIFR1 = (1<<ICF1);       /* clear ICP flag (Input Capture flag) */
    
    TCCR1B = 0x41;          /* rising edge, No prescaler */
    while ((TIFR1&(1<<ICF1)) == 0);
    c = ICR1;           /* take value of capture register */
    TIFR1 = (1<<ICF1);       /* clear ICP flag (Input Capture flag) */

    TCCR1B = 0;               /* stop the timer */
    
   if(a<b && b<c) {         /* check for valid condition, to avoide timer overflow reading */
    high=b-a;
    period=c-a;
    
    freq= F_CPU/period;    /* calculate frequency */
    duty_cycle = ((int) high/ (int) period)*100;  /*calculate duty cycle */
      
    char buffer[20];
    
    lcd.setCursor(3,0);
    sprintf(buffer, "F   = %4d", freq);
    lcd.print(buffer);

    lcd.setCursor(3,1);
    sprintf(buffer, "pwm = %4d", duty_cycle);
    lcd.print(buffer);
    delay(50);
  }
  }
 

Adjuntos

  • frecuencia arduino.rar
    25 KB · Visitas: 7
Igual no estuvieron muy interesados en el código!!!
O no hubo interesado, o el que sabia no pasó por aquí. Recuerda que mas allá de la omnipresencia de @Fogonazo , u otros miembros, éstos tienen (en su mayoria) una vida fuera del foro.
Asi que puedes esperar respuestas en segundos, como nunca.
Eso dependera de muchos factores, principalmente las ganas del lector y la informacion dada por el redactor
 
Bueno ponele que si que es ridículo lo que pregunto y como ya me dijieron una vez por este foro hacelo vos! Pero reconozcan que ni lo miraron! Por suerte descubrí el arduino y puedo hacer muchos proyectos de una forma más fácil para un tipo de 50 años que de programación sabe 0, el arduino ayuda mucho, el foro es muy bueno me han ayudado mucho y voy a seguir pidiendo ayuda acostumbrensen, va con onda 💪😉, saludos
 

Fogonazo

"Qualified exorcist approved by the Vatican"
Bueno ponele que si que es ridículo lo que pregunto y como ya me dijieron una vez por este foro hacelo vos! Pero reconozcan que ni lo miraron! Por suerte descubrí el arduino y puedo hacer muchos proyectos de una forma más fácil para un tipo de 50 años que de programación sabe 0, el arduino ayuda mucho, el foro es muy bueno me han ayudado mucho y voy a seguir pidiendo ayuda acostumbrensen, va con onda 💪😉, saludos
Las condiciones que SIEMPRE se exigen para dar colaboración es que el interesado haga su parte.
En tu caso "Lo hiciste" (y)

Pero por otro lado para colaborar se puede dar la condición de que:
1) Quién te podría ayudar no vio el tema, no visitó el Foro, estaba ocupado con algo, le pasó un automóvil por arriba y en "Terapia intensiva" NO le dejan usar el celular, Etc.
2) Quién SI vio el tema NO te puede ayudar porque no entiende ni "J" aunque le ponga voluntad.
3) Alguien que si sabe, no quiso colaborar porque es "Mala persona" :(


O no hubo interesado, o el que sabia no pasó por aquí. Recuerda que mas allá de la omnipresencia de @Fogonazo , u otros miembros, éstos tienen (en su mayoria) una vida fuera del foro.
Asi que puedes esperar respuestas en segundos, como nunca.
Eso dependera de muchos factores, principalmente las ganas del lector y la informacion dada por el redactor
¡ No existe vida fuera del Foro !, te sales del Foro e ingresas a la "Matrix" todo deja de ser real.
 
Pero reconozcan que ni lo miraron!
Yo si lo mire, pero éste punto me representa
2) Quién SI vio el tema NO te puede ayudar porque no entiende ni "J" aunque le ponga voluntad

Solo soy autodidacta, y la electronica no es mi principal trabajo, ni siquiera estoy inmerso como otros.
Lo que sé es lo que leo o experimento, pero en éste caso NO conozco los codigos para usar directamente directivas para sobrepasar el alto nivel del "C++" del Arduino.
Si fuese algo mas basico, obvio que puedo ayudar, pero ésto me sobrepasa.

Como ves, los puntos aportado por Fogo y por mi, no estan lejos de la realidad de la matrix... Digo, de la realidad....


el foro es muy bueno me han ayudado mucho y voy a seguir pidiendo ayuda acostumbrensen, va con onda 💪😉, saludos
Pero olvidate, molestanos tranquilamente. Eso si, siempre ajustando a las reglas del foro...
 
Yo pase, descargue los archivos, corrí la simulación, como no había ninguna indicación en el display, agregue la impresión de texto en la primer lineal del LCD.

Volví a simular y vi que aparecía por un instante lo agregado y descarte conexionado y fallos de librería a ese nivel.

Como no programo en C, me cuesta mas seguir la lógica y secuencia del programa por lo que debía dedicarle tiempo a estudiarlo y me llego trabajo por lo que quedo pendiente.

Hay que entender que el foro se hace con los aporte y con las preguntas/inquietudes de los participantes y que no es un lugar para resolver problemas/dificultades que uno tenga, nada mas.

Es un lugar de aprendizaje para todos los participantes sean ellos activos o pasivos, actuales y futuros.

Lamentablemente no veo que pusieras claramente y para que se entienda la resolución que obtuviste para el problema que planteaste(el "LCD fuera del IF"...cual LCD?) si no eras incitado ha expresarte después del "Lo solucione!!" .

Espero que no lo tomes a mal si no como tu expresaste, "de onda".

Generalmente no somos consientes del alcance de cada una de las acciones que tomamos al participar en él.

Saludos.
 
Yo pasé, juné un Aduinero tocando los registros, me dije _un Arduinero que se esfuerza y va un poco más allá....

Me tome el trabajo, de bajar el archivo, llevarlo del Celu a la compu... resulta que no califico, Él tampoco dice que rango de frecuencia se pretende medir, ni el tiempo estimado activo de la señal.... y encima se enoja...

y buehh... no programo Arduinería (me abstrae demasiado del hardware), voy directo al C plano de los AVR, entendía lo que pretendía hacer (a pesar de la falta de información), pero ya se me fueron las ganas de participar con tantos contras... (especialmente, su enojo, como si fuese obligación de las gentes del foro contestar)

version.jpg
 
Última edición:
Arriba