Buenos días, de antemano quisiera decir que en el uso del arduino DUE soy algo novato.
Necesito generar una señal diente de sierra de frecuencia variable de entre; 10Hz a 100Hz con gran precisión para alimentar un sensor y su manejo en posteriores etapas.
Realice un código para generar la diente de sierra en base a una recta con pendiente variable, para que al variar la pendiente cambiase el tiempo que demora la recta al alcanzar cierto límite superior, luego de esto simplemente la llevaría a 0 dentro de un bucle muestreado en milisegundos con la función millis().
El tema es que eh tenido problemas con la precisión en la frecuencia de la señal al medirla en un osciloscopio la cual se desfasa en varios milisegundos, en verdad no sé hasta qué punto o de qué forma puedo mejorarlo, intente usar la función micros() pero no me dio resultado. Me recomedaron usar un reloj externo en este caso el DS3231 pero realmente no se si sea lo que necesito.
Mi consulta va en si existe alguna librería u otro método que me permita mejorar el muetreo de la señal para obtenerla de forma mas precisa.
De antemando muchas gracias
(El código lo implementé en Matlab y funciono sin ningun problema)
//---------------Variables muestreo----------------------//
unsigned long t0=0; //Tiempo inicial
unsigned long t=0; //Vector tiempo en [ms]
long ta=0; // Tiempo actual
int T=1; // Periodo de muestreo en [ms]
int limite=4095;
float y=0;
int m=4095/5000; //pendiente
long x=0;
void setup() {
analogWriteResolution(12);
}
void loop() {
t=millis(); //Vector tiempo en [ms]
ta=t-t0; //Cambio de instante actual muestreo
if (ta >= T){ //Condicion lectura en instante de muestreo
analogWrite(DAC0,y);
y=x*m;
x=x+1;
if (y>=limite)
{x=0;
}
t0=t;} //reemplazo el valor pasado con el actual
}
DienteSierra1.ino (610 Bytes)