Go Down

Topic: Controlar frecuencias al mismo tiempo por pines distintos (Read 306 times) previous topic - next topic

hernanvt

Hola, buenas.

Alguien sabe como poder controlar 3 frecuencias al mismo tiempo por canales distintos? Estoy usando la función "Millis" y "Tone", pero no logro hacerlas funcionar al mismo tiempo...

Lucario448

Alguien sabe como poder controlar 3 frecuencias al mismo tiempo por canales distintos? Estoy usando la función "Millis" y "Tone", pero no logro hacerlas funcionar al mismo tiempo...
Con tone no hay de otra que turnar los canales muy rápidamente.

La otra sería generar tantos canales como timers tenga el microcontrolador. En los basados en Atmega328P, hay hasta tres.

hernanvt

Ya lo logré. Colocaré el código por si a alguien le sirve.


// -------------------------------> Intervalo de envio de señal al Serial -----------------------------------------------
unsigned long previousMicros = 0;
const long interval = 25;


unsigned long previousMicrosHz1 = 0;
unsigned long previousMicrosHz2 = 0;
unsigned long previousMicrosHz3 = 0;

long intervalHz1 = 166; // 3000 Hertz
long intervalHz2 = 500; // 1000 Hertz
long intervalHz3 = 249; // 2000 Hertz

long Hz1;
long Hz2;
long Hz3;


const int frecuencia1 = 9; // 3000 Hertz.
const int frecuencia2 = 6; // 1000 Hertz.
const int frecuencia3 = 5; // 2000 Hertz.

int frecuencia1State = HIGH;
int frecuencia2State = HIGH;
int frecuencia3State = HIGH;

void setup()
{
  Serial.begin(115200);

  pinMode(frecuencia1, OUTPUT); // Configuración de salidas.
  pinMode(frecuencia2, OUTPUT); // Configuración de salidas.
  pinMode(frecuencia3, OUTPUT); // Configuración de salidas.

  digitalWrite(frecuencia1, frecuencia1State);
  digitalWrite(frecuencia2, frecuencia2State);
  digitalWrite(frecuencia3, frecuencia3State);

}

void loop()
{

//if (enable==HIGH)
{
  if (Serial.available() > 0) {
    int ch = Serial.parseInt();
    int ch2 = Serial.parseInt();
    int ch3 = Serial.parseInt();
    if (ch == 0 ||  ch2 == 0 || ch3==0)
    {}
    else
    {
      Hz1 = ch;
      Hz2 = ch2;
      Hz3 = ch3;
     
    }
    // Se muestra el byte en el monitor serie.
    intervalHz1 = frequency(Hz1);
    intervalHz2 = frequency(Hz2);
    intervalHz3 = frequency(Hz3);
    Serial.print(intervalHz1);
    Serial.print(F(" "));
    Serial.println(intervalHz2);
    Serial.print(F(" "));
    Serial.println(intervalHz3);
   
  }



  unsigned currentMicros = micros();


  if (currentMicros - previousMicrosHz1 >= intervalHz1) {
    previousMicrosHz1 = currentMicros;

    if (frecuencia1State == HIGH)
      frecuencia1State = LOW;
    else
      frecuencia1State = HIGH;

    digitalWrite(frecuencia1, frecuencia1State);

  }




  if (currentMicros - previousMicrosHz2 >= intervalHz2) {
    previousMicrosHz2 = currentMicros;

    if (frecuencia2State == HIGH)
      frecuencia2State = LOW;
    else
      frecuencia2State = HIGH;

    digitalWrite(frecuencia2, frecuencia2State);

  }
  if (currentMicros - previousMicrosHz3 >= intervalHz3) {
    previousMicrosHz3 = currentMicros;

    if (frecuencia3State == HIGH)
      frecuencia3State = LOW;
    else
      frecuencia3State = HIGH;

    digitalWrite(frecuencia3, frecuencia3State);
  }
/*}
else
{
  digitalWrite(frecuencia1, LOW);
  digitalWrite(frecuencia2, LOW);
  digitalWrite(frecuencia3, LOW);
  }
*/ 
}
}




Go Up