hay poco que rascar, el código es de lo más sencillo,
una tabla 100 datos que forman un ciclo de una función seno, que direccionamos al puerto D,
para posteriormente implementar un DAC de 8 bits con resistencias tipo ladder.
Es el boceto de lo que puede ser un generador de señales en el rango del audio hasta 20kHz
Por eso si quiero generar un ciclo de onda seno de 20kz con una tabla de 100 muestras
un ciclo de 20kHz dura 50us que divido entre 100 muestras 0.5us cada muestra que debo escribir
en el puerto D.
#include <avr/io.h>
#include <avr/interrupt.h>
byte sine[] = {127, 134, 142, 150, 158, 166, 173, 181, 188, 195, 201, 207, 213, 219, 224, 229,
234, 238, 241, 245, 247, 250, 251, 252, 253, 254, 253, 252, 251, 250, 247, 245,
241, 238, 234, 229, 224, 219, 213, 207, 201, 195, 188, 181, 173, 166, 158, 150,
142, 134, 127, 119, 111, 103, 95, 87, 80, 72, 65, 58, 52, 46, 40, 34, 29, 24, 19,
15, 12, 8, 6, 3, 2, 1, 0, 0, 0, 1, 2, 3, 6, 8, 12, 15, 19, 24, 29, 34, 40, 46, 52,
58, 65, 72, 80, 87, 95, 103, 111, 119,};
int index;
void setup(){
//set digital pins 0-7 as outputs
for (int i=0;i<8;i++){
pinMode(i,OUTPUT);
}
//setup for interrupts
cli();
TCCR1A=0;
TCCR1B=0;//clean register
TCCR1B |=(1<<WGM12);//comparation mode
TCCR1B |=(1<<CS10);
TCCR1B |=(0<<CS11);
TCCR1B |=(0<<CS12);//clock/1
OCR1A=7;
TIMSK1 |=(1<<OCIE1A);//activamos comparación
sei();
}
void loop(){
}
//aqui lanzamos la tabla por el puerto D
ISR(TIMER1_COMPA_vect){
index=(index+1)%100;
PORTD=sine[index];
}
veo entonces que con este sistema tendré que bajar a los 500Hz o menos...va a ser que no me sirve...si me llevo por los datos que me da el simulador...
si fuera así, tengo que buscar otras opciones.