Frecuencia máxima que se puede medir con Arduino Atmega2560

0

para el proyecto escolar debo medir la frecuencia con Arduino Atmega2560 (o algún otro microcontrolador). La idea es tener la interrupción del temporizador configurada en 1 segundo y la señal cuadrada externa (frecuencia) conectada a la interrupción del pin. Cada interrupción en el contador de incrementos del pin para 1 .. Cada segundo (interrupción del temporizador) la frecuencia se calcula. El contador de hormigas se restablece a 0 La frecuencia que debo medir varía de 2 a 11 kHz. ¿Se puede hacer esto?

saludos

    
pregunta Ferguson

2 respuestas

1

El Arduino ATMega2650 está catalogado como que tiene una velocidad de reloj de 16MHz, lo que significa que debería poder manejarlo al menos en términos de ciclos de instrucción. Si mira la página hoja de datos (P.39) para el chip ATMega2650 real, parece que el reloj de E / S funciona a la misma velocidad que el reloj de la CPU.

También hay este publicación en el foro donde alguien encontró que la velocidad máxima de escritura digital es de alrededor de 100kHz.

Yo diría que vayan por ello. El chip debería poder manejar esto. El único lugar en el que podría tener problemas es si intenta hacer demasiado en su interrupción del temporizador de 1 segundo, pero si todo lo que está haciendo es devolver el valor del contador y luego reiniciarlo, debería estar bien.

    
respondido por el Emmett P
0

¿Debería estar bien?

Pequeña explicación ... si una señal es anterior a la prueba en el pin 2, se llama al método readtemp () y se incrementa el contador .. Cada segundo se llama la rutina de servicio de interrupción. En esta rutina, compruebo si se pasan dos segundos y, si es así, se calcula la frecuencia, el contador se configura a 0 .. En el bucle principal, compruebo si el indicador bData es verdadero y si es así, la temperatura se calcula y se envía en serie puerto a pc ..

#include <SPI.h>
#include <Ethernet.h>
#include <Math.h>

const byte interruptPinTemp = 2;
const byte interruptPinSlanost = 3;

//konstante 
const double g = 4.85442486e-003;
const double h = 6.77300393e-004;
const double i = 2.65502731e-005;
const double j = 2.06782794e-006;
const double f = 1000.0;

volatile int cnt = 0;
volatile int cnt1 = 0;

int timer1_counter;

boolean bData = false;

volatile int dvesek = 1;

void setup() {

  Serial.begin(9600);       
  noInterrupts();           

  pinMode(interruptPinTemp, INPUT_PULLUP);
  pinMode(interruptPinSlanost, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(interruptPinTemp), readTemp, CHANGE);

  TCCR1A = 0;
  TCCR1B = 0;
  timer1_counter = 34286;   // preload timer 65536-16MHz/256/2Hz

  TCNT1 = timer1_counter;   // preload timer
  TCCR1B |= (1 << CS12);    // 256 prescaler
  TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt
  interrupts();
}

//Timer interrupt na 1 sekundo
ISR(TIMER1_OVF_vect)        // interrupt service routine
{
  TCNT1 = timer1_counter;   // preload timer

  if (dvesek++ == 2)
  {
    cnt1 = cnt / 2 ;               
    bData = true;             
    cnt = 0;
    dvesek = 1;
  }

}

void loop() {
  // if bData is available... print it on serial port....
  if (bData == true)
  {
    bData = false;
    Serial.println(calcTemp(cnt1), 3);
  }

}

void readTemp() {
  cnt++;
}



//get temperature from measured frequency...
double calcTemp(double frekvenca)
{
  double logRes = log(f / frekvenca);
  return 1.0 / (g + (h * logRes) + (i * pow(logRes, 2.0)) + (j * pow(logRes, 3.0))) - 273.15;
}
    
respondido por el Ferguson

Lea otras preguntas en las etiquetas