Generar una señal triangular

Hola, tengo un código para generar una señal triangular , esto para generar un un pwm comparando la triangular con la sinusoidal, sin embargo el observar los pulsos pwm en el osciloscopio corren a baja frecuencia cómo puedo modificar las frecuencias de mis dos señales (triangular y sinusoidal) por ejemplo a 6kHz y 60Hz. He leído que las interrupciones internas podrían solucionar esto pero no he podido resolverlo. Por cierto estor usando arduino mega.
Agradecería sus comentarios.

int hsc=0;
int PWM=0;
int thetax=0;
int mSignalx=0;
int pSignalx=0;
int pState=0;
float theta=0.0;
float ang=0.0;
float mSignal=0.0;
float pSignal=0.0;
float x=64;
void setup() {
}
void loop(){
while(1)
 {
   // funcion diente de sierra         
   if (hsc >= 256) { 
     hsc=0; 
     ang++; 
     if (ang>=32) {ang=0;}
     }
   else hsc++;   
   if (pState==0) {
     pSignal++;
     if (pSignal>=x) { pState=1; } }
   else{
     pSignal--;   
     if (pSignal<=-x) { pState=0; } }
   // Sine Pulse Width Modulation
   theta = (2*3.1416*ang)/32.0; // Angulo para la funcion sinusoidal  
   mSignal=x*sin(theta);
    if (mSignal<pSignal) { PWM=0; } 
   else { PWM=1; }
      // convert variables
   thetax=round(theta);
   mSignalx=round(mSignal);
   pSignalx=round(pSignal);   
}
}

No habras otro hilo del mismo tema hasta terminar éste!
A eso se lo considera doble posteo.
Tu otro hilo fue cerrado y luego será borrado.

Son demasiados cálculos como para exigir frecuencias mayores a 300 Hz.

Creo que sería mucho más fácil con una "tabla de ondas" que tenga los valores ya pre-calculados de antemano. El PWM es de 8 bits sin signo; lo que quiere decir que la cresta más alta está en el valor 255, el valle más bajo en el 0 (cero), el "punto cero" en 127.

Arduino no trabaja con voltajes simétricos; por lo tanto tendrás un "DC bias" de 2.5v en la salida, algo que se puede remediar con un filtro pasa-altos.

Lucario448:
Son demasiados cálculos como para exigir frecuencias mayores a 300 Hz.

Creo que sería mucho más fácil con una "tabla de ondas" que tenga los valores ya pre-calculados de antemano. El PWM es de 8 bits sin signo; lo que quiere decir que la cresta más alta está en el valor 255, el valle más bajo en el 0 (cero), el "punto cero" en 127.

Arduino no trabaja con voltajes simétricos; por lo tanto tendrás un "DC bias" de 2.5v en la salida, algo que se puede remediar con un filtro pasa-altos.

Cargando la tabla de valores del seno puedo ajustar el periodo de los anchos de pulso y el tiempo donde se vuelve a comenzar a tomar los valores del seno?

Frecuencia de la onda... definitivamente.
Periodo de ancho de pulso... supongo que te refieres al ciclo de trabajo.

Te lo voy a dejar así:

Ciclo de trabajo (nivel de voltaje): valor de la muestra.
Frecuencia de la onda: frecuencia con el que el PWM cambia su ciclo de trabajo.

Debes decidir el número de muestras de las que se compondrá la señal, muy pocas la distorciona en altas frecuencias; demasiadas limita la frecuencia máxima.

Aunque con un microcontrolador a 16 MHz, la frecuencia máxima de un PWM de 8 bits es de 62.5 KHz; y según el teorema de Shannon-Nyquist, la frecuencia máxima de la señal (con distorción moderada) debe ser la mitad de la frecuencia moduladora (31.25 KHz). Ir más allá de eso genera una onda que tiende a "cuadricularse" (onda cuadrada puede ser de hasta la mitad de la frecuencia del reloj).

La calidad de la onda senoidal depende del número de muestras en la tabla; por lo tanto será cuestión de ensayo y error determinar la cantidad más adecuada. Yo solo sé que está entre las 500 y 2000 muestras.