Error de fcia en generador de señal

Estimados,

Quisiera que me echen una mano con este problema que estoy teniendo al generar una señal cuadrada.
Para generar la señal utilizo una matriz de valores entre 1 y 0.
Luego le indico a la librería FlexiTimer2, que emita un valor cada 1 ms y que luego cuente si llego a 20; sino que vuelva a emitir desplazándose en la matriz.
El código funciona y la señal se emite, PERO… resulta que el ancho del pulso no es de 1 ms –como esperaba- sino que de 1,32 ms.
El error se mantiene al modificar el ancho del pulso. Por ejemplo, si el ancho fuera de 20 ms., la señal obtenida tendrá un ancho de pulso de 20,32 ms.

A continuación les dejo el código:

#include <SPI.h>
#include <AH_MCP4921.h>
#include <FlexiTimer2.h>
AH_MCP4921 AnalogOutput1(51,52,3); 
const int cuadrada [] = {
  0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,
  0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000,0,1000
  };
int punto=0; 
void setup() {
   AnalogOutput1.setValue(punto);     //pone a 0 la salida
   FlexiTimer2::set(1,funcion);
   FlexiTimer2::start(); 
}
void loop() {
  // put your main code here, to run repeatedly:
}
void funcion (void){
  FlexiTimer2::stop(); 
  if (punto<20){
  punto++; }
  else {
    punto=0; 
  }
 AnalogOutput1.setValue(cuadrada[punto]);
 FlexiTimer2::set(100,funcion);
 FlexiTimer2::start(); 
}

Señal en osciloscopio

Aguardo sus comentarios.
Saludos,

Cristian

La razón por la cuál la frecuencia no es exacta, es algo quizá difícil de entender para el principiante; pero se resume en que debes utilizar el timer1 y optimizar la rutina de interrupción.

El timer2 no tiene suficiente resolución para disparar una interrupción exactamente cada milisegundo; y además estoy viendo que interactuar con un DAC externo tiene más retraso que si el propio Arduino generara la señal cuadrada.
Que tu señal tenga un periodo de 1.32 ms quiere decir que la rutina de interrupción tarda aprox. 300 microsegundos, el cual es demasiado para algo que se supone que tiene que ejecutarse "inmediatamente".
Un retraso así limita la frecuencia a apenas 3 KHz; si en cambio le delegaras esa tarea al propio Arduino, podrías ir hasta 1 MHz con la librería mencionada al principio; incluso al extremo de 8 MHz si no usas la librería pero te atreves a modificar manualmente los registros necesarios.

Si te vas a tomar la molestia de utilizar todo un DAC sólo para generar una señal cuadrada, ¿por qué no utilizar el mismo Arduino que hasta más rápido y preciso lo puede hacer?.
Con la librería antes mencionada, puedes generar PWM con frecuencia variable (desde 0.125 Hz hasta 1 MHz), sólo que está limitada a los pines 9 y 10. Recuerda que una señal completamente cuadrada es PWM con ciclo de trabajo en 50%