Cómo generar dos funciones a diferente frecuencia?

Hola a todos, estoy tratando de generar dos señales (triangular y sinusoidal) en arduino mega con diferente frecuencia , como requiero alta frecuencia en la triangular use la librería de TimerThree.h. Sin embargo a la hora de poner el código de la señal sinusoidal se modifica la frecuencia de alguna de las dos o de las dos. Lo he intentado tambien sin el attachInterrupt , solo inicializando y nadA, solo funciona correctamente si dejo solo una señal. Alguna idea de como solucionar esto, dejo el código abajo.

#include <TimerThree.h>
const int Pin = 5;
int PIN=13;
float T=1;
int seno[ ] = {130,176,215,241,250,241,215,176,130,84,45,19,10,19,45,84,130};
void setup()
{
  pinMode(PIN,OUTPUT);
  Timer3.initialize(40);  // 40 us = 25 kHz
  Timer3.attachInterrupt(control);
}
void control()
{
  for (float x =0.0; x < 255.0; x++) {
    Timer3.pwm(Pin, (x/255) * 1023);
  }
  for (float x = 255.0; x > 0.0; x--) {
    Timer3.pwm(Pin, (x / 255) * 1023); 
}
}
void loop() {
for(int i = 0; i<17 ;i++){
if(seno[i]>255) {
seno[i]=255;
}
analogWrite(PIN, seno[i]);
}
}

Al utilizar TimerThree das a entender que estamos trabajando en Arduino Mega.

Para poder generar dos señales distintas y de diferente (hasta variable) frecuencia; preferiría también utilizar el TimerOne. Los timer 1 y 3 dispararán la interrupción; mientras que el 0 o 2 generarán las señales (¡aprovecha que son de 8 bits!). Si no necesitas de millis, delay y micros, sería de utilizar el timer0 (pines 4 y 13) para las señales; caso contrario, sería con el timer2 (pines 9 y 10).
Deshabilitar estas tres funciones sería de considerar; de hacerlo se evitan posibles desfases de la señal en altas frecuencias.

Si me preguntas a mi; yo lo haría así:

#include <TimerThree.h>
#include <TimerOne.h>

//#define USAR_T2 // Descomenta para usar el timer2 (pines 9 y 10) y así mantener a millis, delay y micros.

const byte seno[] = {128, 146, 163, 181, 197, 211, 224, 235, 244, 250, 254, 255,
254, 250, 244, 236, 225, 212, 197, 181, 164, 147, 128, 110, 92, 75, 59, 45, 32, 20,
12, 5, 1, 0, 1, 4, 10, 19, 30, 42, 57, 73, 90, 108};

byte senoContador = 0;
byte trianContador = 0;
boolean descontando = false;

void setup()
{
#ifdef USAR_T2
  TCCR2A = B10100011;
  TCCR2B = 1;
#else
  TIMSK0 = 0; // Deshabilita el funcionamiento de millis, delay y micros
  TCCR0A = B10100011;
  TCCR0B = 1; // Esto aceleraría los contadores de millis, delay y micros
#endif
  Timer3.initialize(40);
  Timer3.attachInterrupt(funcionTrian);
  Timer1.initialize(40);
  Timer1.attachInterrupt(funcionSeno);

// Frecuencia (en hertz) de la ondas: (1 / (m * t)) * 1000000
// t: tiempo (periodo) en microsegundos.
// m: cantidad de muestras que componen la onda. La senoidal se compone de 44; la triangular de 511.
}
void funcionSeno() // Max freq: 22.7 KHz
{
  // Onda senoidal en el pin 13 (timer0), o 10 (timer2)
#ifdef USAR_T2
  OCR2A = seno[senoContador++];
#else
  OCR0A = seno[senoContador++];
#endif
  if (senoContador == sizeof(seno)) senoContador = 0;
}

void funcionTrian() { // Max freq: 1.95 KHz; a menos que incrementemos el factor de subida
  // Onda triangular en el pin 4 (timer0), o 9 (timer2)
  if (descontando) {
#ifdef USAR_T2
    OCR2B = --trianContador;
#else
    OCR0B = --trianContador;
#endif
    if (!trianContador) descontando = false;
  } else {
#ifdef USAR_T2
    OCR2B = ++trianContador;
#else
    OCR0B = ++trianContador;
#endif
    if (trianContador == 0xFF) descontando = true;
  }

}

void loop() {
}

PD: ojo a lo que se dice sobre la onda triangular:

// Max freq: 1.95 KHz; a menos que incrementemos el factor de subida

Si 2 KHz son insuficientes; entonces habrá que incrementar más el contador por interrupción.

Consultaaa!
¿Elementos hardware para eliminar los pulsos del pwm y que quede únicamente el voltaje filtrado con la forma de onda quede como resultado?

Entiéndase por elementos hardware como circuitos electronicos para filtrar la señal o alguna otra forma de mantener la señal senoidal lo mas integra posible sin el elemento pwm.

StringCGE:
¿Elementos hardware para eliminar los pulsos del pwm y que quede únicamente el voltaje filtrado con la forma de onda quede como resultado?

Normalmente un filtro pasa-bajos con el punto de corte en 30 KHz.

Para entradas de alta impedancia, con la versión RC (resistencia/condensador) bastará; caso contrario sería la versión LC (inductor/condensador) aunque recuerda que el límite de corriente por pin sigue vigente. Para una señal más potente, lógicamente habría que recurrir a un amplificador.

StringCGE:
o alguna otra forma de mantener la señal senoidal lo mas integra posible sin el elemento pwm.

Define "integra" y "sin el elemento PWM".

Un microcontrolador no ARM lo más que tiene de DAC es el PWM generado por timer. Obtener una señal analógica desde un sistema digital, sin PWM; tendría que ser con un DAC externo o con una escalera de resistencias R2R cuya resolución depende de la cantidad de salidas digitales (pines) a utilizar.

Hablar de "integridad" no sé si te refieres a la calidad de la señal generada. Los factores que influyen en la calidad son la resolución y la frecuencia de muestreo (cantidad de muestras en caso de ser en tablas de onda).

A determinada velocidad del reloj, la frecuencia de muestreo es inversamente proporcional a la frecuencia máxima que la señal puede alcanzar. La resolución afecta siempre en PWM; bajo otros métodos depende del ancho de banda del transmisor de los datos digitales (en el caso de AVR, mover 16 bits le toma dos ciclos del reloj).

Para las señales generadas por modulación (PWM, FM, AM, PCM, etc) hay todavía otro límite: el teorema de Shannon-Nyquist; el cual dice que la frecuencia del modulador debe ser de al menos el doble de la frecuencia de la señal a generar.

Aunque a veces la teoría está lejos de la realidad, aquí no es la excepción. Si lo anterior lo aplicas con una onda senoidal a la supuesta "frecuencia máxima", con lo que terminarás es con una onda más triangular que curva.

Con una frecuencia reloj de 16 MHz, y un PWM de 8 bits de resolución; la máxima del modulador (portador o "carrier" en inglés) es de 62.5 KHz. Y según el teorema, el máximo vendría siendo 31.25 KHz; es por eso que trato de mantenerlo todo por debajo de los 30 KHz si estamos hablando de DAC por PWM.