El AD9833 es un generador de bajo coste de señales sinusoidal, triangular y cuadrada con un rango de uso de 0Hz a 12,5 MHz Fácilmente programa con ayuda de un Arduino. La amplitud de las ondas sinusoidal y triangular está limitada a unos 600mV. La rectangular alcanza casi los 5v. La comunicación es SPI.
En el Sketch para Arduino, la entrada de la frecuencia requerida se realiza con un teclado de membrana que se conecta con un PCF8574 para reducir el cableado a I2c
Conforme vamos tecleando la frecuencia, esta se va generando en la salida. Con el botón * podemos borrar el último digito tecleado y con # borrar todo.
Con la tecla D pasamos sucesivamente por los tres tipos de onda.
Finalmente podemos hacer un Sweep. Tecleamos la frecuencia de partida y manteniendo pulsada A o B ira aumentando de 100Hz o 1000Hz hasta que soltemos la tecla. Muy útil para valorar la frecuencia de corte de filtros RC.
// Pins for SPI comm with the AD9833 IC #define DATA 11 ///< SPI Data pin number #define CLK 13 ///< SPI Clock pin number #define FSYNC 9 ///< SPI Load pin number (FSYNC in AD9833 usage)
MD_AD9833 AD(FSYNC); // Hardware SPI long f; int wave=0;
const uint8_t KEYPAD_ADDRESS = 0x20; //Direccion del PCF8574 I2CKeyPad keyPad(KEYPAD_ADDRESS); uint32_t value = 0;
void loop(void){ if (keyPad.isPressed()){ char c = handleKeyPadValue(value); if (value > 12500000) value = 12500000; //frecuencia máxima. Serial.print(value); Serial.println("\t"); delay(300); //Evita rebotes } AD.setFrequency(MD_AD9833::CHAN_0, value); }
// 0..9 Añade numeros -- * Elimina último digito -- # Borra todo -- D forma onda char handleKeyPadValue(uint32_t &value){ char v[19] = "123A456B789C*0#DNF"; // N = NoKey, F = Fail static uint8_t lastKey = 0; uint8_t idx = keyPad.getKey(); char c = v[idx]; if (lastKey != c){ lastKey = c; switch (c){ case '0' ... '9': value *= 10; value += c - '0'; lastKey=""; //para permitir repetir numero en entrada (6533) break; case '*': if (value > 0) value /= 10; lastKey=""; //para permitir repetir * break; case '#': value = 0; break; case 'D': //Tipo de onda wave += 1; Serial.println(wave); if (wave > 3) wave = 0; switch (wave) { case 0: AD.setMode(1); lastKey="";break; //Sinusoidal case 1: AD.setMode(4); lastKey="";break; //Triangular case 2: AD.setMode(2); lastKey="";break; //Cuadrada case 3: AD.setMode(0); lastKey="";break; //sin señal } break; case 'A': //Hace Sweep desde la frecuencia actual en saltos de 100Hz value += 100; lastKey=""; //para permitir repetir tecla break; case 'B': //Hace Sweep desde la frecuencia actual en saltos de 100Hz value += 1000; lastKey=""; //para permitir repetir tecla break; case 'C': // e.g. store value in EEPROM break; default: break; } } return c; }